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

refactor dependency graph model

上级 628d3fd0
......@@ -175,7 +175,7 @@
</goals>
<configuration>
<manifest>${basedir}/src/main/resources/META-INF/dal/model/threshold-template-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/model/front-manifest.xml,</manifest>
${basedir}/src/main/resources/META-INF/dal/model/graph-manifest.xml,</manifest>
</configuration>
</execution>
<execution>
......@@ -188,17 +188,7 @@
<manifest><![CDATA[${basedir}/src/main/resources/META-INF/dal/jdbc/report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/jdbc/user-manifest.xml,]]> <![CDATA[${basedir}/src/main/resources/META-INF/dal/jdbc/report-manifest.xml,
${basedir}/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml,]]></manifest>
</configuration>
</execution>
<execution>
<id>generate dal model files</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-model</goal>
</goals>
<configuration>
<manifest><![CDATA[${basedir}/src/main/resources/META-INF/dal/model/front-manifest.xml,]]></manifest>
${basedir}/src/main/resources/META-INF/dal/jdbc/alarm-manifest.xml,]]></manifest>
</configuration>
</execution>
</executions>
......
......@@ -32,8 +32,13 @@ import com.dianping.cat.report.graph.DefaultValueTranslater;
import com.dianping.cat.report.graph.GraphBuilder;
import com.dianping.cat.report.graph.ValueTranslater;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.page.dependency.DefaultDependencyGraphItemBuilder;
import com.dianping.cat.report.page.dependency.DependencyGraphBuilder;
import com.dianping.cat.report.page.dependency.DependendencyGraphItemBuilder;
import com.dianping.cat.report.page.dependency.GraphManager;
import com.dianping.cat.report.page.externalError.EventCollectManager;
import com.dianping.cat.report.page.health.HistoryGraphs;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.page.state.StateGraphs;
import com.dianping.cat.report.service.DailyReportService;
import com.dianping.cat.report.service.HourlyReportService;
......@@ -201,9 +206,16 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(WeeklyReportCache.class, MonthReportCache.class));
all.add(C(EventCollectManager.class).req(EventDao.class, ServerConfigManager.class));
all.add(C(DependendencyGraphItemBuilder.class,DefaultDependencyGraphItemBuilder.class));
all.add(C(DependencyGraphBuilder.class).req(DependendencyGraphItemBuilder.class));
// model service
all.addAll(new ServiceComponentConfigurator().defineComponents());
all.add(C(GraphManager.class).req(DependencyGraphBuilder.class).req(ModelService.class, "dependency"));
// database
all.add(C(JdbcDataSourceConfigurationManager.class) //
.config(E("datasourceFile").value("/data/appdatas/cat/datasources.xml")));
......
package com.dianping.cat.report.page.dependency;
public enum Action implements org.unidal.web.mvc.Action {
VIEW("view");
VIEW("view"),
GRAPH("graph");
private String m_name;
......
package com.dianping.cat.report.page.dependency;
import com.dianping.cat.consumer.dependency.model.entity.Dependency;
import com.dianping.cat.consumer.dependency.model.entity.Index;
import com.dianping.cat.home.dependency.entity.Edge;
import com.dianping.cat.home.dependency.entity.Node;
public class DefaultDependencyGraphItemBuilder implements DependendencyGraphItemBuilder {
private static final String PROJECT = "project";
private static final String DATABASE = "database";
public static int OK = 1;
public static int WARN = 2;
public static int ERROR = 3;
@Override
public Node buildNode(String domain, Index index) {
Node node = new Node(domain);
node.setStatus(OK);
node.setType(PROJECT);
node.setWeight(1);
node.setDes("");
node.setLink("");
return node;
}
@Override
public Edge buildEdge(String domain, Dependency dependency) {
Edge edge = new Edge();
edge.setType(dependency.getType());
edge.setKey(dependency.getType() + ':' + domain + ':' + dependency.getTarget());
edge.setSelf(domain);
edge.setTarget(dependency.getTarget());
edge.setOpposite(true);
edge.setWeight(1);
edge.setStatus(OK);
edge.setDes("");
edge.setLink("");
return edge;
}
@Override
public Node buildDatabaseNode(String database) {
Node node = new Node(database);
node.setStatus(OK);
node.setType(DATABASE);
node.setWeight(1);
node.setDes("");
node.setLink("");
return node;
}
}
package com.dianping.cat.report.page.dependency;
import org.hsqldb.lib.StringUtil;
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.dependency.model.transform.BaseVisitor;
import com.dianping.cat.home.dependency.entity.DependencyGraph;
import com.dianping.cat.home.dependency.entity.Edge;
import com.dianping.cat.home.dependency.entity.Node;
public class DependencyGraphBuilder extends BaseVisitor {
private String m_domain;
private DependencyGraph m_graph;
private int m_minute;
private DependendencyGraphItemBuilder m_itemBuilder;
private Node mergeNode(Node old, Node node) {
if (old == null) {
return node;
} else {
if (old.getStatus() > old.getStatus()) {
old.setStatus(old.getStatus());
}
old.setWeight(old.getWeight() + node.getWeight());
old.setDes(old.getDes() + node.getDes());
if (!StringUtil.isEmpty(node.getLink())) {
old.setLink(node.getLink());
}
return old;
}
}
private Edge mergeEdge(Edge old, Edge edge) {
if (old == null) {
return edge;
} else {
if (old.getStatus() > old.getStatus()) {
old.setStatus(old.getStatus());
}
old.setWeight(old.getWeight() + edge.getWeight());
old.setDes(old.getDes() + edge.getDes());
if (!StringUtil.isEmpty(edge.getLink())) {
old.setLink(edge.getLink());
}
return old;
}
}
public DependencyGraphBuilder setGraph(DependencyGraph graph) {
m_graph = graph;
return this;
}
public DependencyGraphBuilder setMinute(int minute) {
m_minute = minute;
return this;
}
@Override
public void visitDependency(Dependency dependency) {
String type = dependency.getType();
//pigeonServer is no use
if (!"PigeonServer".equals(type)) {
Edge edge = m_itemBuilder.buildEdge(m_domain, dependency);
Edge old = m_graph.findEdge(edge.getKey());
m_graph.getEdges().put(edge.getKey(), mergeEdge(old, edge));
if ("Database".equals(type)) {
String target = dependency.getTarget();
Node nodeOld = m_graph.findNode(target);
m_graph.getNodes().put(target, mergeNode(nodeOld, m_itemBuilder.buildDatabaseNode(target)));
}
}
super.visitDependency(dependency);
}
@Override
public void visitDependencyReport(DependencyReport dependencyReport) {
m_domain = dependencyReport.getDomain();
super.visitDependencyReport(dependencyReport);
}
@Override
public void visitIndex(Index index) {
Node node = m_itemBuilder.buildNode(m_domain, index);
Node old = m_graph.findNode(node.getId());
m_graph.getNodes().put(node.getId(), mergeNode(old, node));
super.visitIndex(index);
}
@Override
public void visitSegment(Segment segment) {
int id = segment.getId();
if (id == m_minute) {
super.visitSegment(segment);
}
}
}
package com.dianping.cat.report.page.dependency;
import com.dianping.cat.consumer.dependency.model.entity.Dependency;
import com.dianping.cat.consumer.dependency.model.entity.Index;
import com.dianping.cat.home.dependency.entity.Edge;
import com.dianping.cat.home.dependency.entity.Node;
public interface DependendencyGraphItemBuilder {
public Node buildNode(String domain, Index index);
public Node buildDatabaseNode(String database);
public Edge buildEdge(String domain, Dependency dependency);
}
package com.dianping.cat.report.page.dependency;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
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.helper.Threads;
import org.unidal.helper.Threads.Task;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.dependency.entity.DependencyGraph;
import com.dianping.cat.home.dependency.entity.Edge;
import com.dianping.cat.home.dependency.entity.Node;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.report.page.model.spi.ModelPeriod;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.ModelResponse;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.view.DomainNavManager;
public class GraphManager implements Initializable, LogEnabled {
@Inject(type = ModelService.class, value = "dependency")
private ModelService<DependencyReport> m_service;
@Inject
private DependencyGraphBuilder m_builder;
private Map<Long, DependencyGraph> m_graphs = new ConcurrentHashMap<Long, DependencyGraph>(1000);
private Logger m_logger;
public DependencyGraph queryGraph(String domain, long time) {
DependencyGraph graph = m_graphs.get(time);
DependencyGraph result = new DependencyGraph();
if (graph != null) {
Node node = graph.findNode(domain);
result.setDes(node.getDes());
result.setId(node.getId());
result.setStatus(node.getStatus());
result.setType(node.getType());
Collection<Edge> edges = graph.getEdges().values();
for (Edge edge : edges) {
String self = edge.getSelf();
String target = edge.getTarget();
if (self.equals(domain)) {
Node other = graph.findNode(target);
if (other != null) {
result.addNode(other);
}
edge.setOpposite(true);
result.addEdge(edge);
} else if (target.equals(domain)) {
Node other = graph.findNode(self);
if (other != null) {
result.addNode(other);
}
edge.setOpposite(false);
result.addEdge(edge);
}
}
}
return result;
}
private class Reload implements Task {
@Override
public void run() {
boolean active = true;
while (active) {
long current = System.currentTimeMillis();
Transaction t = Cat.newTransaction("Dependency", "Reload");
try {
long currentHour = current - current % TimeUtil.ONE_HOUR;
long currentMinute = current - current % TimeUtil.ONE_MINUTE;
long time = current / 1000 / 60;
int minute = (int) (time % (60));
String value = String.valueOf(currentHour);
Collection<String> domains = getAllDomains();
for (String temp : domains) {
try {
ModelRequest request = new ModelRequest(temp, ModelPeriod.CURRENT).setProperty("date", value);
if (m_service.isEligable(request)) {
ModelResponse<DependencyReport> response = m_service.invoke(request);
DependencyReport report = response.getModel();
DependencyGraph graph = m_graphs.get(currentMinute);
if (graph == null) {
graph = new DependencyGraph();
m_graphs.put(currentMinute, graph);
}
m_builder.setGraph(graph).setMinute(minute);
m_builder.visitDependencyReport(report);
} else {
m_logger.warn(String.format("Can't get dependency report of %s", temp));
}
} catch (Exception e) {
Cat.logError(e);
t.setStatus(e);
}
}
t.setStatus(Transaction.SUCCESS);
} catch (Exception ex) {
ex.printStackTrace();
t.setStatus(ex);
} finally {
t.complete();
}
long duration = System.currentTimeMillis() - current;
try {
int maxDuration = 20 * 1000;
if (duration < maxDuration) {
Thread.sleep(maxDuration - duration);
}
} catch (InterruptedException e) {
active = false;
}
}
}
private Collection<String> getAllDomains() {
return DomainNavManager.getDomains();
}
@Override
public String getName() {
return "DependencyManagerReload";
}
@Override
public void shutdown() {
}
}
@Override
public void initialize() throws InitializationException {
Threads.forGroup("Cat").start(new Reload());
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
}
......@@ -2,18 +2,16 @@ package com.dianping.cat.report.page.dependency;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import javax.servlet.ServletException;
import org.codehaus.plexus.util.StringUtils;
import org.hsqldb.lib.StringUtil;
import org.unidal.lookup.annotation.Inject;
import org.unidal.web.mvc.PageHandler;
import org.unidal.web.mvc.annotation.InboundActionMeta;
......@@ -26,6 +24,8 @@ import com.dianping.cat.consumer.dependency.model.entity.Index;
import com.dianping.cat.consumer.dependency.model.entity.Segment;
import com.dianping.cat.helper.TimeUtil;
import com.dianping.cat.home.dal.report.Event;
import com.dianping.cat.home.dependency.entity.DependencyGraph;
import com.dianping.cat.home.dependency.transform.DefaultJsonBuilder;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.PayloadNormalizer;
import com.dianping.cat.report.page.externalError.EventCollectManager;
......@@ -47,6 +47,9 @@ public class Handler implements PageHandler<Context> {
@Inject
private PayloadNormalizer m_normalizePayload;
@Inject
private GraphManager m_graphManager;
private DependencyReport getReport(Payload payload) {
String domain = payload.getDomain();
String date = String.valueOf(payload.getDate());
......@@ -77,31 +80,58 @@ public class Handler implements PageHandler<Context> {
normalize(model, payload);
DependencyReport report = getReport(payload);
String min = payload.getMinute();
Set<Integer> keys = report.getSegments().keySet();
int minute = 0;
List<Integer> minutes = new ArrayList<Integer>(keys);
int maxMinute=0;
if (minutes.size() > 0) {
maxMinute =minutes.get(minutes.size() - 1);
Action action = payload.getAction();
switch (action) {
case GRAPH:
buildHourlyReport(model, payload);
buildHourlyGraph(model, payload);
break;
case VIEW:
buildHourlyReport(model, payload);
break;
}
Collections.sort(minutes);
if (StringUtils.isEmpty(min)) {
if (minutes.size() > 0) {
min = String.valueOf(minutes.get(minutes.size() - 1));
minute = Integer.parseInt(min);
maxMinute = minute;
}
m_jspViewer.view(ctx, model);
}
private void buildHourlyGraph(Model model, Payload payload) {
String domain = payload.getDomain();
long time = payload.getDate() + TimeUtil.ONE_MINUTE * computeMinute(payload);
DependencyGraph graph = m_graphManager.queryGraph(domain, time);
String json = new DefaultJsonBuilder().buildJson(graph);
model.setGraph(json);
}
private int computeMinute(Payload payload) {
int minute = 0;
String min = payload.getMinute();
if (StringUtil.isEmpty(min)) {
long current = System.currentTimeMillis() / 1000 / 60;
minute = (int) (current % (60));
} else {
minute = Integer.parseInt(min);
}
Date time = new Date(payload.getDate() + TimeUtil.ONE_MINUTE * minute);
return minute;
}
private void buildHourlyReport(Model model, Payload payload) {
DependencyReport report = getReport(payload);
Integer minute = computeMinute(payload);
int maxMinute = 60;
if (payload.getPeriod().isCurrent()) {
long current = System.currentTimeMillis() / 1000 / 60;
maxMinute = (int) (current % (60));
}
Date reportTime = new Date(payload.getDate() + TimeUtil.ONE_MINUTE * minute);
Segment segment = report.findSegment(minute);
minutes = new ArrayList<Integer>();
List<Integer> minutes = new ArrayList<Integer>();
for (int i = 0; i < 60; i++) {
minutes.add(i);
}
......@@ -115,9 +145,7 @@ public class Handler implements PageHandler<Context> {
if (payload.isAll()) {
model.setSegment(buildAllSegment(report));
}
model.setEvents(queryDependencyEvent(segment, payload.getDomain(), time));
m_jspViewer.view(ctx, model);
model.setEvents(queryDependencyEvent(segment, payload.getDomain(), reportTime));
}
private Segment buildAllSegment(DependencyReport report) {
......
......@@ -3,6 +3,8 @@ package com.dianping.cat.report.page.dependency;
public enum JspFile {
VIEW("/jsp/report/dependency.jsp"),
GRAPH("/jsp/report/dependencyGraph.jsp"),
;
private String m_path;
......
......@@ -11,6 +11,8 @@ public class JspViewer extends BaseJspViewer<ReportPage, Action, Context, Model>
switch (action) {
case VIEW:
return JspFile.VIEW.getPath();
case GRAPH:
return JspFile.GRAPH.getPath();
}
throw new RuntimeException("Unknown action: " + action);
......
......@@ -25,6 +25,8 @@ public class Model extends AbstractReportModel<Action, Context> {
private int m_maxMinute;
private Map<String, List<Event>> m_events;
private String m_graph;
public Map<String, List<Event>> getEvents() {
return m_events;
......@@ -102,4 +104,12 @@ public class Model extends AbstractReportModel<Action, Context> {
m_minute = minute;
}
public String getGraph() {
return m_graph;
}
public void setGraph(String graph) {
m_graph = graph;
}
}
......@@ -6,6 +6,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
......@@ -23,6 +24,18 @@ import com.dianping.cat.helper.TimeUtil;
public class DomainNavManager implements Initializable {
@Inject
private ProjectDao m_projectDao;
@Inject
private ServerConfigManager m_serverConfigManager;
private static Map<String, Project> m_projects = new ConcurrentHashMap<String, Project>();
public static Collection<String> getDomains() {
return m_projects.keySet();
}
public static Map<String, Department> getDepartment(Collection<String> domains) {
Map<String, Department> result = new TreeMap<String, Department>();
......@@ -36,26 +49,18 @@ public class DomainNavManager implements Initializable {
department = project.getDepartment();
projectLine = project.getProjectLine();
}
Department temp1 = result.get(department);
if (temp1 == null) {
temp1 = new Department();
result.put(department, temp1);
Department temp = result.get(department);
if (temp == null) {
temp = new Department();
result.put(department, temp);
}
temp1.findOrCreatProjectLine(projectLine).addDomain(domain);
temp.findOrCreatProjectLine(projectLine).addDomain(domain);
}
}
return result;
}
@Inject
private ProjectDao m_projectDao;
@Inject
private ServerConfigManager m_serverConfigManager;
private static Map<String, Project> m_projects = new HashMap<String, Project>();
public static Project getProjectByName(String domain) {
return m_projects.get(domain);
}
......@@ -83,8 +88,6 @@ public class DomainNavManager implements Initializable {
List<Project> projects = m_projectDao.findAll(ProjectEntity.READSET_FULL);
if (projects.size() > 0) {
m_projects.clear();
for (Project project : projects) {
m_projects.put(project.getDomain(), project);
}
......
......@@ -35,9 +35,6 @@ public class Handler implements PageHandler<Context> {
@Inject
private AggregationRuleDao m_aggregationRuleDao;
@Inject
private DomainNavManager m_domainNavManager;
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "config")
......@@ -106,7 +103,6 @@ public class Handler implements PageHandler<Context> {
return project;
}
@SuppressWarnings("static-access")
private void updateProject(Payload payload) {
int projectId = payload.getProjectId();
String department = payload.getDepartment();
......@@ -126,7 +122,7 @@ public class Handler implements PageHandler<Context> {
try {
m_projectDao.updateByPK(project, ProjectEntity.UPDATESET_FULL);
m_domainNavManager.getProjects().put(project.getDomain(), project);
DomainNavManager.getProjects().put(project.getDomain(), project);
} catch (DalException e) {
Cat.logError(e);
}
......
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="front" root="true">
<entity name="graph" root="true">
<attribute name="id" value-type="String" />
<attribute name="type" value-type="String" />
<attribute name="status" value-type="int" />
<attribute name="des" value-type="int" />
<entity-ref name="point" type="list" names="points" />
<entity-ref name="side" type="list" names="sides" />
<entity-ref name="node" type="list" names="nodes" />
<entity-ref name="edge" type="list" names="edges" />
</entity>
<entity name="point">
<entity name="node">
<attribute name="id" value-type="String" />
<attribute name="type" value-type="String" />
<attribute name="status" value-type="int" />
<attribute name="des" value-type="String" />
<attribute name="link" value-type="String" />
</entity>
<entity name="side">
<attribute name="id" value-type="String" />
<entity name="edge">
<attribute name="type" value-type="String" />
<attribute name="target" value-type="String" />
<attribute name="opposite" value-type="boolean" />
<attribute name="status" value-type="int" />
......
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="front-codegen.xml" />
<file path="front-model.xml" />
<file path="graph-codegen.xml" />
<file path="graph-model.xml" />
</manifest>
<?xml version="1.0" ?>
<model model-package="com.dianping.cat.home.front" enable-merger="true" enable-sax-parser="true"
<model model-package="com.dianping.cat.home.dependency" enable-merger="true" enable-sax-parser="true"
enable-base-visitor="true" enable-json-parser="true" enable-json-builder="true">
<entity name="front" root="true">
<entity name="graph" class-name='DependencyGraph' root="true">
<attribute name="id" value-type="String" />
<attribute name="type" value-type="String" />
<attribute name="status" value-type="int" />
<attribute name="des" value-type="int" />
<entity-ref name="point" type="list" names="points" />
<entity-ref name="side" type="list" names="sides" />
<attribute name="des" value-type="String" />
<entity-ref name="node" type="map" names="nodes" method-find-or-create='true'/>
<entity-ref name="edge" type="map" names="edges" method-find-or-create='true'/>
</entity>
<entity name="point">
<attribute name="id" value-type="String" />
<entity name="node">
<attribute name="id" value-type="String" key="true"/>
<attribute name="type" value-type="String" />
<attribute name="status" value-type="int" />
<attribute name="status" value-type="int" primitive="true" />
<attribute name="weight" value-type="int" primitive="true" />
<attribute name="des" value-type="String" />
<attribute name="link" value-type="String" />
</entity>
<entity name="side">
<attribute name="id" value-type="String" />
<entity name="edge">
<attribute name="key" value-type="String" key="true"/>
<attribute name="type" value-type="String" />
<attribute name="self" value-type="String" />
<attribute name="target" value-type="String" />
<attribute name="opposite" value-type="boolean" />
<attribute name="status" value-type="int" />
<attribute name="status" value-type="int" primitive="true" />
<attribute name="weight" value-type="int" primitive="true" />
<attribute name="des" value-type="String" />
<attribute name="link" value-type="String" />
</entity>
......
......@@ -585,6 +585,19 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.DependendencyGraphItemBuilder</role>
<implementation>com.dianping.cat.report.page.dependency.DefaultDependencyGraphItemBuilder</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.DependencyGraphBuilder</role>
<implementation>com.dianping.cat.report.page.dependency.DependencyGraphBuilder</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.page.dependency.DependendencyGraphItemBuilder</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>transaction-local</role-hint>
......@@ -1171,6 +1184,19 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.GraphManager</role>
<implementation>com.dianping.cat.report.page.dependency.GraphManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.page.dependency.DependencyGraphBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>dependency</role-hint>
</requirement>
</requirements>
</component>
<component>
<role>org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager</role>
<implementation>org.unidal.dal.jdbc.datasource.JdbcDataSourceConfigurationManager</implementation>
......@@ -2518,6 +2544,9 @@
<requirement>
<role>com.dianping.cat.report.page.PayloadNormalizer</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.dependency.GraphManager</role>
</requirement>
</requirements>
</component>
<component>
......@@ -2550,6 +2579,24 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.GraphManager</role>
<implementation>com.dianping.cat.report.page.dependency.GraphManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>dependency</role-hint>
<field-name>m_service</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.dependency.DependencyGraphBuilder</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.dependency.DependencyGraphBuilder</role>
<implementation>com.dianping.cat.report.page.dependency.DependencyGraphBuilder</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.externalError.Handler</role>
<implementation>com.dianping.cat.report.page.externalError.Handler</implementation>
......@@ -2803,9 +2850,6 @@
<requirement>
<role>com.dianping.cat.home.dal.report.AggregationRuleDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.view.DomainNavManager</role>
</requirement>
</requirements>
</component>
<component>
......@@ -2835,18 +2879,6 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.view.DomainNavManager</role>
<implementation>com.dianping.cat.report.view.DomainNavManager</implementation>
<requirements>
<requirement>
<role>com.dainping.cat.consumer.core.dal.ProjectDao</role>
</requirement>
<requirement>
<role>com.dianping.cat.configuration.ServerConfigManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.alarm.AlarmContentBuilder</role>
<implementation>com.dianping.cat.system.alarm.AlarmContentBuilder</implementation>
......
......@@ -12,15 +12,15 @@
<jsp:attribute name="subtitle">From ${w:format(model.report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(model.report.endTime,'yyyy-MM-dd HH:mm:ss')}</jsp:attribute>
<jsp:body>
<res:useCss value='${res.css.local.table_css}' target="head-css" />
<res:useJs value="${res.js.local['jquery.dataTables.min.js']}" target="head-js" />
<div class="report">
<div class="row-fluid">
<div class="span1 text-center">
<div class="span2 text-center">
<a style="margin-top:18px;" class="btn btn-primary" href="?domain=${model.domain}&date=${model.date}&all=true">ALL</a>
<a style="margin-top:18px;" class="btn btn-danger btn-primary" href="?op=graph&minute=${model.minute}&domain=${model.domain}&date=${model.date}&all=true">Graph</a>
</div>
<div class="span11">
<div class="span10">
<c:forEach var="item" items="${model.minutes}" varStatus="status">
<c:if test="${status.index % 30 ==0}">
<div class="pagination">
......@@ -186,4 +186,7 @@
.pagination ul{
margin-top:0px;
}
.pagination ul > li > a, .pagination ul > li > span{
padding:3px 10px;
}
</style>
\ No newline at end of file
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ 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.dependency.Context" scope="request"/>
<jsp:useBean id="payload" type="com.dianping.cat.report.page.dependency.Payload" scope="request"/>
<jsp:useBean id="model" type="com.dianping.cat.report.page.dependency.Model" scope="request"/>
<a:report title="Dependency Report"
navUrlPrefix="domain=${model.domain}">
<jsp:attribute name="subtitle">From ${w:format(model.report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(model.report.endTime,'yyyy-MM-dd HH:mm:ss')}</jsp:attribute>
<jsp:body>
<res:useCss value='${res.css.local.table_css}' target="head-css" />
<res:useJs value="${res.js.local['jquery.dataTables.min.js']}" target="head-js" />
<div class="report">
<div class="row-fluid">
<div class="span2 text-center">
<a style="margin-top:18px;" class="btn btn-danger btn-primary" href="?minute=${model.minute}&domain=${model.domain}&date=${model.date}&all=true">Data</a>
</div>
<div class="span10">
<c:forEach var="item" items="${model.minutes}" varStatus="status">
<c:if test="${status.index % 30 ==0}">
<div class="pagination">
<ul>
</c:if>
<c:if test="${item > model.maxMinute }"><li class="disabled" id="minute${item}"><a
href="?op=graph&domain=${model.domain}&date=${model.date}&minute=${item}">
<c:if test="${item < 10}">0${item}</c:if>
<c:if test="${item >= 10}">${item}</c:if></a></li>
</c:if>
<c:if test="${item <= model.maxMinute }"><li id="minute${item}"><a
href="?op=graph&domain=${model.domain}&date=${model.date}&minute=${item}">
<c:if test="${item < 10}">0${item}</c:if>
<c:if test="${item >= 10}">${item}</c:if></a></li>
</c:if>
<c:if test="${status.index % 30 ==29 || status.last}">
</ul>
</div>
</c:if>
</c:forEach></div>
</div>
<div class="row-fluid">
<div class="span12">
${model.graph}
</div>
</div>
<div class="row-fluid">
<div class="span12">
<div class="tabbable" id="otherDependency">
<ul class="nav nav-tabs">
<c:forEach var="item" items="${model.events}" varStatus="status" >
<li id="leftTab${status.index}" class="text-right"><a href="#tab${status.index}" data-toggle="tab">
${item.key}
<c:set var="size" value="${w:size(item.value)}"/>
<c:if test="${size > 0 }"><span class='text-error'>(${size})</span></c:if>
</a></li>
</c:forEach>
</ul>
<div class="tab-content">
<c:forEach var="entry" items="${model.events}" varStatus="status" >
<c:set var="items" value="${entry.value}"/>
<div class="tab-pane" id="tab${status.index}">
<table class="table table-striped table-bordered table-condensed">
<thead>
<tr><th>时间</th>
<th>详情</th>
<th>来源</th>
<th>项目名</th>
<th>IP</th>
</tr>
</thead>
<tbody>
<c:forEach var="item" items="${items}">
<tr><td>${w:format(item.date,'HH:mm')}</td>
<td>
<c:choose>
<c:when test="${not empty item.link}"><a href="${item.link}" target="_blank">${item.subject}</a></c:when>
<c:otherwise>${item.subject}</c:otherwise>
</c:choose>
<i data-content="${item.content}" data-original-title="详情" data-placement="top" data-toggle="popover" class="icon-tags" data-trigger="hover" tips=""></i>
</td>
<td>
<c:choose>
<c:when test="${item.type==1}">运维</c:when>
<c:when test="${item.type==2}">数据库</c:when>
<c:when test="${item.type==3}">CAT</c:when>
</c:choose>
</td>
<td>${item.domain}</td>
<td>${item.ip}</td>
</tr>
</c:forEach>
</table></div>
</c:forEach>
</div>
</div>
</tbody>
</div>
</div>
</div>
</jsp:body>
</a:report>
<script type="text/javascript">
$(document).ready(function() {
$('#minute'+${model.minute}).addClass('disabled');
$('#tab0').addClass('active');
$('#leftTab0').addClass('active');
});
</script>
<style>
.pagination{
margin:4px 0;
}
.pagination ul{
margin-top:0px;
}
.pagination ul > li > a, .pagination ul > li > span{
padding:3px 10px;
}
</style>
......@@ -3,16 +3,16 @@ package com.dianping.cat.report.page.dependency;
import org.junit.Test;
import org.unidal.webres.helper.Files;
import com.dianping.cat.home.front.entity.Front;
import com.dianping.cat.home.front.transform.DefaultJsonBuilder;
import com.dianping.cat.home.front.transform.DefaultSaxParser;
import com.dianping.cat.home.dependency.entity.DependencyGraph;
import com.dianping.cat.home.dependency.transform.DefaultJsonBuilder;
import com.dianping.cat.home.dependency.transform.DefaultSaxParser;
public class FrontReport {
public class DependencyGraphReport {
@Test
public void test() throws Exception {
String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("front.xml"), "utf-8");
Front front = DefaultSaxParser.parse(oldXml);
String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("graph.xml"), "utf-8");
DependencyGraph front = DefaultSaxParser.parse(oldXml);
DefaultJsonBuilder build = new DefaultJsonBuilder();
System.out.println(build.buildJson(front));
......
AccountMQ
AccountServer
AccountWeb
ActivitybackWeb
ActivityService
ActivityWeb
AuditbackService
AuditbackWeb
AutoauditMQ
BadgeMQ
BaseDataServer
CheckinService
DecoratorServer
DPIndexWeb
FeedMQ
FeedServer
GroupService
GroupWeb
magicMirror
MailServer
MapService
PiccenterDisplay
PiccenterService
PiccenterStorage
PiccenterUpload
PiccenterWeb
PictureQualityScore
ReviewServer
ShopEvent
ShopListWeb
ShopManagementWeb
ShopOperationWeb
ShoppicService
ShoppicWeb
ShopSearchWeb
ShopServer
ShopWeb
SMS-RECEIVER
SmsServer
SocialFeedMQ
SocialFeedServer
SocialRelationshipServer
UserBaseService
UserCashMQ
UserService
UserWeb
WapAccountWeb
GeoInfo
AccountMQ
MessageAdminWeb
AccountMQ
AccountServer
AccountWeb
ActivitybackWeb
ActivityService
ActivityWeb
AuditbackService
AuditbackWeb
AutoauditMQ
BadgeMQ
BaseDataServer
CheckinService
DecoratorServer
DPIndexWeb
FeedMQ
FeedServer
GroupService
GroupWeb
magicMirror
MailServer
MapService
PiccenterDisplay
PiccenterService
PiccenterStorage
PiccenterUpload
PiccenterWeb
PictureQualityScore
ReviewServer
ShopEvent
ShopListWeb
ShopManagementWeb
ShopOperationWeb
ShoppicService
ShoppicWeb
ShopSearchWeb
ShopServer
ShopWeb
SMS-RECEIVER
SmsServer
SocialFeedMQ
SocialFeedServer
SocialRelationshipServer
UserBaseService
UserCashMQ
UserService
UserWeb
WapAccountWeb
GeoInfo
AccountMQ
MessageAdminWeb
MessageMQ
MessageServer
MessageWeb
\ No newline at end of file
<front id="TuanGouWeb" type="project" status="1" des="11231">
<point id="TuanGouService" type="Service" status="2" des="OK" link=""></point>
<point id="UserBaseService" type="Service" status="2" des="OK" link=""></point>
<point id="Dianping" type="Database" status="2" des="OK" link=""></point>
<point id="TuanGou" type="Database" status="2" des="OK" link=""></point>
<side id="PigeonCall" target="TuanGouService" opposite="true" status="2" des="OK" link=""></side>
<side id="PigeonCall" target="UserBaseService" opposite="true" status="2" des="OK" link=""></side>
<side id="PigeonCall" target="TuanGouWeb" opposite="true" status="2" des="OK" link=""></side>
</front>
<graph id="TuanGouWeb" type="project" status="1" des="11231">
<node id="TuanGouService" type="Service" status="2" des="OK" link="" weight="1"></node>
<node id="UserBaseService" type="Service" status="2" des="OK" link=""></node>
<node id="Dianping" type="Database" status="2" des="OK" link=""></node>
<node id="TuanGou" type="Database" status="2" des="OK" link=""></node>
<edge key="1" type="PigeonCall" target="TuanGouService" opposite="true" weight="1" status="2" des="OK" link=""></edge>
<edge key="2" type="PigeonCall" target="UserBaseService" opposite="true" status="2" des="OK" link=""></edge>
<edge key="3" type="PigeonCall" target="TuanGouWeb" opposite="true" status="2" des="OK" link=""></edge>
</graph>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册