提交 45bc627a 编写于 作者: F Frankie Wu

get domain from model, then from payload

上级 3ace76cb
......@@ -74,7 +74,15 @@ public class IpAnalyzer extends AbstractMessageAnalyzer<IpReport> {
@Override
public List<IpReport> generate() {
return null;
List<IpReport> reports = new ArrayList<IpReport>(m_reports.size());
for (String domain : m_reports.keySet()) {
IpReport report = getReport(domain);
reports.add(report);
}
return reports;
}
public IpReport getReport(String domain) {
......@@ -135,10 +143,6 @@ public class IpAnalyzer extends AbstractMessageAnalyzer<IpReport> {
return null;
}
public Map<String, IpReport> getReports() {
return m_reports;
}
@Override
protected boolean isTimeout() {
return false;
......
......@@ -59,7 +59,8 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
.config(E("remoteServers").value(remoteServers)));
all.add(C(ModelService.class, "ip-local", LocalIpService.class) //
.req(MessageConsumer.class, "realtime"));
.req(MessageConsumer.class, "realtime") //
.config(E("defaultDomain").value(defaultDomain)));
all.add(C(ModelService.class, "ip", CompositeIpService.class) //
.req(ModelService.class, new String[] { "ip-local" }, "m_services") //
.config(E("remoteServers").value(remoteServers)));
......
......@@ -15,6 +15,8 @@ public abstract class AbstractReportModel<A extends Action, M extends ActionCont
private long m_date;
private String m_defaultDomain;
public AbstractReportModel(M ctx) {
super(ctx);
}
......@@ -33,9 +35,13 @@ public abstract class AbstractReportModel<A extends Action, M extends ActionCont
return m_date;
}
protected String getDefaultDomain() {
return m_defaultDomain;
}
// required by report tag
public abstract String getDomain();
// required by report tag
public abstract Collection<String> getDomains();
......@@ -56,6 +62,10 @@ public abstract class AbstractReportModel<A extends Action, M extends ActionCont
m_date = date;
}
public void setDefaultDomain(String defaultDomain) {
m_defaultDomain = defaultDomain;
}
public void setException(Throwable exception) {
m_exception = exception;
}
......
......@@ -105,6 +105,7 @@ public class Handler implements PageHandler<Context>, Initializable {
model.setAction(payload.getAction());
model.setPage(ReportPage.EVENT);
model.setDefaultDomain(payload.getDomain());
switch (payload.getAction()) {
case VIEW:
......
......@@ -33,7 +33,7 @@ public class Model extends AbstractReportModel<Action, Context> {
@Override
public String getDomain() {
if (m_report == null) {
return null;
return getDefaultDomain();
} else {
return m_report.getDomain();
}
......
......@@ -11,6 +11,7 @@ import java.util.Map;
import javax.servlet.ServletException;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.ip.model.entity.Ip;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.entity.Period;
......@@ -72,6 +73,7 @@ public class Handler implements PageHandler<Context> {
model.setAction(Action.VIEW);
model.setPage(ReportPage.IP);
model.setDefaultDomain(payload.getDomain());
switch (payload.getAction()) {
case VIEW:
......@@ -99,6 +101,7 @@ public class Handler implements PageHandler<Context> {
model.setDisplayModels(displayModels);
model.setReport(report);
} catch (Throwable e) {
Cat.getProducer().logError(e);
model.setException(e);
}
}
......
......@@ -30,7 +30,7 @@ public class Model extends AbstractReportModel<Action, Context> {
@Override
public String getDomain() {
if (m_report == null) {
return null;
return getDefaultDomain();
} else {
return m_report.getDomain();
}
......
package com.dianping.cat.report.page.model.ip;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import com.dianping.cat.Cat;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.transform.DefaultMerger;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.internal.DefaultEvent;
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;
public class CompositeIpService implements ModelService<IpReport>, Initializable {
@Inject
private List<ModelService<IpReport>> m_services;
import com.dianping.cat.report.page.model.spi.internal.BaseCompositeModelService;
import com.dianping.cat.report.page.model.spi.internal.BaseRemoteModelService;
private ExecutorService m_threadPool;
public class CompositeIpService extends BaseCompositeModelService<IpReport> {
public CompositeIpService() {
super("ip");
}
@Override
public void initialize() throws InitializationException {
m_threadPool = Executors.newFixedThreadPool(10);
protected BaseRemoteModelService<IpReport> createRemoteService() {
return new RemoteIpService();
}
@Override
public ModelResponse<IpReport> invoke(final ModelRequest request) {
int size = m_services.size();
final List<ModelResponse<IpReport>> responses = new ArrayList<ModelResponse<IpReport>>(size);
final CountDownLatch latch = new CountDownLatch(size);
final Transaction t = Cat.getProducer().newTransaction("ModelService", "Ip");
t.setStatus(Message.SUCCESS);
t.addData("request", request);
for (final ModelService<IpReport> service : m_services) {
m_threadPool.submit(new Runnable() {
@Override
public void run() {
try {
responses.add(service.invoke(request));
t.addData(service.toString());
logEvent(t, "Client", "Ip", Message.SUCCESS, service.toString());
} catch (Exception e) {
logError(t, e);
t.setStatus(e);
} finally {
latch.countDown();
}
}
void logError(Transaction t, Throwable cause) {
StringWriter writer = new StringWriter(2048);
cause.printStackTrace(new PrintWriter(writer));
if (cause instanceof Error) {
logEvent(t, "Error", cause.getClass().getName(), "ERROR", writer.toString());
} else if (cause instanceof RuntimeException) {
logEvent(t, "RuntimeException", cause.getClass().getName(), "ERROR", writer.toString());
} else {
logEvent(t, "Exception", cause.getClass().getName(), "ERROR", writer.toString());
}
}
void logEvent(Transaction t, String type, String name, String status, String nameValuePairs) {
Event event = new DefaultEvent(type, name);
if (nameValuePairs != null && nameValuePairs.length() > 0) {
event.addData(nameValuePairs);
}
event.setStatus(status);
event.complete();
t.addChild(event);
}
});
}
try {
latch.await(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
t.setStatus(e);// ignore it
} finally {
t.complete();
}
ModelResponse<IpReport> aggregated = new ModelResponse<IpReport>();
DefaultMerger merger = null;
protected IpReport merge(List<ModelResponse<IpReport>> responses) {
IpReportMerger merger = null;
for (ModelResponse<IpReport> response : responses) {
if (response != null) {
......@@ -115,32 +35,6 @@ public class CompositeIpService implements ModelService<IpReport>, Initializable
}
}
aggregated.setModel(merger == null ? null : merger.getIpReport());
return aggregated;
}
@Override
public boolean isEligable(ModelRequest request) {
for (ModelService<IpReport> service : m_services) {
if (service.isEligable(request)) {
return true;
}
}
return false;
}
public void setSerivces(ModelService<IpReport>... services) {
m_services = Arrays.asList(services);
}
public void setRemoteServers(String servers) {
return merger == null ? null : merger.getIpReport();
}
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
package com.dianping.cat.report.page.model.ip;
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.ip.IpAnalyzer;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.entity.AllDomains;
import com.dianping.cat.message.spi.MessageConsumer;
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.site.lookup.annotation.Inject;
public class LocalIpService implements ModelService<IpReport> {
@Inject(type = MessageConsumer.class, value = "realtime")
private RealtimeConsumer m_consumer;
@Override
public ModelResponse<IpReport> invoke(ModelRequest request) {
IpAnalyzer analyzer = getAnalyzer(request.getPeriod());
ModelResponse<IpReport> response = new ModelResponse<IpReport>();
if (analyzer != null) {
Map<String, IpReport> reports = analyzer.getReports();
List<String> domains = getDomains(reports.keySet());
String d = request.getDomain();
String domain = d != null && d.length() > 0 ? d : domains.isEmpty() ? null : domains.get(0);
IpReport report = reports.get(domain);
if (report != null) {
AllDomains allDomains = new AllDomains();
allDomains.getDomains().addAll(domains);
report.setAllDomains(allDomains);
}
response.setModel(report);
}
return response;
}
import com.dianping.cat.report.page.model.spi.internal.BaseLocalModelService;
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 IpAnalyzer getAnalyzer(ModelPeriod period) {
if (period.isCurrent() || period.isFuture()) {
return (IpAnalyzer) m_consumer.getCurrentAnalyzer("ip");
} else if (period.isLast()) {
return (IpAnalyzer) m_consumer.getLastAnalyzer("ip");
} else {
return null;
}
public class LocalIpService extends BaseLocalModelService<IpReport> {
public LocalIpService() {
super("ip");
}
@Override
public boolean isEligable(ModelRequest request) {
ModelPeriod period = request.getPeriod();
return !period.isHistorical();
}
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
package com.dianping.cat.report.page.model.ip;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;
import java.io.IOException;
import org.xml.sax.SAXException;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.transform.DefaultXmlParser;
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.site.helper.Files;
import com.site.helper.Joiners;
import com.site.helper.Joiners.IBuilder;
import com.site.lookup.annotation.Inject;
public class RemoteIpService implements ModelService<IpReport> {
@Inject
private String m_host;
@Inject
private int m_port = 2281; // default admin port
import com.dianping.cat.report.page.model.spi.internal.BaseRemoteModelService;
@Inject
private String m_serviceUri = "/cat/r/model";
URL buildUrl(ModelRequest request) throws MalformedURLException {
String pairs = Joiners.by('&').prefixDelimiter()
.join(request.getProperties().entrySet(), new IBuilder<Map.Entry<String, String>>() {
@Override
public String asString(Entry<String, String> e) {
return e.getKey() + "=" + e.getValue();
}
});
String url = String.format("http://%s:%s%s/%s/%s/%s?op=xml%s", m_host, m_port, m_serviceUri, "ip",
request.getDomain(), request.getPeriod(), pairs);
return new URL(url);
public class RemoteIpService extends BaseRemoteModelService<IpReport> {
public RemoteIpService() {
super("ip");
}
@Override
public ModelResponse<IpReport> invoke(ModelRequest request) {
ModelResponse<IpReport> response = new ModelResponse<IpReport>();
try {
URL url = buildUrl(request);
String xml = Files.forIO().readFrom(url.openStream(), "utf-8");
if (xml != null && xml.trim().length() > 0) {
IpReport report = new DefaultXmlParser().parse(xml);
response.setModel(report);
}
} catch (Exception e) {
response.setException(e);
}
return response;
protected IpReport buildModel(String xml) throws SAXException, IOException {
return new DefaultXmlParser().parse(xml);
}
@Override
public boolean isEligable(ModelRequest request) {
ModelPeriod period = request.getPeriod();
return period.isCurrent() || period.isLast();
}
public void setHost(String host) {
m_host = host;
}
public void setPort(int port) {
m_port = port;
}
public void setServiceUri(String serviceUri) {
m_serviceUri = serviceUri;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
......@@ -42,7 +42,7 @@ public class BaseLocalModelService<T> extends ModelServiceWithCalSupport impleme
if (analyzer instanceof AbstractMessageAnalyzer) {
AbstractMessageAnalyzer<T> a = (AbstractMessageAnalyzer<T>) analyzer;
if (domain == null) {
if (domain == null || domain.length() == 0) {
return a.getReport(m_defaultDomain);
} else {
return a.getReport(domain);
......
......@@ -98,6 +98,7 @@ public class Handler implements PageHandler<Context> {
model.setAction(payload.getAction());
model.setPage(ReportPage.PROBLEM);
model.setDefaultDomain(payload.getDomain());
switch (payload.getAction()) {
case VIEW:
......
......@@ -51,7 +51,7 @@ public class Model extends AbstractReportModel<Action, Context> {
@Override
public String getDomain() {
if (m_report == null) {
return null;
return getDefaultDomain();
} else {
return m_report.getDomain();
}
......
......@@ -41,9 +41,11 @@ public class Handler implements PageHandler<Context> {
@OutboundActionMeta(name = "sql")
public void handleOutbound(Context ctx) throws ServletException, IOException {
Model model = new Model(ctx);
model.setPage(ReportPage.SQL);
Payload payload = ctx.getPayload();
model.setPage(ReportPage.SQL);
model.setDefaultDomain(payload.getDomain());
Action action = payload.getAction();
if (action == null || action == Action.VIEW) {
model.setAction(Action.VIEW);
......@@ -52,6 +54,7 @@ public class Handler implements PageHandler<Context> {
model.setAction(Action.GRAPHS);
showGraphs(model, payload);
}
m_jspViewer.view(ctx, model);
}
......
......@@ -38,7 +38,7 @@ public class Model extends AbstractReportModel<Action, Context> {
@Override
public String getDomain() {
if (m_report == null) {
return null;
return getDefaultDomain();
} else {
return m_report.getDomain();
}
......
......@@ -106,6 +106,7 @@ public class Handler implements PageHandler<Context>, Initializable {
model.setAction(payload.getAction());
model.setPage(ReportPage.TRANSACTION);
model.setDefaultDomain(payload.getDomain());
switch (payload.getAction()) {
case VIEW:
......
......@@ -33,7 +33,7 @@ public class Model extends AbstractReportModel<Action, Context> {
@Override
public String getDomain() {
if (m_report == null) {
return null;
return getDefaultDomain();
} else {
return m_report.getDomain();
}
......
......@@ -156,6 +156,9 @@
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>ip-local</role-hint>
<implementation>com.dianping.cat.report.page.model.ip.LocalIpService</implementation>
<configuration>
<defaultDomain>Cat</defaultDomain>
</configuration>
<requirements>
<requirement>
<role>com.dianping.cat.message.spi.MessageConsumer</role>
......
......@@ -19,7 +19,7 @@
<ul class="tabs">
<c:forEach var="page" items="${navBar.visiblePages}">
<c:if test="${page.standalone}">
<li ${model.page.name == page.name ? 'class="selected"' : ''}><a href="${model.webapp}/${page.moduleName}/${page.path}">${page.title}</a></li>
<li ${model.page.name == page.name ? 'class="selected"' : ''}><a href="${model.webapp}/${page.moduleName}/${page.path}?domain=${model.domain}&date=${model.date}">${page.title}</a></li>
</c:if>
<c:if test="${not page.standalone and model.page.name == page.name}">
<li class="selected">${page.title}</li>
......
......@@ -25,6 +25,7 @@
<c:when test="${empty payload.type}">
<c:forEach var="type" items="${report.types}" varStatus="status">
<c:set var="e" value="${type.value}"/>
<c:set var="lastIndex" value="${status.index}"/>
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td><a href="?domain=${report.domain}&date=${model.date}&type=${e.id}">${e.id}</a></td>
<td>${e.totalCount}</td>
......@@ -37,6 +38,7 @@
<c:otherwise>
<c:forEach var="name" items="${report.types[payload.type].names}" varStatus="status">
<c:set var="e" value="${name.value}"/>
<c:set var="lastIndex" value="${status.index}"/>
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td><a href="?op=graphs&domain=${report.domain}&date=${model.date}&type=${payload.type}&name=${e.id}" onclick="return showGraphs(this,${status.index},${model.date},'${report.domain}','${payload.type}','${e.id}',${payload.period.current});">[:: show ::]</a> ${e.id}</td>
<td>${e.totalCount}</td>
......@@ -49,7 +51,7 @@
</c:otherwise>
</c:choose>
</table>
<br>
<font color="white">${lastIndex+1}</font>
</jsp:body>
......
......@@ -25,6 +25,7 @@
<c:when test="${empty payload.type}">
<c:forEach var="type" items="${report.types}" varStatus="status">
<c:set var="e" value="${type.value}"/>
<c:set var="lastIndex" value="${status.index}"/>
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td><a href="?domain=${report.domain}&date=${model.date}&type=${e.id}">${e.id}</a></td>
<td>${e.totalCount}</td>
......@@ -38,6 +39,7 @@
<c:otherwise>
<c:forEach var="name" items="${report.types[payload.type].names}" varStatus="status">
<c:set var="e" value="${name.value}"/>
<c:set var="lastIndex" value="${status.index}"/>
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td><a href="?op=graphs&domain=${report.domain}&date=${model.date}&type=${payload.type}&name=${e.id}" onclick="return showGraphs(this,${status.index},${model.date},'${report.domain}','${payload.type}','${e.id}',${payload.period.current});">[:: show ::]</a> ${e.id}</td>
<td>${e.totalCount}</td>
......@@ -51,7 +53,7 @@
</c:otherwise>
</c:choose>
</table>
<br>
<font color="white">${lastIndex+1}</font>
</jsp:body>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册