提交 d187ebf3 编写于 作者: J jialinsun

resolve

上级 8ede6385
package com.dianping.cat.config.app;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
public class AppDataService {
public void insert(){
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[]>();
}
}
public void queryAvg(QueryEntity entity) {
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[]> queryDelayAvg(QueryEntity entity) {
return makeMockValue(DELAY_AVG);
}
public void queryCount(QueryEntity entity) {
private Map<String, double[]> queryRequestCount(QueryEntity entity) {
return makeMockValue(REQUEST_COUNT);
}
public void querySuccessRate(QueryEntity entity) {
private Map<String, double[]> querySuccessRatio(QueryEntity entity) {
return makeMockValue(SUCCESS_RATIO);
}
public static class Statistics {
......@@ -50,5 +98,5 @@ public class AppDataService {
m_avg = avg;
}
}
}
......@@ -12,6 +12,7 @@ import org.unidal.lookup.configuration.Component;
import com.dianping.cat.CatHomeModule;
import com.dianping.cat.ServerConfigManager;
import com.dianping.cat.config.app.AppDataService;
import com.dianping.cat.consumer.dependency.DependencyAnalyzer;
import com.dianping.cat.consumer.metric.MetricAnalyzer;
import com.dianping.cat.consumer.metric.MetricConfigManager;
......@@ -36,6 +37,7 @@ import com.dianping.cat.report.graph.GraphBuilder;
import com.dianping.cat.report.graph.ValueTranslater;
import com.dianping.cat.report.page.JsonBuilder;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.page.app.graph.AppGraphCreator;
import com.dianping.cat.report.page.cdn.graph.CdnGraphCreator;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphBuilder;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager;
......@@ -160,6 +162,10 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(NetworkGraphCreator.class).req(CachedMetricReportService.class, DataExtractor.class,
MetricDataFetcher.class).req(BaselineService.class, MetricConfigManager.class,
ProductLineConfigManager.class, MetricGroupConfigManager.class, AlertInfo.class));
all.add(C(AppGraphCreator.class).req(AppDataService.class, CachedMetricReportService.class, DataExtractor.class,
MetricDataFetcher.class).req(BaselineService.class, MetricConfigManager.class,
ProductLineConfigManager.class, MetricGroupConfigManager.class, AlertInfo.class));
// report serivce
all.addAll(new ReportServiceComponentConfigurator().defineComponents());
// task
......
package com.dianping.cat.report.page.app;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.ServletException;
import com.dianping.cat.config.app.AppConfigManager;
import com.dianping.cat.config.app.QueryEntity;
import com.dianping.cat.report.ReportPage;
import org.codehaus.plexus.util.StringUtils;
import org.unidal.lookup.annotation.Inject;
import org.unidal.web.mvc.PageHandler;
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.config.app.AppConfigManager;
import com.dianping.cat.config.app.QueryEntity;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.page.app.graph.AppGraphCreator;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
......@@ -20,6 +26,9 @@ public class Handler implements PageHandler<Context> {
@Inject
private AppConfigManager m_manager;
@Inject
private AppGraphCreator m_appGraphCreator;
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "app")
......@@ -45,13 +54,34 @@ public class Handler implements PageHandler<Context> {
QueryEntity entity1 = payload.getQueryEntity1();
QueryEntity entity2 = payload.getQueryEntity2();
String type = payload.getType();
if (StringUtils.isEmpty(type)) {
type = "successRatio";
}
LineChart lineCharts = new LineChart();
if (entity1 != null) {
System.out.println(entity1.toString());
LineChart lineChart1 = m_appGraphCreator.buildChartsByProductLine(entity1, type);
Iterator<String> ititle = lineChart1.getSubTitles().iterator();
Iterator<Map<Long, Double>> idata = lineChart1.getDatas().iterator();
while (ititle.hasNext() && idata.hasNext()) {
lineCharts.add(ititle.next().toString(), idata.next());
}
}
if (entity2 != null) {
System.out.println(entity2.toString());
LineChart lineChart2 = m_appGraphCreator.buildChartsByProductLine(entity2, type);
Iterator<String> ititle = lineChart2.getSubTitles().iterator();
Iterator<Map<Long, Double>> idata = lineChart2.getDatas().iterator();
while (ititle.hasNext() && idata.hasNext()) {
lineCharts.add(ititle.next().toString(), idata.next());
}
}
lineCharts.setId("app");
lineCharts.setHtmlTitle(type);
model.setLineChart(lineCharts);
if (!ctx.isProcessStopped()) {
m_jspViewer.view(ctx, model);
......
......@@ -6,14 +6,20 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.unidal.web.mvc.view.annotation.EntityMeta;
import com.dianping.cat.configuration.app.entity.Code;
import com.dianping.cat.configuration.app.entity.Command;
import com.dianping.cat.configuration.app.entity.Item;
import com.dianping.cat.report.page.AbstractReportModel;
import com.dianping.cat.report.page.JsonBuilder;
import com.dianping.cat.report.page.LineChart;
public class Model extends AbstractReportModel<Action, Context> {
@EntityMeta
private LineChart m_lineChart;
private List<Item> m_cities;
private List<Item> m_versions;
......@@ -117,4 +123,12 @@ public class Model extends AbstractReportModel<Action, Context> {
public void setVersions(List<Item> versions) {
m_versions = versions;
}
public LineChart getLineChart() {
return m_lineChart;
}
public void setLineChart(LineChart lineChart) {
m_lineChart = lineChart;
}
}
......@@ -19,6 +19,9 @@ public class Payload extends AbstractReportPayload<Action> {
@FieldMeta("query2")
private String m_query2;
@FieldMeta("type")
private String m_type = "successRatio";
public Payload() {
super(ReportPage.APP);
}
......@@ -74,6 +77,14 @@ public class Payload extends AbstractReportPayload<Action> {
m_query2 = query2;
}
public void setType(String type) {
m_type = type;
}
public String getType() {
return m_type;
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
......
package com.dianping.cat.report.page.app.graph;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.config.app.AppDataService;
import com.dianping.cat.config.app.QueryEntity;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.report.chart.AbstractGraphCreator;
import com.dianping.cat.report.page.LineChart;
public class AppGraphCreator extends AbstractGraphCreator {
@Inject
private AppDataService m_appDataService;
public LineChart buildChartsByProductLine(QueryEntity queryEntity, String type) {
Map<String, double[]> values = prepareAllData(queryEntity, type);
long startTime = queryEntity.getDate().getTime();
long endTime = startTime + TimeUtil.ONE_DAY;
Date endDate = new Date(endTime);
Date startDate = new Date(startTime);
return buildChartData(values, startDate, endDate);
}
private Map<String, double[]> prepareAllData(QueryEntity queryEntity, String type) {
Map<String, double[]> value = m_appDataService.queryAppValue(queryEntity, type);
return value;
}
public LineChart buildChartData(final Map<String, double[]> datas, Date startDate, Date endDate) {
LineChart lineChart = new LineChart();
for (Entry<String, double[]> entry : datas.entrySet()) {
String key = entry.getKey();
lineChart.setId(startDate.toString());
lineChart.setHtmlTitle(key);
Map<Long, Double> all = convertToMap(datas.get(key), startDate, endDate, 5);
lineChart.add(startDate.toString(), all);
}
return lineChart;
}
protected Map<Long, Double> convertToMap(double[] data, Date start, Date end, int step) {
Map<Long, Double> map = new LinkedHashMap<Long, Double>();
int length = data.length;
long startTime = start.getTime();
long endTime = end.getTime();
long time = startTime;
int i = 0;
for (; i < length; i++) {
time += step * TimeUtil.ONE_MINUTE;
map.put(time, data[i]);
}
for (; time < endTime; time += step * TimeUtil.ONE_MINUTE) {
map.put(time, -1D);
}
return map;
}
}
......@@ -383,6 +383,39 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.app.graph.AppGraphCreator</role>
<implementation>com.dianping.cat.report.page.app.graph.AppGraphCreator</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.config.app.AppDataService</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.chart.CachedMetricReportService</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.chart.DataExtractor</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.chart.MetricDataFetcher</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.baseline.BaselineService</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.metric.MetricConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.metric.ProductLineConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.config.MetricGroupConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.AlertInfo</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.service.impl.TransactionReportService</role>
<implementation>com.dianping.cat.report.service.impl.TransactionReportService</implementation>
......@@ -3643,6 +3676,9 @@
<requirement>
<role>com.dianping.cat.config.app.AppConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.app.graph.AppGraphCreator</role>
</requirement>
</requirements>
</component>
<component>
......@@ -3663,6 +3699,43 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.app.graph.AppGraphCreator</role>
<implementation>com.dianping.cat.report.page.app.graph.AppGraphCreator</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.config.app.AppDataService</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.baseline.BaselineService</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.chart.DataExtractor</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.chart.MetricDataFetcher</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.chart.CachedMetricReportService</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.metric.MetricConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.consumer.metric.ProductLineConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.config.MetricGroupConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.AlertInfo</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.config.app.AppDataService</role>
<implementation>com.dianping.cat.config.app.AppDataService</implementation>
</component>
<component>
<role>com.dianping.cat.system.SystemModule</role>
<implementation>com.dianping.cat.system.SystemModule</implementation>
......
......@@ -117,8 +117,82 @@ function graphMetricChart(container, data) {
week : '%Y-%m-%d',
month : '%m-%d',
year : '%Y-%m'
},
},
yAxis : {
min : ylabelMin,
title: {
text: data.unit,
}
},
credits : {
enabled : false
},
plotOptions : {
spline : {
lineWidth : 2,
states : {
hover : {
lineWidth : 2
}
},
marker : {
enabled : false
}
}
},
legend : {
maxHeight : 82
},
tooltip : {
allowPointSelect : false,
formatter : function() {
var number0 = Number(this.y).toFixed(0);
var number1 = Number(this.y).toFixed(1);
var number = number1;
if(Number(number1)==Number(number0)){
number = number0;
}
return Highcharts.dateFormat('%Y-%m-%d %H:%M',
this.x)
+ '<br/>['+ this.series.name + '] '+ '<b>' + number + '</b>';
}
},
series : _data
});
}
function graphMetricChart2(container, data) {
Highcharts.setOptions({
global : {
useUTC : false
}
});
var ylabelMin = data.minYlable;
var _data = parseMetricLineData(data);
$(container).highcharts(
{
chart : {
type : 'spline'
},
title : {
text : data.htmlTitle,
useHTML: true
},
xAxis : {
type : 'datetime',
dateTimeLabelFormats : {
second : '%H:%M:%S',
minute : '%H:%M',
hour : '%H:%M',
day : '%m-%d',
week : '%Y-%m-%d',
month : '%m-%d',
year : '%Y-%m'
},
},
yAxis : {
min : ylabelMin,
title: {
......@@ -163,6 +237,7 @@ function graphMetricChart(container, data) {
series : _data
});
}
function graphLineChart(container, data) {
Highcharts.setOptions({
global : {
......
......@@ -3,18 +3,18 @@
<%@ taglib prefix="w" uri="http://www.unidal.org/web/core"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="res" uri="http://www.unidal.org/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.app.Context"
scope="request" />
<jsp:useBean id="payload"
type="com.dianping.cat.report.page.app.Payload" scope="request" />
<jsp:useBean id="model" type="com.dianping.cat.report.page.app.Model"
scope="request" />
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.app.Context" scope="request" />
<jsp:useBean id="payload" type="com.dianping.cat.report.page.app.Payload" scope="request" />
<jsp:useBean id="model" type="com.dianping.cat.report.page.app.Model" scope="request" />
<a:body>
<res:useCss value="${res.css.local['select2.css']}" target="head-css" />
<res:useCss value="${res.css.local['bootstrap-datetimepicker.min.css']}" target="head-css" />
<res:useCss
value="${res.css.local['bootstrap-datetimepicker.min.css']}"
target="head-css" />
<res:useJs value="${res.js.local['select2.min.js']}" target="head-js" />
<res:useJs value="${res.js.local['bootstrap-datetimepicker.min.js']}" target="head-js" />
<res:useJs value="${res.js.local['bootstrap-datetimepicker.min.js']}"
target="head-js" />
<res:useJs value="${res.js.local['baseGraph.js']}" target="head-js" />
<script type="text/javascript">
var commandInfo = ${model.command};
......@@ -61,7 +61,7 @@
return myDate.getFullYear() + "-" + myDate.getMonth() + "-"
+ myDate.getDate();
}
function query() {
var time = $("#time").val();
var command = $("#command").val();
......@@ -94,8 +94,18 @@
+ split + palteform2 + split + city2 + split
+ operator2;
}
var checkboxs = document.getElementsByName("typeCheckbox");
var type = "";
for(var i=0; i<checkboxs.length;i++){
if(checkboxs[i].checked){
type = checkboxs[i].value;
break;
}
}
var href = "?query1=" + query1 + "&query2=" + query2;
var href = "?query1=" + query1 + "&query2=" + query2 + "&type=" + type;
window.location.href = href;
}
......@@ -113,13 +123,14 @@
command2.on('change', command2Change);
$("#command").val(words[1]);
if(words[0]==null||words[0].length==0){
if (words[0] == null || words[0].length == 0) {
$("#time").val(getDate());
}else{
} else {
$("#time").val(words[0]);
}
command1Change();
$("#code").val(words[2]);
$("#network").val(words[3]);
......@@ -134,9 +145,9 @@
document.getElementById("checkbox").checked = true;
var words = query2.split(";");
if(words[0]==null||words[0].length==0){
if (words[0] == null || words[0].length == 0) {
$("#time2").val(getDate());
}else{
} else {
$("#time2").val(words[0]);
}
......@@ -149,9 +160,22 @@
$("#platform2").val(words[6]);
$("#city2").val(words[7]);
$("#operator2").val(words[8]);
}else{
} else {
$("#time2").val(getDate());
}
var checkboxs = document.getElementsByName("typeCheckbox");
for(var i=0; i<checkboxs.length;i++){
if(checkboxs[i].value == "${payload.type}"){
checkboxs[i].checked = true;
break;
}
}
var data = ${model.lineChart.jsonString};
graphMetricChart2(document.getElementById('${model.lineChart.id}'), data);
});
</script>
<div class="report">
......@@ -258,6 +282,20 @@
</tr>
</table>
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-info"> <input type="radio"
name="typeCheckbox" value="successRatio">成功率
</label> <label class="btn btn-info"> <input type="radio"
name="typeCheckbox" value="requestCount">总请求数
</label> <label class="btn btn-info"> <input type="radio"
name="typeCheckbox" value="delayAvg">成功延时(ms)
</label>
</div>
<div style="float:left;width:95%;">
<div id="${model.lineChart.id}"></div>
</div>
<table class="footer">
<tr>
<td>[ end ]</td>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册