From 95cf2b20bc6bed2c38e2e7894e45c10867680852 Mon Sep 17 00:00:00 2001 From: jialinsun Date: Wed, 16 Jul 2014 19:46:54 +0800 Subject: [PATCH] app linechart --- .../cat/build/ComponentsConfigurator.java | 10 +- .../cat/config/app/AppConfigManager.java | 10 +- .../cat/config/app/AppDataService.java | 205 +++++++++++------- .../resources/META-INF/plexus/components.xml | 12 + .../report/chart/AbstractGraphCreator.java | 2 +- .../dianping/cat/report/page/app/Handler.java | 19 +- .../page/app/graph/AppGraphCreator.java | 50 ++++- cat-home/src/main/webapp/jsp/report/app.jsp | 25 ++- 8 files changed, 229 insertions(+), 104 deletions(-) diff --git a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java index 23f71c1ad..a71389205 100644 --- a/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java +++ b/cat-core/src/main/java/com/dianping/cat/build/ComponentsConfigurator.java @@ -12,10 +12,12 @@ import com.dianping.cat.DomainManager; import com.dianping.cat.ServerConfigManager; import com.dianping.cat.analysis.DefaultMessageAnalyzerManager; import com.dianping.cat.analysis.MessageAnalyzerManager; +import com.dianping.cat.app.AppDataCommandDao; import com.dianping.cat.config.aggregation.AggregationConfigManager; import com.dianping.cat.config.aggregation.AggregationHandler; import com.dianping.cat.config.aggregation.DefaultAggregationHandler; import com.dianping.cat.config.app.AppConfigManager; +import com.dianping.cat.config.app.AppDataService; import com.dianping.cat.config.url.DefaultUrlPatternHandler; import com.dianping.cat.config.url.UrlPatternConfigManager; import com.dianping.cat.config.url.UrlPatternHandler; @@ -61,8 +63,10 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { all.add(C(AggregationHandler.class, DefaultAggregationHandler.class)); all.add(C(AggregationConfigManager.class).req(AggregationHandler.class, ConfigDao.class)); - - all.add(C(AppConfigManager.class).req( ConfigDao.class)); + + all.add(C(AppConfigManager.class).req(ConfigDao.class)); + + all.add(C(AppDataService.class).req(AppConfigManager.class, AppDataCommandDao.class)); all.add(C(UrlPatternHandler.class, DefaultUrlPatternHandler.class)); @@ -75,7 +79,7 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { .req(ServerConfigManager.class, MessagePathBuilder.class, ServerStatisticManager.class)); all.add(C(Module.class, CatCoreModule.ID, CatCoreModule.class)); - + all.addAll(new CatCoreDatabaseConfigurator().defineComponents()); all.addAll(new CodecComponentConfigurator().defineComponents()); all.addAll(new StorageComponentConfigurator().defineComponents()); diff --git a/cat-core/src/main/java/com/dianping/cat/config/app/AppConfigManager.java b/cat-core/src/main/java/com/dianping/cat/config/app/AppConfigManager.java index 6581470ea..69b317c95 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/app/AppConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/config/app/AppConfigManager.java @@ -3,6 +3,7 @@ package com.dianping.cat.config.app; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -106,7 +107,7 @@ public class AppConfigManager implements Initializable { if (c != null) { return c.getCodes().values(); } else { - return null; + return Collections.emptySet(); } } @@ -120,14 +121,13 @@ public class AppConfigManager implements Initializable { if (config != null) { return new ArrayList(config.getItems().values()); } else { - System.out.println(name); return new ArrayList(); } } - + public Map getCommands() { - return m_commands; - } + return m_commands; + } private void refreshCommand() { Collection commands = m_config.getCommands().values(); diff --git a/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java b/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java index 4c5294a5e..fef8278bb 100644 --- a/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java +++ b/cat-core/src/main/java/com/dianping/cat/config/app/AppDataService.java @@ -1,11 +1,14 @@ package com.dianping.cat.config.app; -import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Random; +import java.util.Map.Entry; import org.unidal.dal.jdbc.DalException; import org.unidal.lookup.annotation.Inject; @@ -14,72 +17,29 @@ import com.dianping.cat.Cat; import com.dianping.cat.app.AppDataCommand; import com.dianping.cat.app.AppDataCommandDao; import com.dianping.cat.app.AppDataCommandEntity; +import com.dianping.cat.configuration.app.entity.Code; public class AppDataService { @Inject private AppDataCommandDao m_dao; + @Inject + private AppConfigManager m_appConfigManager; + public static final String SUCCESS_RATIO = "successRatio"; public static final String REQUEST_COUNT = "requestCount"; public static final String DELAY_AVG = "delayAvg"; - public void insert() { - - } - - public Map queryAppValue(QueryEntity entity, String type) { - if (SUCCESS_RATIO.equals(type)) { - return querySuccessRatio(entity); - } else if (REQUEST_COUNT.equals(type)) { - return queryRequestCount(entity); - } else if (DELAY_AVG.equals(type)) { - return queryDelayAvg(entity); - } else { - return new LinkedHashMap(); - } - } - - private Map makeMockValue(String type) { - Map map = new LinkedHashMap(); - Calendar cal = Calendar.getInstance(); - - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - long startTime = cal.getTime().getTime(); - long current = System.currentTimeMillis(); - long endTime = current - current % 300000; - int n = (int) (endTime - startTime) / 300000; - double[] value = new double[n]; - - for (int i = 0; i < n; i++) { - value[i] = (new Random().nextDouble() + 1) * 100; - } - map.put(type, value); - return map; - } - - private Map querySuccessRatio(QueryEntity entity) { - - return makeMockValue(SUCCESS_RATIO); - } - - private Map queryDelayAvg(QueryEntity entity) { - - return makeMockValue(DELAY_AVG); - } + private static final int MAX_SIZE = 288; - private Map queryRequestCount(QueryEntity entity) { + public void insert() { - return makeMockValue(REQUEST_COUNT); } - public void queryAvg(QueryEntity entity) { + public Map queryValue(QueryEntity entity, String type) { int commandId = entity.getCommand(); Date period = entity.getDate(); int city = entity.getCity(); @@ -89,53 +49,142 @@ public class AppDataService { int connnectType = entity.getChannel(); int code = entity.getCode(); int platform = entity.getPlatfrom(); + List datas; try { - List datas = m_dao.findData(commandId, period, city, operator, network, appVersion, - connnectType, code, platform, AppDataCommandEntity.READSET_DATA); - - for (AppDataCommand data : datas) { - int minuteOrder = data.getMinuteOrder(); - long count = data.getAccessNumberSum(); - long sum = data.getResponseSumTimeSum(); - - double avg = sum / count; + datas = m_dao.findData(commandId, period, city, operator, network, appVersion, connnectType, code, platform, + AppDataCommandEntity.READSET_DATA); + + Collections.sort(datas, new Comparator() { + @Override + public int compare(AppDataCommand o1, AppDataCommand o2) { + return (int) (o2.getMinuteOrder() - o1.getMinuteOrder()); + } + }); + + int n = calculateSize(entity.getDate().getTime()); + + if (SUCCESS_RATIO.equals(type)) { + return querySuccessRatio(datas, n); + } else if (REQUEST_COUNT.equals(type)) { + return queryRequestCount(datas, n); + } else if (DELAY_AVG.equals(type)) { + return queryDelayAvg(datas, n); } } catch (DalException e) { Cat.logError(e); } + return new LinkedHashMap(); } - public static class Statistics { - private Date m_period; + private Map> convert2AppDataCommandMap(List fromDatas) { + Map> dataMap = new LinkedHashMap>(); - private long m_count; + for (AppDataCommand from : fromDatas) { + int minute = from.getMinuteOrder(); + List data = dataMap.get(minute); - private double m_avg; + if (data == null) { + data = new LinkedList(); - public Date getPeriod() { - return m_period; + dataMap.put(minute, data); + } + data.add(from); } + return dataMap; + } - public void setPeriod(Date period) { - m_period = period; - } + public Map querySuccessRatio(List datas, int n) { + Map values = new LinkedHashMap(); + double[] value = new double[n]; + int i = 0; - public long getCount() { - return m_count; + try { + Map> dataMap = convert2AppDataCommandMap(datas); + int size = dataMap.size(); + + if (size <= n) { + for (Entry> entry : dataMap.entrySet()) { + long success = 0; + long sum = 0; + + for (AppDataCommand data : entry.getValue()) { + long number = data.getAccessNumberSum(); + + if (isSuccessStatus(data)) { + success += number; + } + sum += number; + } + value[i++] = (double) success / sum; + } + } else { + Cat.logError(new RuntimeException("query database minute number " + size + " lagger than expected size " + + n)); + } + } catch (Exception e) { + Cat.logError(e); } - public void setCount(long count) { - m_count = count; + values.put(DELAY_AVG, value); + return values; + } + + private boolean isSuccessStatus(AppDataCommand data) { + int code = data.getCode(); + Collection codes = m_appConfigManager.queryCodeByCommand(data.getCommandId()); + + for (Code c : codes) { + if (c.getId() == code) { + return (c.getStatus() == 0); + } } + return false; + } - public double getAvg() { - return m_avg; + public Map queryRequestCount(List datas, int n) { + Map values = new LinkedHashMap(); + double[] value = new double[n]; + int i = 0; + + for (AppDataCommand data : datas) { + long count = data.getAccessNumberSum(); + + if (i < n) { + value[i++] = count; + } } + values.put(DELAY_AVG, value); + return values; + } + + public Map queryDelayAvg(List datas, int n) { + Map values = new LinkedHashMap(); + double[] value = new double[n]; + int i = 0; + + for (AppDataCommand data : datas) { + long count = data.getAccessNumberSum(); + long sum = data.getResponseSumTimeSum(); - public void setAvg(double avg) { - m_avg = avg; + double avg = sum / count; + if (i < n) { + value[i++] = avg; + } } + values.put(DELAY_AVG, value); + return values; } + private int calculateSize(long startTime) { + int n = MAX_SIZE; + int oneDay = 24 * 3600 * 1000; + + if (startTime + oneDay > System.currentTimeMillis()) { + long current = System.currentTimeMillis(); + long endTime = current - current % 300000; + n = (int) (endTime - startTime) / 300000; + } + return n; + } } diff --git a/cat-core/src/main/resources/META-INF/plexus/components.xml b/cat-core/src/main/resources/META-INF/plexus/components.xml index 61b0f6932..0993e27f1 100644 --- a/cat-core/src/main/resources/META-INF/plexus/components.xml +++ b/cat-core/src/main/resources/META-INF/plexus/components.xml @@ -88,6 +88,18 @@ + + com.dianping.cat.config.app.AppDataService + com.dianping.cat.config.app.AppDataService + + + com.dianping.cat.config.app.AppConfigManager + + + com.dianping.cat.app.AppDataCommandDao + + + com.dianping.cat.config.url.UrlPatternHandler com.dianping.cat.config.url.DefaultUrlPatternHandler diff --git a/cat-home/src/main/java/com/dianping/cat/report/chart/AbstractGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/chart/AbstractGraphCreator.java index ba93196a4..83f9875d3 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/chart/AbstractGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/chart/AbstractGraphCreator.java @@ -230,7 +230,7 @@ public abstract class AbstractGraphCreator implements LogEnabled { } } - protected Map buildNoneData(Date startDate, Date endDate, int step) { + public Map buildNoneData(Date startDate, Date endDate, int step) { int n = 0; long current = System.currentTimeMillis(); diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/app/Handler.java b/cat-home/src/main/java/com/dianping/cat/report/page/app/Handler.java index 2523c0f00..d38061896 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/app/Handler.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/app/Handler.java @@ -63,24 +63,25 @@ public class Handler implements PageHandler { LineChart lineCharts = new LineChart(); if (entity1 != null) { - LineChart lineChart1 = m_appGraphCreator.buildChartsByProductLine(entity1, type); - Iterator ititle = lineChart1.getSubTitles().iterator(); + LineChart lineChart1 = m_appGraphCreator.buildLineChart(entity1, type); Iterator> idata = lineChart1.getDatas().iterator(); - while (ititle.hasNext() && idata.hasNext()) { - lineCharts.add(ititle.next().toString(), idata.next()); + + if (lineChart1.getDatas().size() == 1) { + lineCharts.add("查询1", idata.next()); } } + if (entity2 != null) { - LineChart lineChart2 = m_appGraphCreator.buildChartsByProductLine(entity2, type); - Iterator ititle = lineChart2.getSubTitles().iterator(); + LineChart lineChart2 = m_appGraphCreator.buildLineChart(entity2, type); Iterator> idata = lineChart2.getDatas().iterator(); - while (ititle.hasNext() && idata.hasNext()) { - lineCharts.add(ititle.next().toString(), idata.next()); + + if (lineChart2.getDatas().size() == 1) { + lineCharts.add("查询2", idata.next()); } } + lineCharts.setId("app"); lineCharts.setHtmlTitle(type); - model.setLineChart(lineCharts); if (!ctx.isProcessStopped()) { diff --git a/cat-home/src/main/java/com/dianping/cat/report/page/app/graph/AppGraphCreator.java b/cat-home/src/main/java/com/dianping/cat/report/page/app/graph/AppGraphCreator.java index 14c9fea9f..9f2efc015 100644 --- a/cat-home/src/main/java/com/dianping/cat/report/page/app/graph/AppGraphCreator.java +++ b/cat-home/src/main/java/com/dianping/cat/report/page/app/graph/AppGraphCreator.java @@ -3,6 +3,7 @@ package com.dianping.cat.report.page.app.graph; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Random; import java.util.Map.Entry; import org.unidal.lookup.annotation.Inject; @@ -18,7 +19,7 @@ public class AppGraphCreator extends AbstractGraphCreator { @Inject private AppDataService m_appDataService; - public LineChart buildChartsByProductLine(QueryEntity queryEntity, String type) { + public LineChart buildLineChart(QueryEntity queryEntity, String type) { Map values = prepareAllData(queryEntity, type); long startTime = queryEntity.getDate().getTime(); @@ -30,7 +31,7 @@ public class AppGraphCreator extends AbstractGraphCreator { } private Map prepareAllData(QueryEntity queryEntity, String type) { - Map value = m_appDataService.queryAppValue(queryEntity, type); + Map value = new AppDataServiceMock().queryValue(queryEntity, type); return value; } @@ -65,4 +66,49 @@ public class AppGraphCreator extends AbstractGraphCreator { return map; } + + public class AppDataServiceMock extends AppDataService { + public Map queryValue(QueryEntity entity, String type) { + if (SUCCESS_RATIO.equals(type)) { + return querySuccessRatio(entity); + } else if (REQUEST_COUNT.equals(type)) { + return queryRequestCount(entity); + } else if (DELAY_AVG.equals(type)) { + return queryDelayAvg(entity); + } else { + return new LinkedHashMap(); + } + } + + private Map makeMockValue(String type) { + Map map = new LinkedHashMap(); + long startTime = TimeUtil.getCurrentDay().getTime(); + long current = System.currentTimeMillis(); + long endTime = current - current % 300000; + int n = (int) (endTime - startTime) / 300000; + double[] value = new double[n]; + + for (int i = 0; i < n; i++) { + value[i] = (new Random().nextDouble() + 1) * 100; + } + map.put(type, value); + return map; + } + + private Map querySuccessRatio(QueryEntity entity) { + + return makeMockValue(SUCCESS_RATIO); + } + + private Map queryDelayAvg(QueryEntity entity) { + + return makeMockValue(DELAY_AVG); + } + + private Map queryRequestCount(QueryEntity entity) { + + return makeMockValue(REQUEST_COUNT); + } + + } } diff --git a/cat-home/src/main/webapp/jsp/report/app.jsp b/cat-home/src/main/webapp/jsp/report/app.jsp index cebc5a260..bf9c813ba 100644 --- a/cat-home/src/main/webapp/jsp/report/app.jsp +++ b/cat-home/src/main/webapp/jsp/report/app.jsp @@ -32,7 +32,6 @@ var key = $("#command").val(); var value = commandInfo[key]; var code = document.getElementById("code"); - code.length = 0; for ( var prop in value) { var opt = $(' 渠道 平台 地区 运营商 + 返回码 网络类型 + 渠道 平台 地区 运营商 成功率 + name="typeCheckbox" value="successRatio" onclick="query()" >成功率 -- GitLab