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

add problem info to dependency

上级 7443ce46
package com.dianping.cat.report.page.dependency;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
......@@ -23,14 +24,17 @@ import com.dianping.cat.consumer.dependency.model.entity.Dependency;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.dependency.model.entity.Index;
import com.dianping.cat.consumer.dependency.model.entity.Segment;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.dal.report.Event;
import com.dianping.cat.home.dependency.graph.entity.Node;
import com.dianping.cat.home.dependency.graph.entity.TopologyGraph;
import com.dianping.cat.home.dependency.graph.transform.DefaultJsonBuilder;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.LineChart;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.page.dependency.graph.LineGraphBuilder;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphItemBuilder;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphManager;
import com.dianping.cat.report.page.externalError.EventCollectManager;
import com.dianping.cat.report.page.model.dependency.DependencyReportMerger;
......@@ -46,7 +50,7 @@ public class Handler implements PageHandler<Context> {
private EventCollectManager m_manager;
@Inject(type = ModelService.class, value = "dependency")
private ModelService<DependencyReport> m_service;
private ModelService<DependencyReport> m_dependencyService;
@Inject
private PayloadNormalizer m_normalizePayload;
......@@ -54,55 +58,82 @@ public class Handler implements PageHandler<Context> {
@Inject
private TopologyGraphManager m_graphManager;
private DependencyReport getReport(Payload payload) {
String domain = payload.getDomain();
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("date", date);
@Inject(type = ModelService.class, value = "problem")
private ModelService<ProblemReport> m_problemservice;
if (m_service.isEligable(request)) {
ModelResponse<DependencyReport> response = m_service.invoke(request);
DependencyReport report = response.getModel();
private SimpleDateFormat m_sdf = new SimpleDateFormat("HH:mm");
Date start = report.getStartTime();
if (start == null) {
report.setStartTime(new Date(payload.getDate()));
report.setStartTime(new Date(payload.getDate()+TimeUtil.ONE_HOUR));
private SimpleDateFormat m_dateFormat = new SimpleDateFormat("yyyyMMddHH");
private Segment buildAllSegment(DependencyReport report) {
Segment result = new Segment();
Map<Integer, Segment> segments = report.getSegments();
DependencyReportMerger merger = new DependencyReportMerger(null);
for (Segment segment : segments.values()) {
Map<String, Dependency> dependencies = segment.getDependencies();
Map<String, Index> indexs = segment.getIndexs();
for (Index index : indexs.values()) {
Index temp = result.findOrCreateIndex(index.getName());
merger.mergeIndex(temp, index);
}
for (Dependency dependency : dependencies.values()) {
Dependency temp = result.findOrCreateDependency(dependency.getKey());
merger.mergeDependency(temp, dependency);
}
return report;
} else {
throw new RuntimeException("Internal error: no eligable dependency service registered for " + request + "!");
}
return result;
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "dependency")
public void handleInbound(Context ctx) throws ServletException, IOException {
private void buildGraphByEvent(TopologyGraph graph, Map<String, List<Event>> events) {
for (Entry<String, List<Event>> entry : events.entrySet()) {
List<Event> eventList = entry.getValue();
for (Event event : eventList) {
Node node = graph.findNode(event.getDomain());
if (node != null) {
String des = node.getDes();
des = "</br>" + m_sdf.format(event.getDate()) + " " + event.getSubject();
node.setDes(des);
}
}
}
}
@Override
@OutboundActionMeta(name = "dependency")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
private void buildGraphExtraInfo(Payload payload, TopologyGraph graph) {
for (Node node : graph.getNodes().values()) {
if (node.getType().equals(TopologyGraphItemBuilder.PROJECT)) {
node.setLink(buildLink(payload, node.getId()));
normalize(model, payload);
if (node.getStatus() != TopologyGraphItemBuilder.OK) {
String problemInfo = buildProblemInfo(node.getId(), payload);
Action action = payload.getAction();
node.setDes(node.getDes() + problemInfo);
}
}
}
}
DependencyReport report = getReport(payload);
switch (action) {
case GRAPH:
buildHourlyReport(report, model, payload);
buildHourlyTopologyGraph(model, payload);
break;
case VIEW:
buildHourlyReport(report, model, payload);
buildHourlyLineGraph(report, model);
break;
private List<String> buildGraphList(List<LineChart> charts) {
List<String> result = new ArrayList<String>();
for (LineChart temp : charts) {
result.add(temp.getJsonString());
}
m_jspViewer.view(ctx, model);
return result;
}
private Map<String, List<String>> buildGraphMap(Map<String, List<LineChart>> charts) {
Map<String, List<String>> result = new HashMap<String, List<String>>();
for (Entry<String, List<LineChart>> temp : charts.entrySet()) {
result.put(temp.getKey(), buildGraphList(temp.getValue()));
}
return result;
}
private void buildHourlyLineGraph(DependencyReport report, Model model) {
......@@ -117,31 +148,38 @@ public class Handler implements PageHandler<Context> {
model.setDependencyGraph(buildGraphMap(dependencys));
}
private Map<String, List<String>> buildGraphMap(Map<String, List<LineChart>> charts) {
Map<String, List<String>> result = new HashMap<String, List<String>>();
for (Entry<String, List<LineChart>> temp : charts.entrySet()) {
result.put(temp.getKey(), buildGraphList(temp.getValue()));
}
return result;
}
private void buildHourlyReport(DependencyReport report, Model model, Payload payload) {
Date reportTime = new Date(payload.getDate() + TimeUtil.ONE_MINUTE * model.getMinute());
Segment segment = report.findSegment(model.getMinute());
private List<String> buildGraphList(List<LineChart> charts) {
List<String> result = new ArrayList<String>();
model.setReport(report);
model.setSegment(segment);
for (LineChart temp : charts) {
result.add(temp.getJsonString());
if (payload.isAll()) {
model.setSegment(buildAllSegment(report));
}
return result;
model.setEvents(queryDependencyEvent(segment, payload.getDomain(), reportTime));
}
private void buildHourlyTopologyGraph(Model model, Payload payload) {
private TopologyGraph buildHourlyTopologyGraph(Model model, Payload payload) {
long time = payload.getDate() + TimeUtil.ONE_MINUTE * computeMinute(payload);
String domain = payload.getDomain();
TopologyGraph graph = m_graphManager.buildGraphByDomainTime(domain, time);
String json = new DefaultJsonBuilder().buildJson(graph);
return m_graphManager.buildGraphByDomainTime(domain, time);
}
model.setTopologyGraph(json);
private String buildLink(Payload payload, String domain) {
return String.format("?op=graph&minute=%s&domain=%s&date=%s", payload.getMinute(), domain,
m_dateFormat.format(new Date(payload.getDate())));
}
private String buildProblemInfo(String domain, Payload payload) {
ProblemReport report = queryProblemReport(payload, domain);
ProblemReportVistor visitor = new ProblemReportVistor();
visitor.visitProblemReport(report);
String result = visitor.buildResult();
System.out.println(result);
return result;
}
private int computeMinute(Payload payload) {
......@@ -158,39 +196,82 @@ public class Handler implements PageHandler<Context> {
return minute;
}
private void buildHourlyReport(DependencyReport report, Model model, Payload payload) {
Date reportTime = new Date(payload.getDate() + TimeUtil.ONE_MINUTE * model.getMinute());
Segment segment = report.findSegment(model.getMinute());
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "dependency")
public void handleInbound(Context ctx) throws ServletException, IOException {
}
model.setReport(report);
model.setSegment(segment);
@Override
@OutboundActionMeta(name = "dependency")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
if (payload.isAll()) {
model.setSegment(buildAllSegment(report));
normalize(model, payload);
Action action = payload.getAction();
DependencyReport report = queryDependencyReport(payload);
switch (action) {
case GRAPH:
buildHourlyReport(report, model, payload);
TopologyGraph graph = buildHourlyTopologyGraph(model, payload);
buildGraphByEvent(graph, model.getEvents());
buildGraphExtraInfo(payload, graph);
model.setTopologyGraph(new DefaultJsonBuilder().buildJson(graph));
break;
case VIEW:
buildHourlyReport(report, model, payload);
buildHourlyLineGraph(report, model);
break;
}
model.setEvents(queryDependencyEvent(segment, payload.getDomain(), reportTime));
m_jspViewer.view(ctx, model);
}
private Segment buildAllSegment(DependencyReport report) {
Segment result = new Segment();
Map<Integer, Segment> segments = report.getSegments();
DependencyReportMerger merger = new DependencyReportMerger(null);
private void normalize(Model model, Payload payload) {
model.setPage(ReportPage.DEPENDENCY);
model.setAction(Action.VIEW);
for (Segment segment : segments.values()) {
m_normalizePayload.normalize(model, payload);
Integer minute = computeMinute(payload);
int maxMinute = 60;
List<Integer> minutes = new ArrayList<Integer>();
if (payload.getPeriod().isCurrent()) {
long current = System.currentTimeMillis() / 1000 / 60;
maxMinute = (int) (current % (60));
}
for (int i = 0; i < 60; i++) {
minutes.add(i);
}
model.setMinute(minute);
model.setMaxMinute(maxMinute);
model.setMinutes(minutes);
}
private Map<String, List<String>> parseDependencies(Segment segment) {
Map<String, List<String>> results = new TreeMap<String, List<String>>();
if (segment != null) {
Map<String, Dependency> dependencies = segment.getDependencies();
Map<String, Index> indexs = segment.getIndexs();
for (Index index : indexs.values()) {
Index temp = result.findOrCreateIndex(index.getName());
merger.mergeIndex(temp, index);
}
for (Dependency dependency : dependencies.values()) {
Dependency temp = result.findOrCreateDependency(dependency.getKey());
for (Dependency temp : dependencies.values()) {
String type = temp.getType();
String target = temp.getTarget();
List<String> targets = results.get(type);
merger.mergeDependency(temp, dependency);
if (targets == null) {
targets = new ArrayList<String>();
results.put(type, targets);
}
targets.add(target);
}
}
return result;
return results;
}
private Map<String, List<Event>> queryDependencyEvent(Segment segment, String domain, Date date) {
......@@ -222,48 +303,38 @@ public class Handler implements PageHandler<Context> {
return result;
}
private Map<String, List<String>> parseDependencies(Segment segment) {
Map<String, List<String>> results = new TreeMap<String, List<String>>();
if (segment != null) {
Map<String, Dependency> dependencies = segment.getDependencies();
private DependencyReport queryDependencyReport(Payload payload) {
String domain = payload.getDomain();
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("date", date);
for (Dependency temp : dependencies.values()) {
String type = temp.getType();
String target = temp.getTarget();
List<String> targets = results.get(type);
if (m_dependencyService.isEligable(request)) {
ModelResponse<DependencyReport> response = m_dependencyService.invoke(request);
DependencyReport report = response.getModel();
if (targets == null) {
targets = new ArrayList<String>();
results.put(type, targets);
}
targets.add(target);
Date start = report.getStartTime();
if (start == null) {
report.setStartTime(new Date(payload.getDate()));
report.setStartTime(new Date(payload.getDate() + TimeUtil.ONE_HOUR));
}
return report;
} else {
throw new RuntimeException("Internal error: no eligable dependency service registered for " + request + "!");
}
return results;
}
private void normalize(Model model, Payload payload) {
model.setPage(ReportPage.DEPENDENCY);
model.setAction(Action.VIEW);
m_normalizePayload.normalize(model, payload);
Integer minute = computeMinute(payload);
int maxMinute = 60;
List<Integer> minutes = new ArrayList<Integer>();
private ProblemReport queryProblemReport(Payload payload, String domain) {
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("date", date);
if (m_problemservice.isEligable(request)) {
ModelResponse<ProblemReport> response = m_problemservice.invoke(request);
if (payload.getPeriod().isCurrent()) {
long current = System.currentTimeMillis() / 1000 / 60;
maxMinute = (int) (current % (60));
}
for (int i = 0; i < 60; i++) {
minutes.add(i);
return response.getModel();
} else {
throw new RuntimeException("Internal error: no eligible problem service registered for " + request + "!");
}
model.setMinute(minute);
model.setMaxMinute(maxMinute);
model.setMinutes(minutes);
}
}
package com.dianping.cat.report.page.dependency;
import java.util.LinkedHashMap;
import java.util.Map;
import com.dianping.cat.consumer.problem.model.entity.Entry;
import com.dianping.cat.consumer.problem.model.transform.BaseVisitor;
public class ProblemReportVistor extends BaseVisitor {
private Map<String, Integer> m_errors = new LinkedHashMap<String, Integer>();
@Override
public void visitEntry(Entry entry) {
String type = entry.getType();
String state = entry.getStatus();
if ("error".equals(type)) {
Integer temp = m_errors.get(state);
if (temp == null) {
m_errors.put(state, 1);
} else {
m_errors.put(state, temp + 1);
}
}
}
public String buildResult() {
StringBuilder sb = new StringBuilder();
for (java.util.Map.Entry<String, Integer> error : m_errors.entrySet()) {
sb.append(error.getKey()).append(":").append(error.getValue()).append("<br>");
}
return sb.toString();
}
}
......@@ -59,7 +59,9 @@ public class TopologyGraphBuilder extends BaseVisitor {
String split = "\\|";
if (StringUtil.isEmpty(old)) {
return des;
} else {
} else if(StringUtil.isEmpty(des)){
return old;
}else {
String[] temps = old.split(split);
for (String temp : temps) {
if (des.equals(temp.trim())) {
......
......@@ -55,37 +55,48 @@ public class TopologyGraphManager implements Initializable, LogEnabled {
for (Edge edge : edges) {
String self = edge.getSelf();
String target = edge.getTarget();
Edge cloneEdge = cloneEdge(edge);
if (self.equals(domain)) {
Node other = graph.findNode(target);
if (other != null) {
result.addNode(other);
result.addNode(cloneNode(other));
} else {
result.addNode(m_graphBuilder.createNode(target));
}
edge.setOpposite(false);
result.addEdge(edge);
result.addEdge(cloneEdge);
} else if (target.equals(domain)) {
Node other = graph.findNode(self);
if (other != null) {
result.addNode(other);
result.addNode(cloneNode(other));
} else {
result.addNode(m_graphBuilder.createNode(target));
}
Edge temp = cloneEdge(edge);
temp.setTarget(edge.getSelf());
temp.setSelf(edge.getTarget());
temp.setOpposite(true);
result.addEdge(temp);
cloneEdge.setTarget(edge.getSelf());
cloneEdge.setSelf(edge.getTarget());
cloneEdge.setOpposite(true);
result.addEdge(cloneEdge);
}
}
}
return result;
}
public Node cloneNode(Node node) {
Node result = new Node();
result.setDes(node.getDes());
result.setId(node.getId());
result.setLink(node.getLink());
result.setStatus(node.getStatus());
result.setType(node.getType());
result.setWeight(node.getWeight());
return result;
}
public Edge cloneEdge(Edge edge) {
Edge result = new Edge();
......
......@@ -607,10 +607,6 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManger</role>
<implementation>com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManger</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>transaction-local</role-hint>
......@@ -2531,7 +2527,7 @@
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>dependency</role-hint>
<field-name>m_service</field-name>
<field-name>m_dependencyService</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.PayloadNormalizer</role>
......@@ -2539,6 +2535,11 @@
<requirement>
<role>com.dianping.cat.report.page.dependency.graph.TopologyGraphManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>problem</role-hint>
<field-name>m_problemservice</field-name>
</requirement>
</requirements>
</component>
<component>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册