提交 a4c443a8 编写于 作者: Y yong.you

add metric config

上级 6c9057a6
...@@ -69,7 +69,8 @@ ...@@ -69,7 +69,8 @@
${basedir}/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml, ${basedir}/src/main/resources/META-INF/dal/model/matrix-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/metric-report-manifest.xml, ${basedir}/src/main/resources/META-INF/dal/model/metric-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/health-report-manifest.xml, ${basedir}/src/main/resources/META-INF/dal/model/health-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/dependency-report-manifest.xml,</manifest> ${basedir}/src/main/resources/META-INF/dal/model/dependency-report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/metric-config-manifest.xml,</manifest>
</configuration> </configuration>
</execution> </execution>
<execution> <execution>
......
package com.dianping.cat.consumer.advanced;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
public class BussinessConfigManager implements Initializable {
// key is domain
private Map<String, Map<Integer, Map<String, BusinessConfig>>> m_configs = new ConcurrentHashMap<String, Map<Integer, Map<String, BusinessConfig>>>();
public Map<String, BusinessConfig> getUrlConfigs(String domain) {
return getMetricConfigsByType(domain, BusinessConfig.URL);
}
public Map<String, BusinessConfig> getMetricConfigs(String domain) {
return getMetricConfigsByType(domain, BusinessConfig.METRIC);
}
public List<BusinessConfig> getConfigs(List<String> domains) {
List<BusinessConfig> configs = new ArrayList<BusinessConfig>();
for (String domain : domains) {
Map<Integer, Map<String, BusinessConfig>> value = m_configs.get(domain);
if(value!=null){
for (Entry<Integer, Map<String, BusinessConfig>> internalEntry : value.entrySet()) {
configs.addAll(internalEntry.getValue().values());
}
}
}
Collections.sort(configs, new BusinessConfigCompator());
return configs;
}
private Map<String, BusinessConfig> getMetricConfigsByType(String domain, int type) {
Map<Integer, Map<String, BusinessConfig>> configMap = m_configs.get(domain);
if (configMap != null) {
Map<String, BusinessConfig> config = configMap.get(type);
if (config != null) {
return config;
}
}
return new HashMap<String, BusinessConfig>();
}
private BussinessConfigManager addConfig(BusinessConfig config) {
String domain = config.getDomain();
Map<Integer, Map<String, BusinessConfig>> configsMap = m_configs.get(domain);
if (configsMap == null) {
configsMap = new ConcurrentHashMap<Integer, Map<String, BusinessConfig>>();
m_configs.put(config.getDomain(), configsMap);
}
int type = config.getType();
Map<String, BusinessConfig> configs = configsMap.get(type);
if (configs == null) {
configs = new ConcurrentHashMap<String, BusinessConfig>();
configsMap.put(config.getType(), configs);
}
configs.put(config.getMainKey(), config);
return this;
}
@Override
public void initialize() throws InitializationException {
String TuanGouWeb = "TuanGouWeb";
String PayOrder = "PayOrder";
String Cat = "Cat";
BusinessConfig config = new BusinessConfig();
config.setDomain(Cat).setType(BusinessConfig.URL);
config.setViewOrder(1).setMainKey("t").setClassifications(null);
config.setTitle("Transaction").setShowCount(true).setShowAvg(true).setShowSum(true);
addConfig(config);
config = new BusinessConfig();
config.setDomain(Cat).setType(BusinessConfig.URL);
config.setViewOrder(2).setMainKey("e").setClassifications(null);
config.setTitle("Event").setShowCount(true).setShowAvg(false).setShowSum(false);
addConfig(config);
config = new BusinessConfig();
config.setDomain(Cat).setType(BusinessConfig.URL);
config.setViewOrder(3).setMainKey("home").setClassifications(null);
config.setTitle("Home").setShowCount(true).setShowAvg(false).setShowSum(false);
addConfig(config);
config = new BusinessConfig();
config.setDomain(TuanGouWeb).setType(BusinessConfig.URL);
config.setViewOrder(1).setMainKey("/index").setClassifications("channel");
config.setTitle(MetricTitle.INDEX).setShowCount(true).setShowAvg(false).setShowSum(false);
addConfig(config);
config = new BusinessConfig();
config.setDomain(TuanGouWeb).setType(BusinessConfig.URL);
config.setViewOrder(2).setMainKey("/detail").setClassifications("channel");
config.setTitle(MetricTitle.DETAIL).setShowCount(true).setShowAvg(false).setShowSum(false);
addConfig(config);
config = new BusinessConfig();
config.setDomain(PayOrder).setType(BusinessConfig.URL);
config.setViewOrder(3).setMainKey("/order/submitOrder").setClassifications("channel");
config.setTitle(MetricTitle.PAY).setShowCount(true).setShowAvg(false).setShowSum(false);
addConfig(config);
config = new BusinessConfig();
config.setDomain(PayOrder).setType(BusinessConfig.METRIC);
config.setViewOrder(4).setMainKey("order").setClassifications("channel").setTarget("quantity");
config.setTitle(MetricTitle.ORDER).setShowCount(true).setShowAvg(false).setShowSum(false);
addConfig(config);
config = new BusinessConfig();
config.setDomain(PayOrder).setType(BusinessConfig.METRIC);
config.setViewOrder(5).setMainKey("payment.pending").setClassifications("channel").setTarget("amount");
config.setTitle(MetricTitle.SUCCESS).setShowCount(false).setShowAvg(false).setShowSum(false);
addConfig(config);
config = new BusinessConfig();
config.setDomain(PayOrder).setType(BusinessConfig.METRIC);
config.setViewOrder(6).setMainKey("payment.success").setClassifications("channel").setTarget("amount");
config.setTitle(MetricTitle.SUCCESS).setShowCount(false).setShowAvg(false).setShowSum(true);
addConfig(config);
}
public static class BusinessConfigCompator implements Comparator<BusinessConfig> {
@Override
public int compare(BusinessConfig o1, BusinessConfig o2) {
return o1.getViewOrder() - o2.getViewOrder();
}
}
public static class BusinessConfig {
public static final int URL = 1;
public static final int METRIC = 2;
public static final String Suffix_SUM = "(总和)";
public static final String Suffix_COUNT = "(次数)";
public static final String Suffix_AVG = "(平均)";
private String m_domain;
private int m_type;
private int m_viewOrder;
private String m_mainKey;
private String m_target;
private String m_classifications;
private String m_title;
private boolean m_showSum;
private boolean m_showCount;
private boolean m_showAvg;
public String getTarget() {
return m_target;
}
public BusinessConfig setTarget(String target) {
m_target = target;
return this;
}
public String getClassifications() {
return m_classifications;
}
public String getDomain() {
return m_domain;
}
public String getMainKey() {
return m_mainKey;
}
public String getTitle() {
return m_title;
}
public int getType() {
return m_type;
}
public int getViewOrder() {
return m_viewOrder;
}
public boolean isShowAvg() {
return m_showAvg;
}
public boolean isShowCount() {
return m_showCount;
}
public boolean isShowSum() {
return m_showSum;
}
public BusinessConfig setClassifications(String childKeys) {
m_classifications = childKeys;
return this;
}
public BusinessConfig setDomain(String domain) {
m_domain = domain;
return this;
}
public BusinessConfig setMainKey(String mainKey) {
m_mainKey = mainKey;
return this;
}
public BusinessConfig setShowAvg(boolean showAvg) {
m_showAvg = showAvg;
return this;
}
public BusinessConfig setShowCount(boolean showCount) {
m_showCount = showCount;
return this;
}
public BusinessConfig setShowSum(boolean showSum) {
m_showSum = showSum;
return this;
}
public BusinessConfig setTitle(String title) {
m_title = title;
return this;
}
public BusinessConfig setType(int type) {
m_type = type;
return this;
}
public BusinessConfig setViewOrder(int viewOrder) {
m_viewOrder = viewOrder;
return this;
}
}
public class MetricTitle {
public static final String INDEX = "团购首页";
public static final String DETAIL = "团购详情";
public static final String PAY = "支付页面";
public static final String ORDER = "订单创建";
public static final String SUCCESS = "支付金额(单位:元)";
}
}
...@@ -15,9 +15,9 @@ import org.unidal.tuple.Pair; ...@@ -15,9 +15,9 @@ import org.unidal.tuple.Pair;
import com.dianping.cat.Cat; import com.dianping.cat.Cat;
import com.dianping.cat.CatConstants; import com.dianping.cat.CatConstants;
import com.dianping.cat.abtest.spi.internal.ABTestCodec; import com.dianping.cat.abtest.spi.internal.ABTestCodec;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.configuration.NetworkInterfaceManager; import com.dianping.cat.configuration.NetworkInterfaceManager;
import com.dianping.cat.consumer.AbstractMessageAnalyzer; import com.dianping.cat.consumer.AbstractMessageAnalyzer;
import com.dianping.cat.consumer.advanced.BussinessConfigManager.BusinessConfig;
import com.dianping.cat.consumer.advanced.dal.BusinessReport; import com.dianping.cat.consumer.advanced.dal.BusinessReport;
import com.dianping.cat.consumer.advanced.dal.BusinessReportDao; import com.dianping.cat.consumer.advanced.dal.BusinessReportDao;
import com.dianping.cat.consumer.core.ProductLineConfigManager; import com.dianping.cat.consumer.core.ProductLineConfigManager;
...@@ -47,7 +47,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem ...@@ -47,7 +47,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
private BusinessReportDao m_businessReportDao; private BusinessReportDao m_businessReportDao;
@Inject @Inject
private BussinessConfigManager m_configManager; private MetricConfigManager m_configManager;
@Inject @Inject
private ProductLineConfigManager m_productLineConfigManager; private ProductLineConfigManager m_productLineConfigManager;
...@@ -119,8 +119,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem ...@@ -119,8 +119,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
if (message instanceof Event) { if (message instanceof Event) {
if ("URL".equals(message.getType()) && "ABTest".equals(message.getName())) { if ("URL".equals(message.getType()) && "ABTest".equals(message.getName())) {
String data = (String) message.getData(); String data = (String) message.getData();
System.out.println(data);
return data; return data;
} }
} }
...@@ -168,7 +167,8 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem ...@@ -168,7 +167,8 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
String name = metric.getName(); String name = metric.getName();
String domain = tree.getDomain(); String domain = tree.getDomain();
String data = (String) metric.getData(); String data = (String) metric.getData();
Pair<Integer, Double> value = parseValue(metric.getStatus(), data); String status = metric.getStatus();
Pair<Integer, Double> value = parseValue(status, data);
if (value != null) { if (value != null) {
long current = metric.getTimestamp() / 1000 / 60; long current = metric.getTimestamp() / 1000 / 60;
...@@ -176,7 +176,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem ...@@ -176,7 +176,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
MetricItem metricItem = report.findOrCreateMetricItem(name); MetricItem metricItem = report.findOrCreateMetricItem(name);
Map<String, String> abtests = parseABTests(type); Map<String, String> abtests = parseABTests(type);
metricItem.addDomain(domain); metricItem.addDomain(domain).setType(status);
updateMetric(metricItem, abtests, min, value.getKey(), value.getValue()); updateMetric(metricItem, abtests, min, value.getKey(), value.getValue());
} }
return 0; return 0;
...@@ -229,10 +229,8 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem ...@@ -229,10 +229,8 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
if (CatConstants.TYPE_URL.equals(type)) { if (CatConstants.TYPE_URL.equals(type)) {
String name = transaction.getName(); String name = transaction.getName();
String domain = tree.getDomain(); String domain = tree.getDomain();
Map<String, BusinessConfig> configs = m_configManager.getUrlConfigs(domain); MetricItemConfig config = m_configManager.queryMetricItemConfig(domain + ":" + name);
BusinessConfig config = null;
config = configs.get(name);
if (config != null) { if (config != null) {
long current = transaction.getTimestamp() / 1000 / 60; long current = transaction.getTimestamp() / 1000 / 60;
int min = (int) (current % (60)); int min = (int) (current % (60));
...@@ -240,7 +238,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem ...@@ -240,7 +238,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
MetricItem metricItem = report.findOrCreateMetricItem(name); MetricItem metricItem = report.findOrCreateMetricItem(name);
Map<String, String> abtests = parseABtests(transaction); Map<String, String> abtests = parseABtests(transaction);
metricItem.addDomain(domain); metricItem.addDomain(domain).setType("C");
updateMetric(metricItem, abtests, min, 1, sum); updateMetric(metricItem, abtests, min, 1, sum);
} }
} }
......
package com.dianping.cat.consumer.advanced;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.dal.jdbc.DalException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.helper.Files;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import org.xml.sax.SAXException;
import com.dianping.cat.Cat;
import com.dianping.cat.advanced.metric.config.entity.MetricConfig;
import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.advanced.metric.config.transform.DefaultSaxParser;
import com.dianping.cat.consumer.core.config.Config;
import com.dianping.cat.consumer.core.config.ConfigDao;
import com.dianping.cat.consumer.core.config.ConfigEntity;
public class MetricConfigManager implements Initializable, LogEnabled {
@Inject
private ConfigDao m_configDao;
private int m_configId;
private MetricConfig m_metricConfig;
private long m_modifyTime;
private Logger m_logger;
private static final String CONFIG_NAME = "metricConfig";
public MetricConfig getMetricConfig() {
synchronized (m_metricConfig) {
return m_metricConfig;
}
}
public boolean insertMetricItemConfig(MetricItemConfig config){
getMetricConfig().addMetricItemConfig(config);
return storeConfig();
}
public MetricItemConfig queryMetricItemConfig(String id) {
return getMetricConfig().findMetricItemConfig(id);
}
public List<MetricItemConfig> queryMetricItemConfig(Set<String> domains) {
List<MetricItemConfig> configs = new ArrayList<MetricItemConfig>();
Map<String, MetricItemConfig> metricConfig = getMetricConfig().getMetricItemConfigs();
for (Entry<String, MetricItemConfig> entry : metricConfig.entrySet()) {
MetricItemConfig item = entry.getValue();
if (domains.contains(item.getDomain())) {
configs.add(item);
}
}
return configs;
}
public boolean deleteDomainConfig(String domain) {
getMetricConfig().removeMetricItemConfig(domain);
return storeConfig();
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
@Override
public void initialize() throws InitializationException {
try {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
String content = config.getContent();
m_metricConfig = DefaultSaxParser.parse(content);
m_configId = config.getId();
m_modifyTime = config.getModifyDate().getTime();
} catch (DalNotFoundException e) {
try {
String content = Files.forIO().readFrom(
this.getClass().getResourceAsStream("/config/default-metric-config.xml"), "utf-8");
Config config = m_configDao.createLocal();
config.setName(CONFIG_NAME);
config.setContent(content);
m_configDao.insert(config);
m_metricConfig = DefaultSaxParser.parse(content);
m_configId = config.getId();
m_modifyTime = config.getModifyDate().getTime();
} catch (Exception ex) {
Cat.logError(ex);
}
} catch (Exception e) {
Cat.logError(e);
}
if (getMetricConfig() == null) {
m_metricConfig = new MetricConfig();
}
}
private void refreshMetricConfig() throws DalException, SAXException, IOException {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
long modifyTime = config.getModifyDate().getTime();
if (modifyTime > m_modifyTime) {
String content = config.getContent();
synchronized (getMetricConfig()) {
m_metricConfig = DefaultSaxParser.parse(content);
}
m_modifyTime = modifyTime;
m_logger.info("metric config refresh done!");
}
}
private boolean storeConfig() {
try {
Config config = m_configDao.createLocal();
config.setId(m_configId);
config.setKeyId(m_configId);
config.setName(CONFIG_NAME);
config.setContent(getMetricConfig().toString());
m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL);
} catch (Exception e) {
Cat.logError(e);
return false;
}
return true;
}
public class Reload implements Task {
@Override
public String getName() {
return "Metric-Config-Reload";
}
@Override
public void run() {
boolean active = true;
while (active) {
try {
refreshMetricConfig();
} catch (Exception e) {
Cat.logError(e);
}
try {
Thread.sleep(60 * 1000L);
} catch (InterruptedException e) {
active = false;
}
}
}
@Override
public void shutdown() {
}
}
}
...@@ -13,17 +13,18 @@ import com.dianping.cat.configuration.ServerConfigManager; ...@@ -13,17 +13,18 @@ import com.dianping.cat.configuration.ServerConfigManager;
import com.dianping.cat.consumer.CatConsumerAdvancedModule; import com.dianping.cat.consumer.CatConsumerAdvancedModule;
import com.dianping.cat.consumer.DomainManager; import com.dianping.cat.consumer.DomainManager;
import com.dianping.cat.consumer.MessageAnalyzer; import com.dianping.cat.consumer.MessageAnalyzer;
import com.dianping.cat.consumer.advanced.BussinessConfigManager;
import com.dianping.cat.consumer.advanced.CrossAnalyzer; import com.dianping.cat.consumer.advanced.CrossAnalyzer;
import com.dianping.cat.consumer.advanced.DatabaseAnalyzer; import com.dianping.cat.consumer.advanced.DatabaseAnalyzer;
import com.dianping.cat.consumer.advanced.DatabaseParser; import com.dianping.cat.consumer.advanced.DatabaseParser;
import com.dianping.cat.consumer.advanced.DependencyAnalyzer; import com.dianping.cat.consumer.advanced.DependencyAnalyzer;
import com.dianping.cat.consumer.advanced.MatrixAnalyzer; import com.dianping.cat.consumer.advanced.MatrixAnalyzer;
import com.dianping.cat.consumer.advanced.MetricAnalyzer; import com.dianping.cat.consumer.advanced.MetricAnalyzer;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.advanced.SqlAnalyzer; import com.dianping.cat.consumer.advanced.SqlAnalyzer;
import com.dianping.cat.consumer.advanced.dal.BusinessReportDao; import com.dianping.cat.consumer.advanced.dal.BusinessReportDao;
import com.dianping.cat.consumer.advanced.dal.SqltableDao; import com.dianping.cat.consumer.advanced.dal.SqltableDao;
import com.dianping.cat.consumer.core.ProductLineConfigManager; import com.dianping.cat.consumer.core.ProductLineConfigManager;
import com.dianping.cat.consumer.core.config.ConfigDao;
import com.dianping.cat.consumer.core.dal.HostinfoDao; import com.dianping.cat.consumer.core.dal.HostinfoDao;
import com.dianping.cat.consumer.core.dal.ReportDao; import com.dianping.cat.consumer.core.dal.ReportDao;
import com.dianping.cat.consumer.core.dal.TaskDao; import com.dianping.cat.consumer.core.dal.TaskDao;
...@@ -35,7 +36,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { ...@@ -35,7 +36,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
public List<Component> defineComponents() { public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>(); List<Component> all = new ArrayList<Component>();
all.add(C(BussinessConfigManager.class)); all.add(C(MetricConfigManager.class).req(ConfigDao.class));
all.add(C(DomainManager.class, DomainManager.class).req(ServerConfigManager.class, HostinfoDao.class)); all.add(C(DomainManager.class, DomainManager.class).req(ServerConfigManager.class, HostinfoDao.class));
...@@ -59,7 +60,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { ...@@ -59,7 +60,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(BucketManager.class, ReportDao.class, TaskDao.class, DomainManager.class, DatabaseParser.class)); .req(BucketManager.class, ReportDao.class, TaskDao.class, DomainManager.class, DatabaseParser.class));
all.add(C(MessageAnalyzer.class, MetricAnalyzer.ID, MetricAnalyzer.class).is(PER_LOOKUP) // all.add(C(MessageAnalyzer.class, MetricAnalyzer.ID, MetricAnalyzer.class).is(PER_LOOKUP) //
.req(BucketManager.class, BusinessReportDao.class, BussinessConfigManager.class)// .req(BucketManager.class, BusinessReportDao.class, MetricConfigManager.class)//
.req(ProductLineConfigManager.class, ABTestCodec.class)); .req(ProductLineConfigManager.class, ABTestCodec.class));
all.add(C(Module.class, CatConsumerAdvancedModule.ID, CatConsumerAdvancedModule.class)); all.add(C(Module.class, CatConsumerAdvancedModule.ID, CatConsumerAdvancedModule.class));
......
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="metric-config" root="true">
<entity-ref name="metric-item-config" type="list" names="metric-item-configs" />
</entity>
<entity name="metric-item-config">
<attribute name="id" value-type="String" />
<attribute name="domain" value-type="String" />
<attribute name="type" value-type="String" />
<attribute name="view-order" value-type="int" />
<attribute name="metric-key" value-type="String" />
<attribute name="title" value-type="String" />
<attribute name="show-count" value-type="boolean" />
<attribute name="show-avg" value-type="boolean" />
<attribute name="show-sum" value-type="boolean" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="metric-config-codegen.xml" />
<file path="metric-config-model.xml" />
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.advanced.metric.config" enable-merger="true" enable-sax-parser="true">
<entity name="metric-config" root="true">
<entity-ref name="metric-item-config" type="map" names="metric-item-configs" method-find-or-create="true"/>
</entity>
<entity name="metric-item-config">
<attribute name="id" value-type="String" key="true"/>
<attribute name="domain" value-type="String" />
<attribute name="type" value-type="String" />
<attribute name="view-order" value-type="int" primative="true"/>
<attribute name="metric-key" value-type="String" />
<attribute name="title" value-type="String" />
<attribute name="show-count" value-type="boolean" primative="true"/>
<attribute name="show-avg" value-type="boolean" primative="true"/>
<attribute name="show-sum" value-type="boolean" primative="true"/>
</entity>
</model>
\ No newline at end of file
<plexus> <plexus>
<components> <components>
<component> <component>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role> <role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
<implementation>com.dianping.cat.consumer.advanced.BussinessConfigManager</implementation> <implementation>com.dianping.cat.consumer.advanced.MetricConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.consumer.core.config.ConfigDao</role>
</requirement>
</requirements>
</component> </component>
<component> <component>
<role>com.dianping.cat.consumer.DomainManager</role> <role>com.dianping.cat.consumer.DomainManager</role>
...@@ -133,7 +138,7 @@ ...@@ -133,7 +138,7 @@
<role>com.dianping.cat.consumer.advanced.dal.BusinessReportDao</role> <role>com.dianping.cat.consumer.advanced.dal.BusinessReportDao</role>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role> <role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.consumer.core.ProductLineConfigManager</role> <role>com.dianping.cat.consumer.core.ProductLineConfigManager</role>
......
...@@ -6,4 +6,7 @@ ...@@ -6,4 +6,7 @@
<model package="com.dianping.cat.advanced.metric-report" name="metric-report"> <model package="com.dianping.cat.advanced.metric-report" name="metric-report">
<sample-model>src/test/resources/com/dianping/cat/consumer/model/metric-report.xml</sample-model> <sample-model>src/test/resources/com/dianping/cat/consumer/model/metric-report.xml</sample-model>
</model> </model>
<model package="com.dianping.cat.advanced.metric-config" name="metric-config">
<sample-model>src/test/resources/com/dianping/cat/consumer/model/metric-config.xml</sample-model>
</model>
</wizard> </wizard>
<metric-config>
<metric-item-config id="/detail" domain="TuanGouWeb" type="URL" view-order="1" metric-key="/order/submitOrder" title="支付页面"
show-count="true" show-avg="true" show-sum="true"></metric-item-config>
<metric-item-config></metric-item-config>
</metric-config>
package com.dianping.cat.consumer.core; package com.dianping.cat.consumer.core;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
...@@ -14,10 +15,12 @@ import org.codehaus.plexus.logging.LogEnabled; ...@@ -14,10 +15,12 @@ import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.dal.jdbc.DalException;
import org.unidal.dal.jdbc.DalNotFoundException; import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.helper.Files; import org.unidal.helper.Files;
import org.unidal.helper.Threads.Task; import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Inject;
import org.xml.sax.SAXException;
import com.dianping.cat.Cat; import com.dianping.cat.Cat;
import com.dianping.cat.consumer.company.model.entity.Company; import com.dianping.cat.consumer.company.model.entity.Company;
...@@ -177,11 +180,28 @@ public class ProductLineConfigManager implements Initializable, LogEnabled { ...@@ -177,11 +180,28 @@ public class ProductLineConfigManager implements Initializable, LogEnabled {
return result; return result;
} }
private void refreshProductLineConfig() throws DalException, SAXException, IOException {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
long modifyTime = config.getModifyDate().getTime();
if (modifyTime > m_modifyTime) {
String content = config.getContent();
synchronized (getCompany()) {
m_company = DefaultSaxParser.parse(content);
}
m_modifyTime = modifyTime;
m_logger.info("product line config refresh done!");
}
}
public class Reload implements Task { public class Reload implements Task {
@Override @Override
public String getName() { public String getName() {
return null; return "Product-Config-Reload";
} }
@Override @Override
...@@ -189,19 +209,7 @@ public class ProductLineConfigManager implements Initializable, LogEnabled { ...@@ -189,19 +209,7 @@ public class ProductLineConfigManager implements Initializable, LogEnabled {
boolean active = true; boolean active = true;
while (active) { while (active) {
try { try {
Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL); refreshProductLineConfig();
long modifyTime = config.getModifyDate().getTime();
if (modifyTime > m_modifyTime) {
String content = config.getContent();
synchronized (getCompany()) {
m_company = DefaultSaxParser.parse(content);
}
m_modifyTime = modifyTime;
m_logger.info("product line config refresh done!");
}
} catch (Exception e) { } catch (Exception e) {
Cat.logError(e); Cat.logError(e);
} }
...@@ -213,7 +221,7 @@ public class ProductLineConfigManager implements Initializable, LogEnabled { ...@@ -213,7 +221,7 @@ public class ProductLineConfigManager implements Initializable, LogEnabled {
} }
} }
} }
@Override @Override
public void shutdown() { public void shutdown() {
} }
......
...@@ -33,5 +33,11 @@ public class CatString { ...@@ -33,5 +33,11 @@ public class CatString {
public static final String FAIL = "Fail"; public static final String FAIL = "Fail";
public static final String TUAN_TOU = "TuanGou"; public static final String TUAN_TOU = "TuanGou";
public static final String SUM = ":和";
public static final String COUNT = ":次数";
public static final String AVG = ":平均";
} }
...@@ -20,7 +20,7 @@ public class LineChart { ...@@ -20,7 +20,7 @@ public class LineChart {
private List<String> subTitles = new ArrayList<String>(); private List<String> subTitles = new ArrayList<String>();
private String titles; private String title;
private List<double[]> values = new ArrayList<double[]>(); private List<double[]> values = new ArrayList<double[]>();
...@@ -56,8 +56,8 @@ public class LineChart { ...@@ -56,8 +56,8 @@ public class LineChart {
return this.subTitles; return this.subTitles;
} }
public String getTitles() { public String getTitle() {
return this.titles; return this.title;
} }
public List<double[]> getValues() { public List<double[]> getValues() {
...@@ -83,8 +83,8 @@ public class LineChart { ...@@ -83,8 +83,8 @@ public class LineChart {
return this; return this;
} }
public LineChart setTitles(String titles) { public LineChart setTitle(String title) {
this.titles = titles; this.title = title;
return this; return this;
} }
......
...@@ -49,7 +49,7 @@ public class LineGraphBuilder extends BaseVisitor { ...@@ -49,7 +49,7 @@ public class LineGraphBuilder extends BaseVisitor {
result.setSize(60); result.setSize(60);
result.setStep(TimeUtil.ONE_MINUTE); result.setStep(TimeUtil.ONE_MINUTE);
result.setTitles(title); result.setTitle(title);
result.setStart(m_start); result.setStart(m_start);
if (items != null) { if (items != null) {
for (Entry<String, Item> entry : items.entrySet()) { for (Entry<String, Item> entry : items.entrySet()) {
......
...@@ -50,7 +50,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{ ...@@ -50,7 +50,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start); item.setStart(start);
item.setSize(size); item.setSize(size);
item.setStep(step); item.setStep(step);
item.setTitles(name + " Error (count)"); item.setTitle(name + " Error (count)");
for (Map<String, double[]> data : datas) { for (Map<String, double[]> data : datas) {
item.addValue(data.get("failure_count")); item.addValue(data.get("failure_count"));
...@@ -145,7 +145,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{ ...@@ -145,7 +145,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start); item.setStart(start);
item.setSize(size); item.setSize(size);
item.setStep(step); item.setStep(step);
item.setTitles(name + " Hits (count)"); item.setTitle(name + " Hits (count)");
for (Map<String, double[]> data : datas) { for (Map<String, double[]> data : datas) {
double[] totalCount = data.get("total_count"); double[] totalCount = data.get("total_count");
......
...@@ -32,7 +32,7 @@ public class HistoryGraphs { ...@@ -32,7 +32,7 @@ public class HistoryGraphs {
} }
int day = (int) ((end.getTime() - start.getTime()) / TimeUtil.ONE_DAY); int day = (int) ((end.getTime() - start.getTime()) / TimeUtil.ONE_DAY);
LineChart item = new LineChart(); LineChart item = new LineChart();
item.setStart(start).setSize(day).setTitles(key).addSubTitle(key).setStep(TimeUtil.ONE_DAY); item.setStart(start).setSize(day).setTitle(key).addSubTitle(key).setStep(TimeUtil.ONE_DAY);
item.addValue(getDateFromReports(reports, day, key)); item.addValue(getDateFromReports(reports, day, key));
return item; return item;
} }
...@@ -44,7 +44,7 @@ public class HistoryGraphs { ...@@ -44,7 +44,7 @@ public class HistoryGraphs {
reports.add(report); reports.add(report);
} }
LineChart item = new LineChart(); LineChart item = new LineChart();
item.setStart(start).setSize(24).setTitles(key).addSubTitle(key).setStep(TimeUtil.ONE_HOUR); item.setStart(start).setSize(24).setTitle(key).addSubTitle(key).setStep(TimeUtil.ONE_HOUR);
item.addValue(getDateFromReports(reports, 24, key)); item.addValue(getDateFromReports(reports, 24, key));
return item; return item;
} }
......
...@@ -96,7 +96,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{ ...@@ -96,7 +96,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
LineChart item = new LineChart(); LineChart item = new LineChart();
item.setStart(start); item.setStart(start);
item.setSize(size); item.setSize(size);
item.setTitles(title); item.setTitle(title);
item.addSubTitle(title); item.addSubTitle(title);
item.setStep(TimeUtil.ONE_MINUTE); item.setStep(TimeUtil.ONE_MINUTE);
double[] activeThread = graphData.get(key); double[] activeThread = graphData.get(key);
......
...@@ -2,6 +2,7 @@ package com.dianping.cat.report.page.metric; ...@@ -2,6 +2,7 @@ package com.dianping.cat.report.page.metric;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List; import java.util.List;
import javax.servlet.ServletException; import javax.servlet.ServletException;
...@@ -12,7 +13,8 @@ import org.unidal.web.mvc.annotation.InboundActionMeta; ...@@ -12,7 +13,8 @@ import org.unidal.web.mvc.annotation.InboundActionMeta;
import org.unidal.web.mvc.annotation.OutboundActionMeta; import org.unidal.web.mvc.annotation.OutboundActionMeta;
import org.unidal.web.mvc.annotation.PayloadMeta; import org.unidal.web.mvc.annotation.PayloadMeta;
import com.dianping.cat.consumer.advanced.BussinessConfigManager; import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.advanced.MetricConfigManager;
import com.dianping.cat.consumer.core.ProductLineConfigManager; import com.dianping.cat.consumer.core.ProductLineConfigManager;
import com.dianping.cat.consumer.metric.model.entity.MetricReport; import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.report.ReportPage; import com.dianping.cat.report.ReportPage;
...@@ -32,7 +34,7 @@ public class Handler implements PageHandler<Context> { ...@@ -32,7 +34,7 @@ public class Handler implements PageHandler<Context> {
private PayloadNormalizer m_normalizePayload; private PayloadNormalizer m_normalizePayload;
@Inject @Inject
private BussinessConfigManager m_configManager; private MetricConfigManager m_configManager;
@Inject @Inject
private ProductLineConfigManager m_productLineConfigManager; private ProductLineConfigManager m_productLineConfigManager;
...@@ -78,7 +80,9 @@ public class Handler implements PageHandler<Context> { ...@@ -78,7 +80,9 @@ public class Handler implements PageHandler<Context> {
} }
String product = payload.getProduct(); String product = payload.getProduct();
List<String> domains = m_productLineConfigManager.queryProductLineDomains(product); List<String> domains = m_productLineConfigManager.queryProductLineDomains(product);
MetricDisplay display = new MetricDisplay(m_configManager.getConfigs(domains), test, startTime); List<MetricItemConfig> domainSet=m_configManager.queryMetricItemConfig(new HashSet<String>(domains));
MetricDisplay display = new MetricDisplay(domainSet,
test, startTime);
display.visitMetricReport(report); display.visitMetricReport(report);
model.setDisplay(display); model.setDisplay(display);
......
...@@ -8,17 +8,23 @@ import java.util.Map; ...@@ -8,17 +8,23 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import com.dianping.cat.consumer.advanced.BussinessConfigManager.BusinessConfig; import com.dianping.cat.advanced.metric.config.entity.MetricItemConfig;
import com.dianping.cat.consumer.metric.model.entity.Abtest; import com.dianping.cat.consumer.metric.model.entity.Abtest;
import com.dianping.cat.consumer.metric.model.entity.Group; import com.dianping.cat.consumer.metric.model.entity.Group;
import com.dianping.cat.consumer.metric.model.entity.MetricItem; import com.dianping.cat.consumer.metric.model.entity.MetricItem;
import com.dianping.cat.consumer.metric.model.entity.MetricReport; import com.dianping.cat.consumer.metric.model.entity.MetricReport;
import com.dianping.cat.consumer.metric.model.entity.Point; import com.dianping.cat.consumer.metric.model.entity.Point;
import com.dianping.cat.consumer.metric.model.transform.BaseVisitor; import com.dianping.cat.consumer.metric.model.transform.BaseVisitor;
import com.dianping.cat.helper.CatString;
import com.dianping.cat.helper.TimeUtil; import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.page.LineChart; import com.dianping.cat.report.page.LineChart;
public class MetricDisplay extends BaseVisitor { public class MetricDisplay extends BaseVisitor {
public static final String Suffix_SUM = "(总和)";
public static final String Suffix_COUNT = "(次数)";
public static final String Suffix_AVG = "(平均)";
private Map<String, LineChart> m_lineCharts = new LinkedHashMap<String, LineChart>(); private Map<String, LineChart> m_lineCharts = new LinkedHashMap<String, LineChart>();
...@@ -30,11 +36,13 @@ public class MetricDisplay extends BaseVisitor { ...@@ -30,11 +36,13 @@ public class MetricDisplay extends BaseVisitor {
private String m_metricKey; private String m_metricKey;
private static final String SUM = ":sum"; private String m_currentComputeType;
private static final String SUM = CatString.SUM;
private static final String COUNT = ":count"; private static final String COUNT = CatString.COUNT;
private static final String AVG = "avg"; private static final String AVG = CatString.AVG;
public List<LineChart> getLineCharts() { public List<LineChart> getLineCharts() {
return new ArrayList<LineChart>(m_lineCharts.values()); return new ArrayList<LineChart>(m_lineCharts.values());
...@@ -44,34 +52,33 @@ public class MetricDisplay extends BaseVisitor { ...@@ -44,34 +52,33 @@ public class MetricDisplay extends BaseVisitor {
return m_abtests; return m_abtests;
} }
public MetricDisplay(List<BusinessConfig> configs, String abtest, Date start) { public MetricDisplay(List<MetricItemConfig> configs, String abtest, Date start) {
m_start = start; m_start = start;
m_abtest = abtest; m_abtest = abtest;
for (BusinessConfig flag : configs) { for (MetricItemConfig config : configs) {
if (flag.isShowSum()) { if (config.isShowSum()) {
String key = flag.getMainKey() + SUM; String key = config.getMetricKey() + SUM;
m_lineCharts.put(key, creatLineChart(key)); m_lineCharts.put(key, creatLineChart(config.getTitle() + Suffix_SUM));
} }
if (flag.isShowCount()) { if (config.isShowCount()) {
String key = flag.getMainKey() + COUNT; String key = config.getMetricKey() + COUNT;
m_lineCharts.put(key, creatLineChart(key));
m_lineCharts.put(key, creatLineChart(config.getTitle() + Suffix_COUNT));
} }
if (flag.isShowAvg()) { if (config.isShowAvg()) {
String key = flag.getMainKey() + AVG; String key = config.getMetricKey() + AVG;
m_lineCharts.put(key, creatLineChart(key)); m_lineCharts.put(key, creatLineChart(config.getTitle() + Suffix_AVG));
} }
} }
} }
private LineChart creatLineChart(String key) { private LineChart creatLineChart(String title) {
LineChart lineChart = new LineChart(); LineChart lineChart = new LineChart();
lineChart.setTitles(key); lineChart.setTitle(title);
lineChart.setStart(m_start); lineChart.setStart(m_start);
lineChart.setSize(60); lineChart.setSize(60);
lineChart.setStep(TimeUtil.ONE_MINUTE); lineChart.setStep(TimeUtil.ONE_MINUTE);
...@@ -88,6 +95,33 @@ public class MetricDisplay extends BaseVisitor { ...@@ -88,6 +95,33 @@ public class MetricDisplay extends BaseVisitor {
} }
} }
private LineChart findOrCreateChart(String type, String metricKey, String computeType) {
String key = metricKey + computeType;
LineChart chart = m_lineCharts.get(key);
if (chart == null) {
if (computeType.equals(COUNT)) {
if (type.equals("C") || type.equals("S,C")) {
chart = creatLineChart(key);
}
} else if (computeType.equals(AVG)) {
if (type.equals("T")) {
chart = creatLineChart(key);
}
} else if (computeType.equals(SUM)) {
if (type.equals("S") || type.equals("S,C")) {
chart = creatLineChart(key);
}
}
if (chart != null) {
m_lineCharts.put(key, chart);
}
}
return chart;
}
@Override @Override
public void visitGroup(Group group) { public void visitGroup(Group group) {
String id = group.getName(); String id = group.getName();
...@@ -107,19 +141,19 @@ public class MetricDisplay extends BaseVisitor { ...@@ -107,19 +141,19 @@ public class MetricDisplay extends BaseVisitor {
count[index] = point.getCount(); count[index] = point.getCount();
} }
LineChart sumLine = m_lineCharts.get(m_metricKey + SUM); LineChart sumLine = findOrCreateChart(m_currentComputeType, m_metricKey, SUM);
if (sumLine != null) { if (sumLine != null) {
sumLine.addSubTitle(id); sumLine.addSubTitle(id);
sumLine.addValue(sum); sumLine.addValue(sum);
} }
LineChart countLine = m_lineCharts.get(m_metricKey + COUNT); LineChart countLine = findOrCreateChart(m_currentComputeType, m_metricKey, COUNT);
if (countLine != null) { if (countLine != null) {
countLine.addSubTitle(id); countLine.addSubTitle(id);
countLine.addValue(count); countLine.addValue(count);
} }
LineChart avgLine = m_lineCharts.get(m_metricKey + AVG); LineChart avgLine = findOrCreateChart(m_currentComputeType, m_metricKey, AVG);
if (avgLine != null) { if (avgLine != null) {
avgLine.addSubTitle(id); avgLine.addSubTitle(id);
...@@ -130,6 +164,7 @@ public class MetricDisplay extends BaseVisitor { ...@@ -130,6 +164,7 @@ public class MetricDisplay extends BaseVisitor {
@Override @Override
public void visitMetricItem(MetricItem metricItem) { public void visitMetricItem(MetricItem metricItem) {
m_metricKey = metricItem.getId(); m_metricKey = metricItem.getId();
m_currentComputeType = metricItem.getType();
super.visitMetricItem(metricItem); super.visitMetricItem(metricItem);
} }
......
...@@ -40,7 +40,7 @@ public class StateGraphs { ...@@ -40,7 +40,7 @@ public class StateGraphs {
int day = (int) ((end.getTime() - start.getTime()) / TimeUtil.ONE_HOUR); int day = (int) ((end.getTime() - start.getTime()) / TimeUtil.ONE_HOUR);
LineChart item = new LineChart(); LineChart item = new LineChart();
item.setStart(start).setSize(day).setTitles(key).setStep(TimeUtil.ONE_HOUR); item.setStart(start).setSize(day).setTitle(key).setStep(TimeUtil.ONE_HOUR);
item.addSubTitle(key); item.addSubTitle(key);
item.addValue(getDataFromHourlySummary(reports, start.getTime(), day, key, ip)); item.addValue(getDataFromHourlySummary(reports, start.getTime(), day, key, ip));
return item; return item;
...@@ -137,7 +137,7 @@ public class StateGraphs { ...@@ -137,7 +137,7 @@ public class StateGraphs {
String ip) { String ip) {
LineChart item = new LineChart(); LineChart item = new LineChart();
item.setStart(start).setSize(60).setTitles(key).setStep(TimeUtil.ONE_MINUTE); item.setStart(start).setSize(60).setTitle(key).setStep(TimeUtil.ONE_MINUTE);
item.addSubTitle(key); item.addSubTitle(key);
item.addValue(getDataFromHourlyDetail(report, start.getTime(), 60, key, ip)); item.addValue(getDataFromHourlyDetail(report, start.getTime(), 60, key, ip));
return item; return item;
......
...@@ -53,7 +53,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{ ...@@ -53,7 +53,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start); item.setStart(start);
item.setSize(size); item.setSize(size);
item.setStep(step); item.setStep(step);
item.setTitles(name + " Response Time (ms)"); item.setTitle(name + " Response Time (ms)");
for (Map<String, double[]> data : datas) { for (Map<String, double[]> data : datas) {
double[] sum = data.get("sum"); double[] sum = data.get("sum");
...@@ -78,7 +78,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{ ...@@ -78,7 +78,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start); item.setStart(start);
item.setSize(size); item.setSize(size);
item.setStep(step); item.setStep(step);
item.setTitles(name + " Error (count)"); item.setTitle(name + " Error (count)");
for (Map<String, double[]> data : datas) { for (Map<String, double[]> data : datas) {
item.addValue(data.get("failure_count")); item.addValue(data.get("failure_count"));
...@@ -194,7 +194,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{ ...@@ -194,7 +194,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start); item.setStart(start);
item.setSize(size); item.setSize(size);
item.setStep(step); item.setStep(step);
item.setTitles(name + " Hits (count)"); item.setTitle(name + " Hits (count)");
for (Map<String, double[]> data : datas) { for (Map<String, double[]> data : datas) {
double[] totalCount = data.get("total_count"); double[] totalCount = data.get("total_count");
......
...@@ -2650,7 +2650,7 @@ ...@@ -2650,7 +2650,7 @@
<role>com.dianping.cat.report.page.PayloadNormalizer</role> <role>com.dianping.cat.report.page.PayloadNormalizer</role>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role> <role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.consumer.core.ProductLineConfigManager</role> <role>com.dianping.cat.consumer.core.ProductLineConfigManager</role>
...@@ -2667,8 +2667,13 @@ ...@@ -2667,8 +2667,13 @@
</requirements> </requirements>
</component> </component>
<component> <component>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role> <role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
<implementation>com.dianping.cat.consumer.advanced.BussinessConfigManager</implementation> <implementation>com.dianping.cat.consumer.advanced.MetricConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.consumer.core.config.ConfigDao</role>
</requirement>
</requirements>
</component> </component>
<component> <component>
<role>com.dianping.cat.consumer.core.ProductLineConfigManager</role> <role>com.dianping.cat.consumer.core.ProductLineConfigManager</role>
......
<metric-config>
<metric-item-config id="TuanGouWeb:/index" domain="TuanGouWeb" type="URL" view-order="1" metric-key="/index" title="团购首页" show-count="true" show-avg="false" show-sum="false"></metric-item-config>
<metric-item-config id="TuanGouWeb:/detail" domain="TuanGouWeb" type="URL" view-order="1" metric-key="/detail" title="团购详情" show-count="true" show-avg="false" show-sum="false"></metric-item-config>
<metric-item-config id="TuanGouWeb:/order/submitOrder" domain="PayOrder" type="URL" view-order="1" metric-key="/index" title="团购支付" show-count="true" show-avg="false" show-sum="false"></metric-item-config>
<metric-item-config id="Cat:t" domain="Cat" type="URL" view-order="1" metric-key="t" title="transaction" show-count="true" show-avg="false" show-sum="false"></metric-item-config>
<metric-item-config id="Cat:home" domain="Cat" type="URL" view-order="1" metric-key="home" title="home" show-count="true" show-avg="false" show-sum="false"></metric-item-config>
</metric-config>
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
$(document).ready(function() { $(document).ready(function() {
<c:forEach var="item" items="${model.display.lineCharts}" varStatus="status"> <c:forEach var="item" items="${model.display.lineCharts}" varStatus="status">
var data = ${item.jsonString}; var data = ${item.jsonString};
graphLineChart(document.getElementById('${item.titles}'), data); graphLineChart(document.getElementById('${item.title}'), data);
</c:forEach> </c:forEach>
var product = '${payload.product}'; var product = '${payload.product}';
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
<td class="title">&nbsp;&nbsp;From ${w:format(model.report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(model.report.endTime,'yyyy-MM-dd HH:mm:ss')}</td> <td class="title">&nbsp;&nbsp;From ${w:format(model.report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(model.report.endTime,'yyyy-MM-dd HH:mm:ss')}</td>
<td class="nav"> <td class="nav">
<c:forEach var="nav" items="${model.navs}"> <c:forEach var="nav" items="${model.navs}">
&nbsp;[ <a href="${model.baseUri}?date=${model.date}&step=${nav.hours}&product=${payload.product}&${navUrlPrefix}">${nav.title}</a> ]&nbsp; &nbsp;[ <a href="${model.baseUri}?date=${model.date}&domain=${model.domain}&step=${nav.hours}&product=${payload.product}&${navUrlPrefix}">${nav.title}</a> ]&nbsp;
</c:forEach> </c:forEach>
&nbsp;[ <a href="${model.baseUri}?${navUrlPrefix}">now</a> ]&nbsp; &nbsp;[ <a href="${model.baseUri}?${navUrlPrefix}">now</a> ]&nbsp;
</td> </td>
...@@ -46,11 +46,11 @@ ...@@ -46,11 +46,11 @@
<div class="well sidebar-nav"> <div class="well sidebar-nav">
<ul class="nav nav-list"> <ul class="nav nav-list">
<c:forEach var="item" items="${model.products}" varStatus="status"> <c:forEach var="item" items="${model.products}" varStatus="status">
<li class='nav-header' id="${item}"><a href="?date=${model.date}&product=${item}"><strong>${item}</strong></a></li> <li class='nav-header' id="${item}"><a href="?date=${model.date}&domain=${model.domain}&product=${item}"><strong>${item}</strong></a></li>
<c:if test="${payload.product eq item }"> <c:if test="${payload.product eq item }">
<c:forEach var="item" items="${model.display.abtests}" varStatus="status"> <c:forEach var="item" items="${model.display.abtests}" varStatus="status">
<c:if test="${item ne -1}"> <c:if test="${item ne -1}">
<li id="${item}"><a href="?date=${model.date}&product=${payload.product}&test=${item}">AB测试${item}</a></li> <li id="${item}"><a href="?date=${model.date}&domain=${model.domain}&product=${payload.product}&test=${item}">AB测试${item}</a></li>
</c:if> </c:if>
</c:forEach> </c:forEach>
</c:if> </c:if>
...@@ -62,7 +62,10 @@ ...@@ -62,7 +62,10 @@
</div><!--/span--> </div><!--/span-->
<div class="span10"> <div class="span10">
<c:forEach var="item" items="${model.display.lineCharts}" varStatus="status"> <c:forEach var="item" items="${model.display.lineCharts}" varStatus="status">
<div style="float:left;" id="${item.titles}" class="graph"></div> <div style="float:left;">
<h5 class="text-center text-error">${item.title}</h5>
<div id="${item.title}" class="graph"></div>
</div>
</c:forEach> </c:forEach>
</div> </div>
<table class="footer"> <table class="footer">
......
...@@ -17,44 +17,45 @@ public class TestABTestBusinessMessage { ...@@ -17,44 +17,45 @@ public class TestABTestBusinessMessage {
@Test @Test
public void test() throws Exception { public void test() throws Exception {
for (int i = 0; i < 1000; i++) { while (true) {
Transaction t = Cat.newTransaction("URL", "/index"); for (int i = 0; i < 1000; i++) {
String abtest = buildAbStr(i); Transaction t = Cat.newTransaction("URL", "/index");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest); Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(TuanGou); DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
t.complete(); tree.setDomain(TuanGou);
} t.complete();
for (int i = 0; i < 800; i++) { }
Transaction t = Cat.newTransaction("URL", "/detail"); for (int i = 0; i < 800; i++) {
String abtest = buildAbStr(i); Transaction t = Cat.newTransaction("URL", "/detail");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest); Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(TuanGou); DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
t.complete(); tree.setDomain(TuanGou);
} t.complete();
}
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
Transaction t = Cat.newTransaction("URL", "/order/submitOrder"); Transaction t = Cat.newTransaction("URL", "/order/submitOrder");
String abtest = buildAbStr(i); String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest); Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest); ((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
Cat.logMetricForCount("order"); Cat.logMetricForCount("order");
Cat.logMetricForSum("payment.success", i); Cat.logMetricForDuration("time", 500);
Cat.logMetricForSum("payment.success", i);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(PayOrder); DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
t.complete(); tree.setDomain(PayOrder);
} t.complete();
}
Thread.sleep(1000); Thread.sleep(1000);
}
} }
......
...@@ -16,7 +16,6 @@ public class TestBusinessMessage { ...@@ -16,7 +16,6 @@ public class TestBusinessMessage {
@Test @Test
public void test() throws Exception { public void test() throws Exception {
while (true) { while (true) {
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
Transaction t = Cat.newTransaction("URL", "/index"); Transaction t = Cat.newTransaction("URL", "/index");
Cat.logEvent("RemoteLink", "sina", Event.SUCCESS, "http://sina.com.cn/"); Cat.logEvent("RemoteLink", "sina", Event.SUCCESS, "http://sina.com.cn/");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册