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

add metric config

上级 6c9057a6
......@@ -69,7 +69,8 @@
${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/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>
</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;
import com.dianping.cat.Cat;
import com.dianping.cat.CatConstants;
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.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.BusinessReportDao;
import com.dianping.cat.consumer.core.ProductLineConfigManager;
......@@ -47,7 +47,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
private BusinessReportDao m_businessReportDao;
@Inject
private BussinessConfigManager m_configManager;
private MetricConfigManager m_configManager;
@Inject
private ProductLineConfigManager m_productLineConfigManager;
......@@ -119,8 +119,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
if (message instanceof Event) {
if ("URL".equals(message.getType()) && "ABTest".equals(message.getName())) {
String data = (String) message.getData();
System.out.println(data);
return data;
}
}
......@@ -168,7 +167,8 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
String name = metric.getName();
String domain = tree.getDomain();
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) {
long current = metric.getTimestamp() / 1000 / 60;
......@@ -176,7 +176,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
MetricItem metricItem = report.findOrCreateMetricItem(name);
Map<String, String> abtests = parseABTests(type);
metricItem.addDomain(domain);
metricItem.addDomain(domain).setType(status);
updateMetric(metricItem, abtests, min, value.getKey(), value.getValue());
}
return 0;
......@@ -229,10 +229,8 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
if (CatConstants.TYPE_URL.equals(type)) {
String name = transaction.getName();
String domain = tree.getDomain();
Map<String, BusinessConfig> configs = m_configManager.getUrlConfigs(domain);
BusinessConfig config = null;
MetricItemConfig config = m_configManager.queryMetricItemConfig(domain + ":" + name);
config = configs.get(name);
if (config != null) {
long current = transaction.getTimestamp() / 1000 / 60;
int min = (int) (current % (60));
......@@ -240,7 +238,7 @@ public class MetricAnalyzer extends AbstractMessageAnalyzer<MetricReport> implem
MetricItem metricItem = report.findOrCreateMetricItem(name);
Map<String, String> abtests = parseABtests(transaction);
metricItem.addDomain(domain);
metricItem.addDomain(domain).setType("C");
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;
import com.dianping.cat.consumer.CatConsumerAdvancedModule;
import com.dianping.cat.consumer.DomainManager;
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.DatabaseAnalyzer;
import com.dianping.cat.consumer.advanced.DatabaseParser;
import com.dianping.cat.consumer.advanced.DependencyAnalyzer;
import com.dianping.cat.consumer.advanced.MatrixAnalyzer;
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.dal.BusinessReportDao;
import com.dianping.cat.consumer.advanced.dal.SqltableDao;
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.ReportDao;
import com.dianping.cat.consumer.core.dal.TaskDao;
......@@ -35,7 +36,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
public List<Component> defineComponents() {
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));
......@@ -59,7 +60,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(BucketManager.class, ReportDao.class, TaskDao.class, DomainManager.class, DatabaseParser.class));
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));
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>
<components>
<component>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role>
<implementation>com.dianping.cat.consumer.advanced.BussinessConfigManager</implementation>
<role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
<implementation>com.dianping.cat.consumer.advanced.MetricConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.consumer.core.config.ConfigDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.DomainManager</role>
......@@ -133,7 +138,7 @@
<role>com.dianping.cat.consumer.advanced.dal.BusinessReportDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role>
<role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.core.ProductLineConfigManager</role>
......
......@@ -6,4 +6,7 @@
<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>
</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>
<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;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
......@@ -14,10 +15,12 @@ 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.consumer.company.model.entity.Company;
......@@ -177,11 +180,28 @@ public class ProductLineConfigManager implements Initializable, LogEnabled {
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 {
@Override
public String getName() {
return null;
return "Product-Config-Reload";
}
@Override
......@@ -189,19 +209,7 @@ public class ProductLineConfigManager implements Initializable, LogEnabled {
boolean active = true;
while (active) {
try {
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!");
}
refreshProductLineConfig();
} catch (Exception e) {
Cat.logError(e);
}
......@@ -213,7 +221,7 @@ public class ProductLineConfigManager implements Initializable, LogEnabled {
}
}
}
@Override
public void shutdown() {
}
......
......@@ -33,5 +33,11 @@ public class CatString {
public static final String FAIL = "Fail";
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 {
private List<String> subTitles = new ArrayList<String>();
private String titles;
private String title;
private List<double[]> values = new ArrayList<double[]>();
......@@ -56,8 +56,8 @@ public class LineChart {
return this.subTitles;
}
public String getTitles() {
return this.titles;
public String getTitle() {
return this.title;
}
public List<double[]> getValues() {
......@@ -83,8 +83,8 @@ public class LineChart {
return this;
}
public LineChart setTitles(String titles) {
this.titles = titles;
public LineChart setTitle(String title) {
this.title = title;
return this;
}
......
......@@ -49,7 +49,7 @@ public class LineGraphBuilder extends BaseVisitor {
result.setSize(60);
result.setStep(TimeUtil.ONE_MINUTE);
result.setTitles(title);
result.setTitle(title);
result.setStart(m_start);
if (items != null) {
for (Entry<String, Item> entry : items.entrySet()) {
......
......@@ -50,7 +50,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start);
item.setSize(size);
item.setStep(step);
item.setTitles(name + " Error (count)");
item.setTitle(name + " Error (count)");
for (Map<String, double[]> data : datas) {
item.addValue(data.get("failure_count"));
......@@ -145,7 +145,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start);
item.setSize(size);
item.setStep(step);
item.setTitles(name + " Hits (count)");
item.setTitle(name + " Hits (count)");
for (Map<String, double[]> data : datas) {
double[] totalCount = data.get("total_count");
......
......@@ -32,7 +32,7 @@ public class HistoryGraphs {
}
int day = (int) ((end.getTime() - start.getTime()) / TimeUtil.ONE_DAY);
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));
return item;
}
......@@ -44,7 +44,7 @@ public class HistoryGraphs {
reports.add(report);
}
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));
return item;
}
......
......@@ -96,7 +96,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
LineChart item = new LineChart();
item.setStart(start);
item.setSize(size);
item.setTitles(title);
item.setTitle(title);
item.addSubTitle(title);
item.setStep(TimeUtil.ONE_MINUTE);
double[] activeThread = graphData.get(key);
......
......@@ -2,6 +2,7 @@ package com.dianping.cat.report.page.metric;
import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import javax.servlet.ServletException;
......@@ -12,7 +13,8 @@ import org.unidal.web.mvc.annotation.InboundActionMeta;
import org.unidal.web.mvc.annotation.OutboundActionMeta;
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.metric.model.entity.MetricReport;
import com.dianping.cat.report.ReportPage;
......@@ -32,7 +34,7 @@ public class Handler implements PageHandler<Context> {
private PayloadNormalizer m_normalizePayload;
@Inject
private BussinessConfigManager m_configManager;
private MetricConfigManager m_configManager;
@Inject
private ProductLineConfigManager m_productLineConfigManager;
......@@ -78,7 +80,9 @@ public class Handler implements PageHandler<Context> {
}
String product = payload.getProduct();
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);
model.setDisplay(display);
......
......@@ -8,17 +8,23 @@ import java.util.Map;
import java.util.Set;
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.Group;
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.Point;
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.report.page.LineChart;
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>();
......@@ -30,11 +36,13 @@ public class MetricDisplay extends BaseVisitor {
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() {
return new ArrayList<LineChart>(m_lineCharts.values());
......@@ -44,34 +52,33 @@ public class MetricDisplay extends BaseVisitor {
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_abtest = abtest;
for (BusinessConfig flag : configs) {
if (flag.isShowSum()) {
String key = flag.getMainKey() + SUM;
for (MetricItemConfig config : configs) {
if (config.isShowSum()) {
String key = config.getMetricKey() + SUM;
m_lineCharts.put(key, creatLineChart(key));
m_lineCharts.put(key, creatLineChart(config.getTitle() + Suffix_SUM));
}
if (flag.isShowCount()) {
String key = flag.getMainKey() + COUNT;
m_lineCharts.put(key, creatLineChart(key));
if (config.isShowCount()) {
String key = config.getMetricKey() + COUNT;
m_lineCharts.put(key, creatLineChart(config.getTitle() + Suffix_COUNT));
}
if (flag.isShowAvg()) {
String key = flag.getMainKey() + AVG;
if (config.isShowAvg()) {
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.setTitles(key);
lineChart.setTitle(title);
lineChart.setStart(m_start);
lineChart.setSize(60);
lineChart.setStep(TimeUtil.ONE_MINUTE);
......@@ -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
public void visitGroup(Group group) {
String id = group.getName();
......@@ -107,19 +141,19 @@ public class MetricDisplay extends BaseVisitor {
count[index] = point.getCount();
}
LineChart sumLine = m_lineCharts.get(m_metricKey + SUM);
LineChart sumLine = findOrCreateChart(m_currentComputeType, m_metricKey, SUM);
if (sumLine != null) {
sumLine.addSubTitle(id);
sumLine.addValue(sum);
}
LineChart countLine = m_lineCharts.get(m_metricKey + COUNT);
LineChart countLine = findOrCreateChart(m_currentComputeType, m_metricKey, COUNT);
if (countLine != null) {
countLine.addSubTitle(id);
countLine.addValue(count);
}
LineChart avgLine = m_lineCharts.get(m_metricKey + AVG);
LineChart avgLine = findOrCreateChart(m_currentComputeType, m_metricKey, AVG);
if (avgLine != null) {
avgLine.addSubTitle(id);
......@@ -130,6 +164,7 @@ public class MetricDisplay extends BaseVisitor {
@Override
public void visitMetricItem(MetricItem metricItem) {
m_metricKey = metricItem.getId();
m_currentComputeType = metricItem.getType();
super.visitMetricItem(metricItem);
}
......
......@@ -40,7 +40,7 @@ public class StateGraphs {
int day = (int) ((end.getTime() - start.getTime()) / TimeUtil.ONE_HOUR);
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.addValue(getDataFromHourlySummary(reports, start.getTime(), day, key, ip));
return item;
......@@ -137,7 +137,7 @@ public class StateGraphs {
String ip) {
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.addValue(getDataFromHourlyDetail(report, start.getTime(), 60, key, ip));
return item;
......
......@@ -53,7 +53,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start);
item.setSize(size);
item.setStep(step);
item.setTitles(name + " Response Time (ms)");
item.setTitle(name + " Response Time (ms)");
for (Map<String, double[]> data : datas) {
double[] sum = data.get("sum");
......@@ -78,7 +78,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start);
item.setSize(size);
item.setStep(step);
item.setTitles(name + " Error (count)");
item.setTitle(name + " Error (count)");
for (Map<String, double[]> data : datas) {
item.addValue(data.get("failure_count"));
......@@ -194,7 +194,7 @@ public class HistoryGraphs extends BaseHistoryGraphs{
item.setStart(start);
item.setSize(size);
item.setStep(step);
item.setTitles(name + " Hits (count)");
item.setTitle(name + " Hits (count)");
for (Map<String, double[]> data : datas) {
double[] totalCount = data.get("total_count");
......
......@@ -2650,7 +2650,7 @@
<role>com.dianping.cat.report.page.PayloadNormalizer</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role>
<role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.core.ProductLineConfigManager</role>
......@@ -2667,8 +2667,13 @@
</requirements>
</component>
<component>
<role>com.dianping.cat.consumer.advanced.BussinessConfigManager</role>
<implementation>com.dianping.cat.consumer.advanced.BussinessConfigManager</implementation>
<role>com.dianping.cat.consumer.advanced.MetricConfigManager</role>
<implementation>com.dianping.cat.consumer.advanced.MetricConfigManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.consumer.core.config.ConfigDao</role>
</requirement>
</requirements>
</component>
<component>
<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 @@
$(document).ready(function() {
<c:forEach var="item" items="${model.display.lineCharts}" varStatus="status">
var data = ${item.jsonString};
graphLineChart(document.getElementById('${item.titles}'), data);
graphLineChart(document.getElementById('${item.title}'), data);
</c:forEach>
var product = '${payload.product}';
......@@ -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="nav">
<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>
&nbsp;[ <a href="${model.baseUri}?${navUrlPrefix}">now</a> ]&nbsp;
</td>
......@@ -46,11 +46,11 @@
<div class="well sidebar-nav">
<ul class="nav nav-list">
<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:forEach var="item" items="${model.display.abtests}" varStatus="status">
<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:forEach>
</c:if>
......@@ -62,7 +62,10 @@
</div><!--/span-->
<div class="span10">
<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>
</div>
<table class="footer">
......
......@@ -17,44 +17,45 @@ public class TestABTestBusinessMessage {
@Test
public void test() throws Exception {
for (int i = 0; i < 1000; i++) {
Transaction t = Cat.newTransaction("URL", "/index");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(TuanGou);
t.complete();
}
for (int i = 0; i < 800; i++) {
Transaction t = Cat.newTransaction("URL", "/detail");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(TuanGou);
t.complete();
}
for (int i = 0; i < 500; i++) {
Transaction t = Cat.newTransaction("URL", "/order/submitOrder");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
Cat.logMetricForCount("order");
Cat.logMetricForSum("payment.success", i);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(PayOrder);
t.complete();
}
Thread.sleep(1000);
while (true) {
for (int i = 0; i < 1000; i++) {
Transaction t = Cat.newTransaction("URL", "/index");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(TuanGou);
t.complete();
}
for (int i = 0; i < 800; i++) {
Transaction t = Cat.newTransaction("URL", "/detail");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(TuanGou);
t.complete();
}
for (int i = 0; i < 500; i++) {
Transaction t = Cat.newTransaction("URL", "/order/submitOrder");
String abtest = buildAbStr(i);
Cat.logEvent("URL", "ABTest", Event.SUCCESS, abtest);
((DefaultMessageManager) Cat.getManager()).setMetricType(abtest);
Cat.logMetricForCount("order");
Cat.logMetricForDuration("time", 500);
Cat.logMetricForSum("payment.success", i);
DefaultMessageTree tree = (DefaultMessageTree) Cat.getManager().getThreadLocalMessageTree();
tree.setDomain(PayOrder);
t.complete();
}
Thread.sleep(1000);
}
}
......
......@@ -16,7 +16,6 @@ public class TestBusinessMessage {
@Test
public void test() throws Exception {
while (true) {
for (int i = 0; i < 1000; i++) {
Transaction t = Cat.newTransaction("URL", "/index");
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.
先完成此消息的编辑!
想要评论请 注册