提交 95cf2b20 编写于 作者: J jialinsun

app linechart

上级 4a0609ae
......@@ -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());
......
......@@ -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<Item>(config.getItems().values());
} else {
System.out.println(name);
return new ArrayList<Item>();
}
}
public Map<String, Integer> getCommands() {
return m_commands;
}
return m_commands;
}
private void refreshCommand() {
Collection<Command> commands = m_config.getCommands().values();
......
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<String, double[]> 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<String, double[]>();
}
}
private Map<String, double[]> makeMockValue(String type) {
Map<String, double[]> map = new LinkedHashMap<String, double[]>();
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<String, double[]> querySuccessRatio(QueryEntity entity) {
return makeMockValue(SUCCESS_RATIO);
}
private Map<String, double[]> queryDelayAvg(QueryEntity entity) {
return makeMockValue(DELAY_AVG);
}
private static final int MAX_SIZE = 288;
private Map<String, double[]> queryRequestCount(QueryEntity entity) {
public void insert() {
return makeMockValue(REQUEST_COUNT);
}
public void queryAvg(QueryEntity entity) {
public Map<String, double[]> 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<AppDataCommand> datas;
try {
List<AppDataCommand> 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<AppDataCommand>() {
@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<String, double[]>();
}
public static class Statistics {
private Date m_period;
private Map<Integer, List<AppDataCommand>> convert2AppDataCommandMap(List<AppDataCommand> fromDatas) {
Map<Integer, List<AppDataCommand>> dataMap = new LinkedHashMap<Integer, List<AppDataCommand>>();
private long m_count;
for (AppDataCommand from : fromDatas) {
int minute = from.getMinuteOrder();
List<AppDataCommand> data = dataMap.get(minute);
private double m_avg;
if (data == null) {
data = new LinkedList<AppDataCommand>();
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<String, double[]> querySuccessRatio(List<AppDataCommand> datas, int n) {
Map<String, double[]> values = new LinkedHashMap<String, double[]>();
double[] value = new double[n];
int i = 0;
public long getCount() {
return m_count;
try {
Map<Integer, List<AppDataCommand>> dataMap = convert2AppDataCommandMap(datas);
int size = dataMap.size();
if (size <= n) {
for (Entry<Integer, List<AppDataCommand>> 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<Code> 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<String, double[]> queryRequestCount(List<AppDataCommand> datas, int n) {
Map<String, double[]> values = new LinkedHashMap<String, double[]>();
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<String, double[]> queryDelayAvg(List<AppDataCommand> datas, int n) {
Map<String, double[]> values = new LinkedHashMap<String, double[]>();
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;
}
}
......@@ -88,6 +88,18 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.config.app.AppDataService</role>
<implementation>com.dianping.cat.config.app.AppDataService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.config.app.AppConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.app.AppDataCommandDao</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.config.url.UrlPatternHandler</role>
<implementation>com.dianping.cat.config.url.DefaultUrlPatternHandler</implementation>
......
......@@ -230,7 +230,7 @@ public abstract class AbstractGraphCreator implements LogEnabled {
}
}
protected Map<Long, Double> buildNoneData(Date startDate, Date endDate, int step) {
public Map<Long, Double> buildNoneData(Date startDate, Date endDate, int step) {
int n = 0;
long current = System.currentTimeMillis();
......
......@@ -63,24 +63,25 @@ public class Handler implements PageHandler<Context> {
LineChart lineCharts = new LineChart();
if (entity1 != null) {
LineChart lineChart1 = m_appGraphCreator.buildChartsByProductLine(entity1, type);
Iterator<String> ititle = lineChart1.getSubTitles().iterator();
LineChart lineChart1 = m_appGraphCreator.buildLineChart(entity1, type);
Iterator<Map<Long, Double>> 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<String> ititle = lineChart2.getSubTitles().iterator();
LineChart lineChart2 = m_appGraphCreator.buildLineChart(entity2, type);
Iterator<Map<Long, Double>> 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()) {
......
......@@ -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<String, double[]> values = prepareAllData(queryEntity, type);
long startTime = queryEntity.getDate().getTime();
......@@ -30,7 +31,7 @@ public class AppGraphCreator extends AbstractGraphCreator {
}
private Map<String, double[]> prepareAllData(QueryEntity queryEntity, String type) {
Map<String, double[]> value = m_appDataService.queryAppValue(queryEntity, type);
Map<String, double[]> 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<String, double[]> 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<String, double[]>();
}
}
private Map<String, double[]> makeMockValue(String type) {
Map<String, double[]> map = new LinkedHashMap<String, double[]>();
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<String, double[]> querySuccessRatio(QueryEntity entity) {
return makeMockValue(SUCCESS_RATIO);
}
private Map<String, double[]> queryDelayAvg(QueryEntity entity) {
return makeMockValue(DELAY_AVG);
}
private Map<String, double[]> queryRequestCount(QueryEntity entity) {
return makeMockValue(REQUEST_COUNT);
}
}
}
......@@ -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 = $('<option />');
......@@ -45,7 +44,6 @@
var key = $("#command2").val();
var value = commandInfo[key];
var code = document.getElementById("code2");
code.length = 0;
for ( var prop in value) {
var opt = $('<option />');
......@@ -190,11 +188,13 @@
data-date-icon="icon-calendar"> </i>
</span>
</div> 命令字 <select id="command" style="width: 350px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.commands}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 返回码 <select id="code" style="width: 120px;">
</select> 返回码 <select id="code" style="width: 120px;"><option value='0' >All</option>
</select> 网络类型 <select id="network" style="width: 80px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.networks}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
......@@ -203,23 +203,28 @@
</tr>
<tr>
<th align=left>版本 <select id="version" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.versions}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 渠道 <select id="channel" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.channels}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 平台 <select id="platform" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.platforms}"
varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 地区 <select id="city" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.cities}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 运营商 <select id="operator" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.operators}"
varStatus="status">
<option value='${item.id}'>${item.name}</option>
......@@ -243,11 +248,14 @@
data-date-icon="icon-calendar"> </i>
</span>
</div> 命令字 <select id="command2" style="width: 350px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.commands}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 返回码 <select id="code2" style="width: 120px;">
<option value='0' >All</option>
</select> 网络类型 <select id="network2" style="width: 80px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.networks}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
......@@ -256,23 +264,28 @@
</tr>
<tr>
<th align=left>版本 <select id="version2" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.versions}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 渠道 <select id="channel2" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.channels}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 平台 <select id="platform2" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.platforms}"
varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 地区 <select id="city2" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.cities}" varStatus="status">
<option value='${item.id}'>${item.name}</option>
</c:forEach>
</select> 运营商 <select id="operator2" style="width: 100px;">
<option value='0' >All</option>
<c:forEach var="item" items="${model.operators}"
varStatus="status">
<option value='${item.id}'>${item.name}</option>
......@@ -284,11 +297,11 @@
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-info"> <input type="radio"
name="typeCheckbox" value="successRatio">成功率
name="typeCheckbox" value="successRatio" onclick="query()" >成功率
</label> <label class="btn btn-info"> <input type="radio"
name="typeCheckbox" value="requestCount">总请求数
name="typeCheckbox" value="requestCount" onclick="query()" >总请求数
</label> <label class="btn btn-info"> <input type="radio"
name="typeCheckbox" value="delayAvg">成功延时(ms)
name="typeCheckbox" value="delayAvg" onclick="query()" >成功延时(ms)
</label>
</div>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册