提交 741a17f9 编写于 作者: F Frankie Wu

add problem page

上级 8bfc8a20
......@@ -6,6 +6,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -141,7 +142,19 @@ public class FailureAnalyzer extends AbstractMessageAnalyzer<FailureReport> impl
@Override
protected void process(MessageTree tree) {
String domain = tree.getDomain();
FailureReport report = m_reports.get(domain);
if (report == null) {
report = new FailureReport();
report.setDomain(domain);
report.setStartTime(new Date(m_startTime));
report.setEndTime(new Date(m_startTime + MINUTE * 60 - 1));
m_reports.put(domain, report);
}
// TODO
}
public void setAnalyzerInfo(long startTime, long duration, String domain, long extraTime) {
......
......@@ -40,7 +40,6 @@ import com.site.lookup.annotation.Inject;
*/
public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionReport> implements Initializable,
LogEnabled {
private static final SimpleDateFormat FILE_SDF = new SimpleDateFormat("yyyyMMddHHmm");
private static final long MINUTE = 60 * 1000;
......
......@@ -19,7 +19,9 @@ com.dianping.cat.report.page.ip.Handler.class,
com.dianping.cat.report.page.service.Handler.class,
com.dianping.cat.report.page.model.Handler.class
com.dianping.cat.report.page.model.Handler.class,
com.dianping.cat.report.page.problem.Handler.class
})
public class ReportModule extends AbstractModule {
......
......@@ -7,17 +7,19 @@ public enum ReportPage implements Page {
HOME("home", "home", "Home", "CAT Home Page.", true),
TRANSACTION("transaction", "t", "Transaction", "CAL summary report for Transactions in current hour.", true),
TRANSACTION("transaction", "t", "Transaction", "CAT summary report for Transactions in current hour.", true),
FAILURE("failure", "f", "Failure", "CAL detail report for failure messages in current hour.", true),
FAILURE("failure", "f", "Failure", "CAT details report for failed messages in current hour.", true),
LOGVIEW("logview", "m", "Logview", "CAL log details view for a given message.", false),
LOGVIEW("logview", "m", "Logview", "CAT log details view for a given message.", false),
IP("ip", "ip", "Top IP List", "Top visited IP list in current hour.", true),
SERVICE("service", "service", "Service", "Service Home", false),
MODEL("model", "model", "Model", "Model Service", false);
MODEL("model", "model", "Model", "Model Service", false),
PROBLEM("problem", "p", "Problem", "Problem", true);
private String m_name;
......
......@@ -6,7 +6,6 @@ import java.util.List;
import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.message.spi.MessageConsumerRegistry;
import com.dianping.cat.message.spi.internal.DefaultMessageConsumerRegistry;
import com.dianping.cat.report.ReportModule;
import com.dianping.cat.report.ServerConfig;
import com.dianping.cat.report.graph.DefaultGraphBuilder;
import com.dianping.cat.report.graph.DefaultValueTranslater;
......@@ -14,21 +13,16 @@ import com.dianping.cat.report.graph.GraphBuilder;
import com.dianping.cat.report.graph.ValueTranslater;
import com.dianping.cat.report.page.failure.FailureManager;
import com.dianping.cat.report.page.ip.IpManager;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.page.model.transaction.CompositeTransactionModelService;
import com.dianping.cat.report.page.model.transaction.LocalTransactionModelService;
import com.dianping.cat.report.page.model.transaction.RemoteTransactionModelService;
import com.dianping.cat.report.page.service.provider.FailureModelProvider;
import com.dianping.cat.report.page.service.provider.IpModelProvider;
import com.dianping.cat.report.page.service.provider.ModelProvider;
import com.dianping.cat.report.page.service.provider.TransactionModelProvider;
import com.dianping.cat.report.page.transaction.TransactionManager;
import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component;
import com.site.web.configuration.AbstractWebComponentsConfigurator;
public class ComponentsConfigurator extends AbstractWebComponentsConfigurator {
public class ComponentsConfigurator extends AbstractResourceConfigurator {
@Override
@SuppressWarnings("unchecked")
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
......@@ -57,19 +51,14 @@ public class ComponentsConfigurator extends AbstractWebComponentsConfigurator {
all.add(C(IpManager.class));
all.add(C(ModelService.class, "transaction-local", LocalTransactionModelService.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "transaction-localhost", RemoteTransactionModelService.class) //
.config(E("host").value("localhost")));
all.add(C(ModelService.class, "transaction", CompositeTransactionModelService.class) //
.req(ModelService.class, new String[] { "transaction-local" }, "m_services"));
all.add(C(ValueTranslater.class, DefaultValueTranslater.class));
all.add(C(GraphBuilder.class, DefaultGraphBuilder.class) //
.req(ValueTranslater.class));
.req(ValueTranslater.class));
all.addAll(new ServiceComponentConfigurator().defineComponents());
// Please keep it last
defineModuleRegistry(all, ReportModule.class, ReportModule.class);
all.addAll(new WebComponentConfigurator().defineComponents());
return all;
}
......
package com.dianping.cat.report.build;
import java.util.ArrayList;
import java.util.List;
import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.report.page.model.failure.CompositeFailureModelService;
import com.dianping.cat.report.page.model.failure.LocalFailureModelService;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.page.model.transaction.CompositeTransactionModelService;
import com.dianping.cat.report.page.model.transaction.HdfsTransactionModelService;
import com.dianping.cat.report.page.model.transaction.LocalTransactionModelService;
import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component;
class ServiceComponentConfigurator extends AbstractResourceConfigurator {
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
all.add(C(ModelService.class, "transaction-local", LocalTransactionModelService.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "transaction-hdfs", HdfsTransactionModelService.class));
all.add(C(ModelService.class, "transaction", CompositeTransactionModelService.class) //
.req(ModelService.class, new String[] { "transaction-local", "transaction-hdfs" }, "m_services"));
all.add(C(ModelService.class, "failure-local", LocalFailureModelService.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "failure", CompositeFailureModelService.class) //
.req(ModelService.class, new String[] { "failure-local" }, "m_services"));
return all;
}
}
package com.dianping.cat.report.build;
import java.util.ArrayList;
import java.util.List;
import com.dianping.cat.report.ReportModule;
import com.site.lookup.configuration.Component;
import com.site.web.configuration.AbstractWebComponentsConfigurator;
class WebComponentConfigurator extends AbstractWebComponentsConfigurator {
@SuppressWarnings("unchecked")
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
defineModuleRegistry(all, ReportModule.class, ReportModule.class);
return all;
}
}
......@@ -25,7 +25,6 @@ import com.site.web.mvc.annotation.OutboundActionMeta;
import com.site.web.mvc.annotation.PayloadMeta;
public class Handler implements PageHandler<Context> {
@Inject
private ServerConfig serverConfig;
......
package com.dianping.cat.report.page.model.failure;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.dianping.cat.consumer.RealtimeConsumer;
import com.dianping.cat.consumer.failure.FailureAnalyzer;
import com.dianping.cat.consumer.failure.FailureReportAnalyzer;
import com.dianping.cat.consumer.failure.model.entity.FailureReport;
import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.report.page.model.spi.ModelPeriod;
......@@ -18,13 +23,14 @@ public class LocalFailureModelService implements ModelService<FailureReport> {
@Override
public ModelResponse<FailureReport> invoke(ModelRequest request) {
FailureAnalyzer analyzer = getAnalyzer(request.getPeriod());
FailureReportAnalyzer analyzer = getAnalyzer(request.getPeriod());
ModelResponse<FailureReport> response = new ModelResponse<FailureReport>();
if (analyzer != null) {
List<String> domains = analyzer.getDomains();
Map<String, FailureReport> reports = analyzer.getReports();
List<String> domains = getDomains(reports.keySet());
String d = request.getDomain();
FailureReport report = analyzer.getReport(d != null ? d : domains.isEmpty() ? null : domains.get(0));
FailureReport report = reports.get(d != null ? d : domains.isEmpty() ? null : domains.get(0));
if (report != null) {
for (String domain : domains) {
......@@ -38,11 +44,28 @@ public class LocalFailureModelService implements ModelService<FailureReport> {
return response;
}
private FailureAnalyzer getAnalyzer(ModelPeriod period) {
if (period.isCurrent()) {
return (FailureAnalyzer) m_consumer.getCurrentAnalyzer("failure");
public List<String> getDomains(Set<String> keys) {
List<String> domains = new ArrayList<String>(keys);
Collections.sort(domains, new Comparator<String>() {
@Override
public int compare(String d1, String d2) {
if (d1.equals("Cat")) {
return 1;
}
return d1.compareTo(d2);
}
});
return domains;
}
private FailureReportAnalyzer getAnalyzer(ModelPeriod period) {
if (period.isCurrent() || period.isFuture()) {
return (FailureReportAnalyzer) m_consumer.getCurrentAnalyzer("failure");
} else if (period.isLast()) {
return (FailureAnalyzer) m_consumer.getLastAnalyzer("failure");
return (FailureReportAnalyzer) m_consumer.getLastAnalyzer("failure");
} else {
return null;
}
......@@ -52,6 +75,6 @@ public class LocalFailureModelService implements ModelService<FailureReport> {
public boolean isEligable(ModelRequest request) {
ModelPeriod period = request.getPeriod();
return period.isCurrent() || period.isLast();
return !period.isHistorical();
}
}
......@@ -16,6 +16,12 @@ public class ModelRequest {
m_period = period;
}
public static ModelRequest from(String domain, String period) {
ModelRequest request = new ModelRequest(domain, ModelPeriod.getByName(period, ModelPeriod.CURRENT));
return request;
}
public String getDomain() {
return m_domain;
}
......@@ -49,9 +55,8 @@ public class ModelRequest {
return this;
}
public static ModelRequest from(String domain, String period) {
ModelRequest request = new ModelRequest(domain, ModelPeriod.getByName(period, ModelPeriod.CURRENT));
return request;
@Override
public String toString() {
return String.format("ModelRequest[domain=%s, period=%s, properties=%s]", m_domain, m_period, m_properties);
}
}
package com.dianping.cat.report.page.model.transaction;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
......@@ -15,11 +16,12 @@ import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
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.site.helper.Splitters;
import com.site.lookup.annotation.Inject;
public class CompositeTransactionModelService implements ModelService<TransactionReport>, Initializable {
@Inject
private List<ModelService<TransactionReport>> m_services;
private List<ModelService<TransactionReport>> m_services = new ArrayList<ModelService<TransactionReport>>();
private ExecutorService m_threadPool;
......@@ -92,6 +94,52 @@ public class CompositeTransactionModelService implements ModelService<Transactio
}
public void setSerivces(ModelService<TransactionReport>... services) {
m_services = Arrays.asList(services);
for (ModelService<TransactionReport> service : services) {
m_services.add(service);
}
}
/**
* Inject remote servers to load transaction model.
* <p>
*
* For example, servers: 192.168.1.1:2281,192.168.1.2,192.168.1.3
*
* @param servers
* server list separated by comma(',')
*/
public void setRemoteServers(String servers) {
List<String> endpoints = Splitters.by(',').split(servers);
String localAddress = null;
String localHost = null;
try {
localAddress = InetAddress.getLocalHost().getHostAddress();
localHost = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
// ignore it
}
for (String endpoint : endpoints) {
int pos = endpoint.indexOf(':');
String host = (pos > 0 ? endpoint.substring(0, pos) : endpoint);
int port = (pos > 0 ? Integer.parseInt(endpoint.substring(pos) + 1) : 2281);
if (port == 2281) {
if ("localhost".equals(host) || "127.0.0.1".equals(host)) {
// exclude localhost
continue;
} else if (host.equals(localAddress) || host.equals(localHost)) {
// exclude itself
continue;
}
}
RemoteTransactionModelService remote = new RemoteTransactionModelService();
remote.setHost(host);
remote.setPort(port);
m_services.add(remote);
}
}
}
package com.dianping.cat.report.page.model.transaction;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
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;
public class HdfsTransactionModelService implements ModelService<TransactionReport> {
@Override
public boolean isEligable(ModelRequest request) {
return request.getPeriod().isHistorical();
}
@Override
public ModelResponse<TransactionReport> invoke(ModelRequest request) {
// TODO
return null;
}
}
......@@ -24,12 +24,11 @@ public class LocalTransactionModelService implements ModelService<TransactionRep
if (analyzer != null) {
List<String> domains = analyzer.getDomains();
String d = request.getDomain();
TransactionReport report = analyzer.getReport(d != null ? d : domains.isEmpty() ? null : domains.get(0));
String domain = d != null ? d : domains.isEmpty() ? null : domains.get(0);
TransactionReport report = analyzer.getReport(domain);
if (report != null) {
for (String domain : domains) {
report.addDomain(domain);
}
report.getDomains().addAll(domains);
}
response.setModel(report);
......
......@@ -64,7 +64,7 @@ public class RemoteTransactionModelService implements ModelService<TransactionRe
public boolean isEligable(ModelRequest request) {
ModelPeriod period = request.getPeriod();
return period.isCurrent() || period.isLast();
return !period.isHistorical();
}
public void setHost(String host) {
......
package com.dianping.cat.report.page.model.transaction;
import java.util.List;
import com.dianping.cat.consumer.transaction.model.entity.Duration;
import com.dianping.cat.consumer.transaction.model.entity.Range;
import com.dianping.cat.consumer.transaction.model.entity.TransactionName;
......@@ -14,16 +12,6 @@ public class TransactionReportMerger extends DefaultMerger {
super(transactionReport);
}
public static TransactionReport merges(List<TransactionReport> reports) {
TransactionReportMerger merger = new TransactionReportMerger(new TransactionReport(""));
for (TransactionReport report : reports) {
report.accept(merger);
}
return merger.getTransactionReport();
}
@Override
protected void mergeDuration(Duration old, Duration duration) {
old.setCount(old.getCount() + duration.getCount());
......
package com.dianping.cat.report.page.problem;
public enum Action implements com.site.web.mvc.Action {
VIEW("view");
private String m_name;
private Action(String name) {
m_name = name;
}
public static Action getByName(String name, Action defaultAction) {
for (Action action : Action.values()) {
if (action.getName().equals(name)) {
return action;
}
}
return defaultAction;
}
@Override
public String getName() {
return m_name;
}
}
package com.dianping.cat.report.page.problem;
import com.dianping.cat.report.ReportContext;
public class Context extends ReportContext<Payload> {
}
package com.dianping.cat.report.page.problem;
import java.io.IOException;
import javax.servlet.ServletException;
import com.dianping.cat.consumer.failure.model.entity.FailureReport;
import com.dianping.cat.report.ReportPage;
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.site.lookup.annotation.Inject;
import com.site.web.mvc.PageHandler;
import com.site.web.mvc.annotation.InboundActionMeta;
import com.site.web.mvc.annotation.OutboundActionMeta;
import com.site.web.mvc.annotation.PayloadMeta;
public class Handler implements PageHandler<Context> {
@Inject
private JspViewer m_jspViewer;
@Inject(type = ModelService.class, value = "failure")
private ModelService<FailureReport> m_service;
private FailureReport getReport(Payload payload) {
String domain = payload.getDomain();
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("domain", domain) //
.setProperty("date", date) //
.setProperty("ipAddress", payload.getIpAddress());
if (m_service.isEligable(request)) {
ModelResponse<FailureReport> response = m_service.invoke(request);
FailureReport report = response.getModel();
return report;
} else {
throw new RuntimeException("Internal error: no eligable service registered for " + request + "!");
}
}
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "p")
public void handleInbound(Context ctx) throws ServletException, IOException {
// display only, no action here
}
@Override
@OutboundActionMeta(name = "p")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
Payload payload = ctx.getPayload();
model.setAction(Action.VIEW);
model.setPage(ReportPage.PROBLEM);
switch (payload.getAction()) {
case VIEW:
try {
FailureReport report = getReport(payload);
if (payload.getPeriod().isFuture()) {
model.setDate(payload.getCurrentDate());
} else {
model.setDate(payload.getDate());
}
model.setReport(report);
} catch (Throwable e) {
model.setException(e);
}
break;
}
m_jspViewer.view(ctx, model);
}
}
package com.dianping.cat.report.page.problem;
public enum JspFile {
VIEW("/jsp/report/problem.jsp"),
;
private String m_path;
private JspFile(String path) {
m_path = path;
}
public String getPath() {
return m_path;
}
}
package com.dianping.cat.report.page.problem;
import com.dianping.cat.report.ReportPage;
import com.site.web.mvc.view.BaseJspViewer;
public class JspViewer extends BaseJspViewer<ReportPage, Action, Context, Model> {
@Override
protected String getJspFilePath(Context ctx, Model model) {
Action action = model.getAction();
switch (action) {
case VIEW:
return JspFile.VIEW.getPath();
}
throw new RuntimeException("Unknown action: " + action);
}
}
package com.dianping.cat.report.page.problem;
import java.util.Collection;
import java.util.Collections;
import com.dianping.cat.consumer.failure.model.entity.FailureReport;
import com.dianping.cat.report.page.AbstractReportModel;
public class Model extends AbstractReportModel<Action, Context> {
private FailureReport m_report;
public Model(Context ctx) {
super(ctx);
}
@Override
public Action getDefaultAction() {
return Action.VIEW;
}
@Override
public Collection<String> getDomains() {
return Collections.emptyList();
}
public FailureReport getReport() {
return m_report;
}
public void setReport(FailureReport report) {
m_report = report;
}
}
package com.dianping.cat.report.page.problem;
import com.dianping.cat.report.ReportPage;
import com.dianping.cat.report.page.AbstractReportPayload;
import com.site.web.mvc.ActionContext;
import com.site.web.mvc.payload.annotation.FieldMeta;
public class Payload extends AbstractReportPayload<Action> {
public Payload() {
super(ReportPage.PROBLEM);
}
@FieldMeta("op")
private Action m_action;
@FieldMeta("ip")
private String m_ipAddress;
public void setAction(Action action) {
m_action = action;
}
@Override
public Action getAction() {
return m_action;
}
public String getIpAddress() {
return m_ipAddress;
}
public void setIpAddress(String ipAddress) {
m_ipAddress = ipAddress;
}
@Override
public void validate(ActionContext<?> ctx) {
if (m_action == null) {
m_action = Action.VIEW;
}
}
}
......@@ -48,6 +48,8 @@ public class TransactionModelProvider implements ModelProvider {
analyzer = (TransactionReportAnalyzer) m_consumer.getCurrentAnalyzer("transaction");
} else if (index.equals(Constants.MEMORY_LAST)) {
analyzer = (TransactionReportAnalyzer) m_consumer.getLastAnalyzer("transaction");
} else {
System.err.println("historical model is not implemented yet");
}
TransactionReport report = analyzer.generate(domain);
......
......@@ -45,12 +45,16 @@ public class Handler implements PageHandler<Context>, Initializable {
private MeanSquareDeviationComputer m_computer = new MeanSquareDeviationComputer();
private TransactionName getName(Payload payload) {
private TransactionName getTransactionName(Payload payload) {
String domain = payload.getDomain();
String type = payload.getType();
String name = payload.getName();
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("type", type).setProperty("name", name);
.setProperty("domain", domain) //
.setProperty("date", date) //
.setProperty("type", payload.getType())//
.setProperty("name", payload.getName());
ModelResponse<TransactionReport> response = m_service.invoke(request);
TransactionReport report = response.getModel();
TransactionType t = report.findType(type);
......@@ -70,11 +74,20 @@ public class Handler implements PageHandler<Context>, Initializable {
private TransactionReport getReport(Payload payload) {
String domain = payload.getDomain();
ModelRequest request = new ModelRequest(domain, payload.getPeriod());
ModelResponse<TransactionReport> response = m_service.invoke(request);
TransactionReport report = response.getModel();
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("domain", domain) //
.setProperty("date", date) //
.setProperty("type", payload.getType());
return report;
if (m_service.isEligable(request)) {
ModelResponse<TransactionReport> response = m_service.invoke(request);
TransactionReport report = response.getModel();
return report;
} else {
throw new RuntimeException("Internal error: no eligable service registered for " + request + "!");
}
}
@Override
......@@ -118,7 +131,7 @@ public class Handler implements PageHandler<Context>, Initializable {
}
private void showGraphs(Model model, Payload payload) {
final TransactionName name = getName(payload);
final TransactionName name = getTransactionName(payload);
if (name == null) {
return;
......
......@@ -6,10 +6,6 @@ import com.site.web.mvc.ActionContext;
import com.site.web.mvc.payload.annotation.FieldMeta;
public class Payload extends AbstractReportPayload<Action> {
public Payload() {
super(ReportPage.TRANSACTION);
}
@FieldMeta("op")
private Action m_action;
......@@ -19,6 +15,10 @@ public class Payload extends AbstractReportPayload<Action> {
@FieldMeta("name")
private String m_name;
public Payload() {
super(ReportPage.TRANSACTION);
}
@Override
public Action getAction() {
return m_action;
......
......@@ -13,6 +13,8 @@ public class NavigationBar {
ReportPage.TRANSACTION,
ReportPage.PROBLEM,
ReportPage.IP,
ReportPage.SERVICE,
......
......@@ -67,6 +67,19 @@
<role>com.dianping.cat.report.page.ip.IpManager</role>
<implementation>com.dianping.cat.report.page.ip.IpManager</implementation>
</component>
<component>
<role>com.dianping.cat.report.graph.ValueTranslater</role>
<implementation>com.dianping.cat.report.graph.DefaultValueTranslater</implementation>
</component>
<component>
<role>com.dianping.cat.report.graph.GraphBuilder</role>
<implementation>com.dianping.cat.report.graph.DefaultGraphBuilder</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.graph.ValueTranslater</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>transaction-local</role-hint>
......@@ -80,11 +93,8 @@
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>transaction-localhost</role-hint>
<implementation>com.dianping.cat.report.page.model.transaction.RemoteTransactionModelService</implementation>
<configuration>
<host>localhost</host>
</configuration>
<role-hint>transaction-hdfs</role-hint>
<implementation>com.dianping.cat.report.page.model.transaction.HdfsTransactionModelService</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
......@@ -95,21 +105,34 @@
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hints>
<role-hint>transaction-local</role-hint>
<role-hint>transaction-hdfs</role-hint>
</role-hints>
<field-name>m_services</field-name>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.graph.ValueTranslater</role>
<implementation>com.dianping.cat.report.graph.DefaultValueTranslater</implementation>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>failure-local</role-hint>
<implementation>com.dianping.cat.report.page.model.failure.LocalFailureModelService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
<role-hint>realtime</role-hint>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.graph.GraphBuilder</role>
<implementation>com.dianping.cat.report.graph.DefaultGraphBuilder</implementation>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>failure</role-hint>
<implementation>com.dianping.cat.report.page.model.failure.CompositeFailureModelService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.graph.ValueTranslater</role>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hints>
<role-hint>failure-local</role-hint>
</role-hints>
<field-name>m_services</field-name>
</requirement>
</requirements>
</component>
......@@ -175,10 +198,26 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.ServerConfig</role>
<implementation>com.dianping.cat.report.ServerConfig</implementation>
<requirements>
<requirement>
<role>java.util.List</role>
</requirement>
<requirement>
<role>java.lang.String</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.failure.JspViewer</role>
<implementation>com.dianping.cat.report.page.failure.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.failure.FailureManager</role>
<implementation>com.dianping.cat.report.page.failure.FailureManager</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.logview.Handler</role>
<implementation>com.dianping.cat.report.page.logview.Handler</implementation>
......@@ -214,6 +253,10 @@
<role>com.dianping.cat.report.page.ip.JspViewer</role>
<implementation>com.dianping.cat.report.page.ip.JspViewer</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.ip.IpManager</role>
<implementation>com.dianping.cat.report.page.ip.IpManager</implementation>
</component>
<component>
<role>com.dianping.cat.report.page.service.Handler</role>
<implementation>com.dianping.cat.report.page.service.Handler</implementation>
......@@ -301,5 +344,23 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.problem.Handler</role>
<implementation>com.dianping.cat.report.page.problem.Handler</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.report.page.problem.JspViewer</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>failure</role-hint>
<field-name>m_service</field-name>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.problem.JspViewer</role>
<implementation>com.dianping.cat.report.page.problem.JspViewer</implementation>
</component>
</components>
</plexus>
......@@ -23,6 +23,9 @@
<page name="model" title="Model" path="model" standalone="false">
<description>Model Service</description>
</page>
<page name="problem" title="Problem" path="p">
<description>Problem</description>
</page>
</module>
</webapp>
</wizard>
......
......@@ -11,7 +11,7 @@
<a:report title="Hot IP Report" timestamp="2012-02-07">
<jsp:body>
${model.b}
<table class="ip-table">
<tr><th>IP</th><th>last 1 min</th><th>last 5 mins</th><th>last 15 mins</th></tr>
<c:forEach var="m" items="${model.displayModels}" varStatus="status">
......
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ taglib prefix="w" uri="/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.problem.Context" scope="request"/>
<jsp:useBean id="payload" type="com.dianping.cat.report.page.problem.Payload" scope="request"/>
<jsp:useBean id="model" type="com.dianping.cat.report.page.problem.Model" scope="request"/>
<c:set var="report" value="${model.report}"/>
<res:useCss value="${res.css.local.problem_css}" target="head-css"/>
<res:useJs value="${res.js.local['jquery-1.7.1.js']}" target="head-js"/>
<res:useJs value="${res.js.local.problem_js}" target="head-js"/>
<a:report title="Problem Report" timestamp="${w:format(model.currentTime,'yyyy-MM-dd HH:mm:ss')}">
<jsp:attribute name="subtitle">From ${w:format(report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(report.endTime,'yyyy-MM-dd HH:mm:ss')}</jsp:attribute>
<jsp:body>
Hello, Problem
</jsp:body>
</a:report>
\ No newline at end of file
......@@ -18,7 +18,7 @@
<jsp:attribute name="subtitle">From ${w:format(report.startTime,'yyyy-MM-dd HH:mm:ss')} to ${w:format(report.endTime,'yyyy-MM-dd HH:mm:ss')}</jsp:attribute>
<jsp:body>
<table class="transaction" border="0">
<table class="transaction">
<tr><th>${empty payload.type ? "Type" : "Name"}</th><th>Total Count</th><th>Failure Count</th><th>Failure%</th><th>Sample Link</th><th>Min/Max/Avg/Std(ms)</th></tr>
<c:choose>
<c:when test="${empty payload.type}">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册