提交 20e27f4f 编写于 作者: Y youyong205

Merge pull request #584 from leonindy/master

fix serval bugs found in code review
...@@ -16,6 +16,7 @@ import com.dianping.cat.consumer.metric.MetricConfigManager; ...@@ -16,6 +16,7 @@ import com.dianping.cat.consumer.metric.MetricConfigManager;
import com.dianping.cat.consumer.metric.ProductLineConfigManager; import com.dianping.cat.consumer.metric.ProductLineConfigManager;
import com.dianping.cat.consumer.problem.ProblemAnalyzer; import com.dianping.cat.consumer.problem.ProblemAnalyzer;
import com.dianping.cat.consumer.top.TopAnalyzer; import com.dianping.cat.consumer.top.TopAnalyzer;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.core.config.ConfigDao; import com.dianping.cat.core.config.ConfigDao;
import com.dianping.cat.home.dal.report.AlertDao; import com.dianping.cat.home.dal.report.AlertDao;
import com.dianping.cat.home.dal.report.AlertSummaryDao; import com.dianping.cat.home.dal.report.AlertSummaryDao;
...@@ -67,17 +68,13 @@ import com.dianping.cat.report.task.alert.sender.spliter.Spliter; ...@@ -67,17 +68,13 @@ import com.dianping.cat.report.task.alert.sender.spliter.Spliter;
import com.dianping.cat.report.task.alert.sender.spliter.SpliterManager; import com.dianping.cat.report.task.alert.sender.spliter.SpliterManager;
import com.dianping.cat.report.task.alert.sender.spliter.WeixinSpliter; import com.dianping.cat.report.task.alert.sender.spliter.WeixinSpliter;
import com.dianping.cat.report.task.alert.service.AlertEntityService; import com.dianping.cat.report.task.alert.service.AlertEntityService;
import com.dianping.cat.report.task.alert.summary.AlertSummaryDataGenerator; import com.dianping.cat.report.task.alert.summary.AlertSummaryContentGenerator;
import com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor; import com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor;
import com.dianping.cat.report.task.alert.summary.AlertSummaryFTLDecorator;
import com.dianping.cat.report.task.alert.summary.AlertSummaryGenerator; import com.dianping.cat.report.task.alert.summary.AlertSummaryGenerator;
import com.dianping.cat.report.task.alert.summary.AlertSummaryManager; import com.dianping.cat.report.task.alert.summary.AlertSummaryManager;
import com.dianping.cat.report.task.alert.summary.AlterationDataGenerator; import com.dianping.cat.report.task.alert.summary.AlterationSummaryContentGenerator;
import com.dianping.cat.report.task.alert.summary.AlterationDecorator; import com.dianping.cat.report.task.alert.summary.FailureSummaryContentGenerator;
import com.dianping.cat.report.task.alert.summary.FailureDataGenerator; import com.dianping.cat.report.task.alert.summary.SummaryContentGenerator;
import com.dianping.cat.report.task.alert.summary.FailureDecorator;
import com.dianping.cat.report.task.alert.summary.SummaryDataGenerator;
import com.dianping.cat.report.task.alert.summary.SummaryDecorator;
import com.dianping.cat.report.task.alert.system.SystemAlert; import com.dianping.cat.report.task.alert.system.SystemAlert;
import com.dianping.cat.report.task.alert.thirdParty.HttpConnector; import com.dianping.cat.report.task.alert.thirdParty.HttpConnector;
import com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlert; import com.dianping.cat.report.task.alert.thirdParty.ThirdPartyAlert;
...@@ -185,8 +182,9 @@ class AlarmComponentConfigurator extends AbstractResourceConfigurator { ...@@ -185,8 +182,9 @@ class AlarmComponentConfigurator extends AbstractResourceConfigurator {
all.add(C(HeartbeatAlert.class) all.add(C(HeartbeatAlert.class)
.req(ProductLineConfigManager.class, BaselineService.class) .req(ProductLineConfigManager.class, BaselineService.class)
.req(ProjectService.class, RemoteMetricReportService.class, HeartbeatRuleConfigManager.class, .req(RemoteMetricReportService.class, HeartbeatRuleConfigManager.class, DataChecker.class,
DataChecker.class, AlertManager.class, AlertInfo.class).req(ModelService.class, HeartbeatAnalyzer.ID)); AlertManager.class, AlertInfo.class).req(ModelService.class, HeartbeatAnalyzer.ID, "m_service")
.req(ModelService.class, TransactionAnalyzer.ID, "m_transactionService"));
all.add(C(SystemAlert.class).req(ProductLineConfigManager.class, BaselineService.class, AlertInfo.class).req( all.add(C(SystemAlert.class).req(ProductLineConfigManager.class, BaselineService.class, AlertInfo.class).req(
RemoteMetricReportService.class, SystemRuleConfigManager.class, DataChecker.class, AlertManager.class)); RemoteMetricReportService.class, SystemRuleConfigManager.class, DataChecker.class, AlertManager.class));
...@@ -217,28 +215,20 @@ class AlarmComponentConfigurator extends AbstractResourceConfigurator { ...@@ -217,28 +215,20 @@ class AlarmComponentConfigurator extends AbstractResourceConfigurator {
all.add(C(AlertSummaryManager.class).req(AlertSummaryDao.class)); all.add(C(AlertSummaryManager.class).req(AlertSummaryDao.class));
all.add(C(SummaryDataGenerator.class, AlertSummaryDataGenerator.ID, AlertSummaryDataGenerator.class).req( all.add(C(SummaryContentGenerator.class, AlertSummaryContentGenerator.ID, AlertSummaryContentGenerator.class).req(
AlertSummaryGenerator.class, AlertSummaryManager.class)); AlertSummaryGenerator.class, AlertSummaryManager.class));
all.add(C(SummaryDataGenerator.class, FailureDataGenerator.ID, FailureDataGenerator.class).req( all.add(C(SummaryContentGenerator.class, FailureSummaryContentGenerator.ID, FailureSummaryContentGenerator.class).req(
ModelService.class, ProblemAnalyzer.ID)); ModelService.class, ProblemAnalyzer.ID));
all.add(C(SummaryDataGenerator.class, AlterationDataGenerator.ID, AlterationDataGenerator.class).req( all.add(C(SummaryContentGenerator.class, AlterationSummaryContentGenerator.ID, AlterationSummaryContentGenerator.class).req(
AlterationDao.class)); AlterationDao.class));
all.add(C(SummaryDecorator.class, AlertSummaryFTLDecorator.ID, AlertSummaryFTLDecorator.class)); all.add(C(AlertSummaryExecutor.class)
.req(SenderManager.class)
all.add(C(SummaryDecorator.class, FailureDecorator.ID, FailureDecorator.class)); .req(SummaryContentGenerator.class, AlertSummaryContentGenerator.ID, "m_alertSummaryContentGenerator")
.req(SummaryContentGenerator.class, FailureSummaryContentGenerator.ID, "m_failureSummaryContentGenerator")
all.add(C(SummaryDecorator.class, AlterationDecorator.ID, AlterationDecorator.class)); .req(SummaryContentGenerator.class, AlterationSummaryContentGenerator.ID, "m_alterationSummaryContentGenerator"));
all.add(C(AlertSummaryExecutor.class).req(SenderManager.class)
.req(SummaryDataGenerator.class, AlertSummaryDataGenerator.ID, "m_alertSummaryDataGenerator")
.req(SummaryDataGenerator.class, FailureDataGenerator.ID, "m_failureDataGenerator")
.req(SummaryDataGenerator.class, AlterationDataGenerator.ID, "m_alterationDataGenerator")
.req(SummaryDecorator.class, AlertSummaryFTLDecorator.ID, "m_alertSummaryDecorator")
.req(SummaryDecorator.class, FailureDecorator.ID, "m_failureDecorator")
.req(SummaryDecorator.class, AlterationDecorator.ID, "m_alterationDecorator"));
return all; return all;
} }
......
...@@ -103,16 +103,6 @@ public class CacheReport { ...@@ -103,16 +103,6 @@ public class CacheReport {
return result; return result;
} }
public List<String> getAllMethods() {
CacheNameItem allItem = m_nameItems.get(ALL);
if (allItem != null) {
return new ArrayList<String>(allItem.getMethodCounts().keySet());
} else {
return new ArrayList<String>();
}
}
public java.util.Date getStartTime() { public java.util.Date getStartTime() {
return m_startTime; return m_startTime;
} }
...@@ -160,14 +150,18 @@ public class CacheReport { ...@@ -160,14 +150,18 @@ public class CacheReport {
private long m_missed; private long m_missed;
private long m_getCount; private long m_add;
private long m_get;
private long m_mget;
private long m_remove;
private TransactionName m_name; private TransactionName m_name;
private String m_category; private String m_category;
private Map<String, Long> m_methodCounts = new HashMap<String, Long>();
public void add(TransactionName transactionName, EventName eventName, String method) { public void add(TransactionName transactionName, EventName eventName, String method) {
long transactionTotalCount = transactionName.getTotalCount(); long transactionTotalCount = transactionName.getTotalCount();
...@@ -177,16 +171,16 @@ public class CacheReport { ...@@ -177,16 +171,16 @@ public class CacheReport {
m_name.setTps(m_name.getTps() + transactionName.getTps()); m_name.setTps(m_name.getTps() + transactionName.getTps());
if (!StringUtil.isEmpty(method)) { if (!StringUtil.isEmpty(method)) {
Long value = m_methodCounts.get(method);
if (value == null) {
value = 0L;
}
m_methodCounts.put(method, value + transactionTotalCount);
if ("get".equals(method)) { if ("get".equals(method)) {
m_get += transactionTotalCount;
m_missed = m_missed + eventName.getTotalCount(); m_missed = m_missed + eventName.getTotalCount();
m_getCount = m_getCount + transactionTotalCount; m_hited = 1 - (double) m_missed / m_get;
m_hited = 1 - (double) m_missed / m_getCount; } else if ("mget".equals(method)) {
m_mget += transactionTotalCount;
} else if ("add".equals(method)) {
m_add += transactionTotalCount;
} else if ("remove".equals(method)) {
m_remove += transactionTotalCount;
} }
} }
} }
...@@ -199,26 +193,28 @@ public class CacheReport { ...@@ -199,26 +193,28 @@ public class CacheReport {
return m_missed; return m_missed;
} }
public TransactionName getName() { public long getAdd() {
return m_name; return m_add;
} }
public String getCategory() { public long getGet() {
return m_category; return m_get;
} }
public Map<String, Long> getMethodCounts() { public long getMget() {
return m_methodCounts; return m_mget;
} }
public long getMethodCount(String method) { public long getRemove() {
Long count = m_methodCounts.get(method); return m_remove;
}
if (count == null) { public TransactionName getName() {
return 0L; return m_name;
} else { }
return count;
} public String getCategory() {
return m_category;
} }
public void setHited(double hited) { public void setHited(double hited) {
...@@ -260,9 +256,14 @@ public class CacheReport { ...@@ -260,9 +256,14 @@ public class CacheReport {
return (int) (o2.getName().getAvg() * 1000 - o1.getName().getAvg() * 1000); return (int) (o2.getName().getAvg() * 1000 - o1.getName().getAvg() * 1000);
} else if (m_sort.equals("name")) { } else if (m_sort.equals("name")) {
return o1.getName().getId().compareTo(o2.getName().getId()); return o1.getName().getId().compareTo(o2.getName().getId());
} else if (m_sort.startsWith("method:")) { } else if (m_sort.equals("add")) {
String method = m_sort.substring(7); return (int) (o2.getAdd() - o1.getAdd());
return (int) (o2.getMethodCount(method) - o1.getMethodCount(method)); } else if (m_sort.equals("get")) {
return (int) (o2.getGet() - o1.getGet());
} else if (m_sort.equals("mget")) {
return (int) (o2.getMget() - o1.getMget());
} else if (m_sort.equals("remove")) {
return (int) (o2.getRemove() - o1.getRemove());
} }
return 0; return 0;
} }
......
package com.dianping.cat.report.task.alert.heartbeat; package com.dianping.cat.report.task.alert.heartbeat;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
...@@ -14,6 +15,8 @@ import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer; ...@@ -14,6 +15,8 @@ import com.dianping.cat.consumer.heartbeat.HeartbeatAnalyzer;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport; import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.heartbeat.model.entity.Machine; import com.dianping.cat.consumer.heartbeat.model.entity.Machine;
import com.dianping.cat.consumer.heartbeat.model.entity.Period; import com.dianping.cat.consumer.heartbeat.model.entity.Period;
import com.dianping.cat.consumer.transaction.TransactionAnalyzer;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.helper.TimeHelper; import com.dianping.cat.helper.TimeHelper;
import com.dianping.cat.home.rule.entity.Condition; import com.dianping.cat.home.rule.entity.Condition;
import com.dianping.cat.home.rule.entity.Config; import com.dianping.cat.home.rule.entity.Config;
...@@ -25,16 +28,15 @@ import com.dianping.cat.report.task.alert.BaseAlert; ...@@ -25,16 +28,15 @@ import com.dianping.cat.report.task.alert.BaseAlert;
import com.dianping.cat.report.task.alert.sender.AlertEntity; import com.dianping.cat.report.task.alert.sender.AlertEntity;
import com.dianping.cat.service.ModelRequest; import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.service.ModelResponse; import com.dianping.cat.service.ModelResponse;
import com.dianping.cat.service.ProjectService;
public class HeartbeatAlert extends BaseAlert implements Task { public class HeartbeatAlert extends BaseAlert implements Task {
@Inject
private ProjectService m_projectService;
@Inject(type = ModelService.class, value = HeartbeatAnalyzer.ID) @Inject(type = ModelService.class, value = HeartbeatAnalyzer.ID)
private ModelService<HeartbeatReport> m_service; private ModelService<HeartbeatReport> m_service;
@Inject(type = ModelService.class, value = TransactionAnalyzer.ID)
private ModelService<TransactionReport> m_transactionService;
private static final String[] m_metrics = { "ThreadCount", "DaemonCount", "TotalStartedCount", "CatThreadCount", private static final String[] m_metrics = { "ThreadCount", "DaemonCount", "TotalStartedCount", "CatThreadCount",
"PiegonThreadCount", "HttpThreadCount", "NewGcCount", "OldGcCount", "MemoryFree", "HeapUsage", "PiegonThreadCount", "HttpThreadCount", "NewGcCount", "OldGcCount", "MemoryFree", "HeapUsage",
"NoneHeapUsage", "SystemLoadAverage", "CatMessageOverflow", "CatMessageSize" }; "NoneHeapUsage", "SystemLoadAverage", "CatMessageOverflow", "CatMessageSize" };
...@@ -220,6 +222,17 @@ public class HeartbeatAlert extends BaseAlert implements Task { ...@@ -220,6 +222,17 @@ public class HeartbeatAlert extends BaseAlert implements Task {
} }
} }
private Set<String> queryDomains() {
Set<String> domains = new HashSet<String>();
ModelRequest request = new ModelRequest("cat", System.currentTimeMillis());
if (m_transactionService.isEligable(request)) {
ModelResponse<TransactionReport> response = m_transactionService.invoke(request);
domains.addAll(response.getModel().getDomainNames());
}
return domains;
}
@Override @Override
public void run() { public void run() {
boolean active = true; boolean active = true;
...@@ -234,7 +247,9 @@ public class HeartbeatAlert extends BaseAlert implements Task { ...@@ -234,7 +247,9 @@ public class HeartbeatAlert extends BaseAlert implements Task {
long current = System.currentTimeMillis(); long current = System.currentTimeMillis();
try { try {
for (String domain : m_projectService.findAllDomain()) { Set<String> domains = queryDomains();
for (String domain : domains) {
try { try {
processDomain(domain); processDomain(domain);
} catch (Exception e) { } catch (Exception e) {
......
...@@ -10,7 +10,7 @@ import org.unidal.lookup.annotation.Inject; ...@@ -10,7 +10,7 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.home.alert.summary.entity.AlertSummary; import com.dianping.cat.home.alert.summary.entity.AlertSummary;
public class AlertSummaryDataGenerator extends SummaryDataGenerator { public class AlertSummaryContentGenerator extends SummaryContentGenerator {
@Inject @Inject
private AlertSummaryGenerator m_alertSummaryGenerator; private AlertSummaryGenerator m_alertSummaryGenerator;
...@@ -18,7 +18,7 @@ public class AlertSummaryDataGenerator extends SummaryDataGenerator { ...@@ -18,7 +18,7 @@ public class AlertSummaryDataGenerator extends SummaryDataGenerator {
@Inject @Inject
private AlertSummaryManager m_alertSummaryManager; private AlertSummaryManager m_alertSummaryManager;
public static final String ID = "AlertSummaryDataGenerator"; public static final String ID = "AlertSummaryContentGenerator";
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Map<Object, Object> gatherDomainsForDependBusiness(Map<Object, Object> map) { private Map<Object, Object> gatherDomainsForDependBusiness(Map<Object, Object> map) {
...@@ -64,4 +64,10 @@ public class AlertSummaryDataGenerator extends SummaryDataGenerator { ...@@ -64,4 +64,10 @@ public class AlertSummaryDataGenerator extends SummaryDataGenerator {
public String getID() { public String getID() {
return ID; return ID;
} }
@Override
protected String getTemplateAddress() {
return "summary.ftl";
}
} }
...@@ -5,7 +5,6 @@ import java.util.ArrayList; ...@@ -5,7 +5,6 @@ import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import org.unidal.lookup.annotation.Inject; import org.unidal.lookup.annotation.Inject;
...@@ -19,23 +18,14 @@ import com.site.lookup.util.StringUtils; ...@@ -19,23 +18,14 @@ import com.site.lookup.util.StringUtils;
public class AlertSummaryExecutor { public class AlertSummaryExecutor {
@Inject(type = SummaryDataGenerator.class, value = AlertSummaryDataGenerator.ID) @Inject(type = SummaryContentGenerator.class, value = AlertSummaryContentGenerator.ID)
private SummaryDataGenerator m_alertSummaryDataGenerator; private SummaryContentGenerator m_alertSummaryContentGenerator;
@Inject(type = SummaryDataGenerator.class, value = FailureDataGenerator.ID) @Inject(type = SummaryContentGenerator.class, value = FailureSummaryContentGenerator.ID)
private SummaryDataGenerator m_failureDataGenerator; private SummaryContentGenerator m_failureSummaryContentGenerator;
@Inject(type = SummaryDataGenerator.class, value = AlterationDataGenerator.ID) @Inject(type = SummaryContentGenerator.class, value = AlterationSummaryContentGenerator.ID)
private SummaryDataGenerator m_alterationDataGenerator; private SummaryContentGenerator m_alterationSummaryContentGenerator;
@Inject(type = SummaryDecorator.class, value = AlertSummaryFTLDecorator.ID)
private SummaryDecorator m_alertSummaryDecorator;
@Inject(type = SummaryDecorator.class, value = FailureDecorator.ID)
private SummaryDecorator m_failureDecorator;
@Inject(type = SummaryDecorator.class, value = AlterationDecorator.ID)
private SummaryDecorator m_alterationDecorator;
@Inject @Inject
private SenderManager m_sendManager; private SenderManager m_sendManager;
...@@ -72,16 +62,13 @@ public class AlertSummaryExecutor { ...@@ -72,16 +62,13 @@ public class AlertSummaryExecutor {
try { try {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
Map<Object, Object> summaryModel = m_alertSummaryDataGenerator.generateModel(domain, date); String summaryContent = m_alertSummaryContentGenerator.generateHtml(domain, date);
String summaryContent = m_alertSummaryDecorator.generateHtml(summaryModel);
builder.append(summaryContent); builder.append(summaryContent);
Map<Object, Object> failureModel = m_failureDataGenerator.generateModel(domain, date); String failureContext = m_failureSummaryContentGenerator.generateHtml(domain, date);
String failureContext = m_failureDecorator.generateHtml(failureModel);
builder.append(failureContext); builder.append(failureContext);
Map<Object, Object> alterationModel = m_alterationDataGenerator.generateModel(domain, date); String alterationContext = m_alterationSummaryContentGenerator.generateHtml(domain, date);
String alterationContext = m_alterationDecorator.generateHtml(alterationModel);
builder.append(alterationContext); builder.append(alterationContext);
t.setStatus(Transaction.SUCCESS); t.setStatus(Transaction.SUCCESS);
......
package com.dianping.cat.report.task.alert.summary;
public class AlertSummaryFTLDecorator extends SummaryDecorator {
public static final String ID = "AlertSummaryFTLDecorator";
@Override
protected String getID() {
return ID;
}
@Override
protected String getTemplateAddress() {
return "summary.ftl";
}
}
package com.dianping.cat.report.task.alert.summary;
public class AlterationDecorator extends SummaryDecorator {
public static final String ID = "AlterationDecorator";
@Override
protected String getID() {
return ID;
}
@Override
protected String getTemplateAddress() {
return "alterationInfo.ftl";
}
}
...@@ -13,13 +13,13 @@ import com.dianping.cat.home.dal.report.Alteration; ...@@ -13,13 +13,13 @@ import com.dianping.cat.home.dal.report.Alteration;
import com.dianping.cat.home.dal.report.AlterationDao; import com.dianping.cat.home.dal.report.AlterationDao;
import com.dianping.cat.home.dal.report.AlterationEntity; import com.dianping.cat.home.dal.report.AlterationEntity;
public class AlterationDataGenerator extends SummaryDataGenerator { public class AlterationSummaryContentGenerator extends SummaryContentGenerator {
public static final String ID = "AlterationDataGenerator";
@Inject @Inject
private AlterationDao m_alterationDao; private AlterationDao m_alterationDao;
public static final String ID = "AlterationSummaryContentGenerator";
@Override @Override
public Map<Object, Object> generateModel(String domain, Date date) { public Map<Object, Object> generateModel(String domain, Date date) {
Map<Object, Object> dataMap = new HashMap<Object, Object>(); Map<Object, Object> dataMap = new HashMap<Object, Object>();
...@@ -36,13 +36,18 @@ public class AlterationDataGenerator extends SummaryDataGenerator { ...@@ -36,13 +36,18 @@ public class AlterationDataGenerator extends SummaryDataGenerator {
return dataMap; return dataMap;
} }
@Override
public String getID() {
return ID;
}
private Date getStartDate(Date date) { private Date getStartDate(Date date) {
return new Date(date.getTime() - AlertSummaryExecutor.SUMMARY_DURATION); return new Date(date.getTime() - AlertSummaryExecutor.SUMMARY_DURATION);
} }
@Override @Override
public String getID() { protected String getTemplateAddress() {
return ID; return "alterationInfo.ftl";
} }
} }
package com.dianping.cat.report.task.alert.summary;
public class FailureDecorator extends SummaryDecorator {
public static final String ID = "FailureDecorator";
@Override
protected String getID() {
return ID;
}
@Override
protected String getTemplateAddress() {
return "errorInfo.ftl";
}
}
...@@ -19,9 +19,9 @@ import com.dianping.cat.report.page.problem.ProblemStatistics.TypeStatistics; ...@@ -19,9 +19,9 @@ import com.dianping.cat.report.page.problem.ProblemStatistics.TypeStatistics;
import com.dianping.cat.service.ModelRequest; import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.service.ModelResponse; import com.dianping.cat.service.ModelResponse;
public class FailureDataGenerator extends SummaryDataGenerator { public class FailureSummaryContentGenerator extends SummaryContentGenerator {
public static final String ID = "FailureDataGenerator"; public static final String ID = "FailureDecorator";
@Inject(type = ModelService.class, value = ProblemAnalyzer.ID) @Inject(type = ModelService.class, value = ProblemAnalyzer.ID)
private ModelService<ProblemReport> m_service; private ModelService<ProblemReport> m_service;
...@@ -89,4 +89,10 @@ public class FailureDataGenerator extends SummaryDataGenerator { ...@@ -89,4 +89,10 @@ public class FailureDataGenerator extends SummaryDataGenerator {
public String getID() { public String getID() {
return ID; return ID;
} }
@Override
protected String getTemplateAddress() {
return "errorInfo.ftl";
}
} }
package com.dianping.cat.report.task.alert.summary; package com.dianping.cat.report.task.alert.summary;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.Date;
import java.util.Map; import java.util.Map;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
...@@ -11,11 +12,14 @@ import com.dianping.cat.Cat; ...@@ -11,11 +12,14 @@ import com.dianping.cat.Cat;
import freemarker.template.Configuration; import freemarker.template.Configuration;
import freemarker.template.Template; import freemarker.template.Template;
public abstract class SummaryDecorator implements Initializable { public abstract class SummaryContentGenerator implements Initializable {
public Configuration m_configuration; public Configuration m_configuration;
public String generateHtml(Map<Object, Object> dataMap) { protected abstract Map<Object, Object> generateModel(String domain, Date date);
public String generateHtml(String domain, Date date) {
Map<Object, Object> dataMap = generateModel(domain, date);
StringWriter sw = new StringWriter(5000); StringWriter sw = new StringWriter(5000);
try { try {
...@@ -40,5 +44,5 @@ public abstract class SummaryDecorator implements Initializable { ...@@ -40,5 +44,5 @@ public abstract class SummaryDecorator implements Initializable {
protected abstract String getTemplateAddress(); protected abstract String getTemplateAddress();
protected abstract String getID(); public abstract String getID();
} }
package com.dianping.cat.report.task.alert.summary;
import java.util.Date;
import java.util.Map;
public abstract class SummaryDataGenerator {
public abstract Map<Object, Object> generateModel(String domain, Date date);
public abstract String getID();
}
...@@ -2706,9 +2706,6 @@ ...@@ -2706,9 +2706,6 @@
<requirement> <requirement>
<role>com.dianping.cat.report.baseline.BaselineService</role> <role>com.dianping.cat.report.baseline.BaselineService</role>
</requirement> </requirement>
<requirement>
<role>com.dianping.cat.service.ProjectService</role>
</requirement>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.RemoteMetricReportService</role> <role>com.dianping.cat.report.task.alert.RemoteMetricReportService</role>
</requirement> </requirement>
...@@ -2727,6 +2724,12 @@ ...@@ -2727,6 +2724,12 @@
<requirement> <requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role> <role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>heartbeat</role-hint> <role-hint>heartbeat</role-hint>
<field-name>m_service</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>transaction</role-hint>
<field-name>m_transactionService</field-name>
</requirement> </requirement>
</requirements> </requirements>
</component> </component>
...@@ -2898,9 +2901,9 @@ ...@@ -2898,9 +2901,9 @@
</requirements> </requirements>
</component> </component>
<component> <component>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>AlertSummaryDataGenerator</role-hint> <role-hint>AlertSummaryContentGenerator</role-hint>
<implementation>com.dianping.cat.report.task.alert.summary.AlertSummaryDataGenerator</implementation> <implementation>com.dianping.cat.report.task.alert.summary.AlertSummaryContentGenerator</implementation>
<requirements> <requirements>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.summary.AlertSummaryGenerator</role> <role>com.dianping.cat.report.task.alert.summary.AlertSummaryGenerator</role>
...@@ -2911,9 +2914,9 @@ ...@@ -2911,9 +2914,9 @@
</requirements> </requirements>
</component> </component>
<component> <component>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>FailureDataGenerator</role-hint> <role-hint>FailureDecorator</role-hint>
<implementation>com.dianping.cat.report.task.alert.summary.FailureDataGenerator</implementation> <implementation>com.dianping.cat.report.task.alert.summary.FailureSummaryContentGenerator</implementation>
<requirements> <requirements>
<requirement> <requirement>
<role>com.dianping.cat.report.page.model.spi.ModelService</role> <role>com.dianping.cat.report.page.model.spi.ModelService</role>
...@@ -2922,30 +2925,15 @@ ...@@ -2922,30 +2925,15 @@
</requirements> </requirements>
</component> </component>
<component> <component>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>AlterationDataGenerator</role-hint> <role-hint>AlterationSummaryContentGenerator</role-hint>
<implementation>com.dianping.cat.report.task.alert.summary.AlterationDataGenerator</implementation> <implementation>com.dianping.cat.report.task.alert.summary.AlterationSummaryContentGenerator</implementation>
<requirements> <requirements>
<requirement> <requirement>
<role>com.dianping.cat.home.dal.report.AlterationDao</role> <role>com.dianping.cat.home.dal.report.AlterationDao</role>
</requirement> </requirement>
</requirements> </requirements>
</component> </component>
<component>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role>
<role-hint>AlertSummaryFTLDecorator</role-hint>
<implementation>com.dianping.cat.report.task.alert.summary.AlertSummaryFTLDecorator</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role>
<role-hint>FailureDecorator</role-hint>
<implementation>com.dianping.cat.report.task.alert.summary.FailureDecorator</implementation>
</component>
<component>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role>
<role-hint>AlterationDecorator</role-hint>
<implementation>com.dianping.cat.report.task.alert.summary.AlterationDecorator</implementation>
</component>
<component> <component>
<role>com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor</role> <role>com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor</role>
<implementation>com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor</implementation> <implementation>com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor</implementation>
...@@ -2954,34 +2942,19 @@ ...@@ -2954,34 +2942,19 @@
<role>com.dianping.cat.report.task.alert.sender.sender.SenderManager</role> <role>com.dianping.cat.report.task.alert.sender.sender.SenderManager</role>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>AlertSummaryDataGenerator</role-hint> <role-hint>AlertSummaryContentGenerator</role-hint>
<field-name>m_alertSummaryDataGenerator</field-name> <field-name>m_alertSummaryContentGenerator</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role>
<role-hint>FailureDataGenerator</role-hint>
<field-name>m_failureDataGenerator</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role>
<role-hint>AlterationDataGenerator</role-hint>
<field-name>m_alterationDataGenerator</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role>
<role-hint>AlertSummaryFTLDecorator</role-hint>
<field-name>m_alertSummaryDecorator</field-name>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>FailureDecorator</role-hint> <role-hint>FailureDecorator</role-hint>
<field-name>m_failureDecorator</field-name> <field-name>m_failureSummaryContentGenerator</field-name>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>AlterationDecorator</role-hint> <role-hint>AlterationSummaryContentGenerator</role-hint>
<field-name>m_alterationDecorator</field-name> <field-name>m_alterationSummaryContentGenerator</field-name>
</requirement> </requirement>
</requirements> </requirements>
</component> </component>
...@@ -4100,34 +4073,19 @@ ...@@ -4100,34 +4073,19 @@
<implementation>com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor</implementation> <implementation>com.dianping.cat.report.task.alert.summary.AlertSummaryExecutor</implementation>
<requirements> <requirements>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>AlertSummaryDataGenerator</role-hint> <role-hint>AlertSummaryContentGenerator</role-hint>
<field-name>m_alertSummaryDataGenerator</field-name> <field-name>m_alertSummaryContentGenerator</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role>
<role-hint>FailureDataGenerator</role-hint>
<field-name>m_failureDataGenerator</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDataGenerator</role>
<role-hint>AlterationDataGenerator</role-hint>
<field-name>m_alterationDataGenerator</field-name>
</requirement>
<requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role>
<role-hint>AlertSummaryFTLDecorator</role-hint>
<field-name>m_alertSummaryDecorator</field-name>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>FailureDecorator</role-hint> <role-hint>FailureDecorator</role-hint>
<field-name>m_failureDecorator</field-name> <field-name>m_failureSummaryContentGenerator</field-name>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.summary.SummaryDecorator</role> <role>com.dianping.cat.report.task.alert.summary.SummaryContentGenerator</role>
<role-hint>AlterationDecorator</role-hint> <role-hint>AlterationSummaryContentGenerator</role-hint>
<field-name>m_alterationDecorator</field-name> <field-name>m_alterationSummaryContentGenerator</field-name>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.cat.report.task.alert.sender.sender.SenderManager</role> <role>com.dianping.cat.report.task.alert.sender.sender.SenderManager</role>
......
...@@ -77,9 +77,8 @@ ...@@ -77,9 +77,8 @@
<div class="row-fluid"> <div class="row-fluid">
<div class="span7"> <div class="span7">
<table class="data" style="min-width:900px"> <table class="data" style="min-width:900px">
<c:set var="methods" value="${model.report.allMethods}"/>
<tr> <tr>
<th class="left" colspan='${fn:length(methods) + 6}'><input type="text" <th class="left" colspan='10'><input type="text"
name="queryname" id="queryname" size="40" name="queryname" id="queryname" size="40"
value="${model.queryName}"> value="${model.queryName}">
<input id="queryname" style="WIDTH: 60px" <input id="queryname" style="WIDTH: 60px"
...@@ -102,9 +101,10 @@ ...@@ -102,9 +101,10 @@
<a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=type&queryname=${model.queryName}">Name</a> <a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=type&queryname=${model.queryName}">Name</a>
</th> </th>
<th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=total&queryname=${model.queryName}">Total</a></th> <th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=total&queryname=${model.queryName}">Total</a></th>
<c:forEach var="method" items="${methods}"> <th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=get&queryname=${model.queryName}">Get</a></th>
<th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=method:${method}&queryname=${model.queryName}">${method}</a></th> <th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=mget&queryname=${model.queryName}">mGet</a></th>
</c:forEach> <th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=add&queryname=${model.queryName}">Add</a></th>
<th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=remove&queryname=${model.queryName}">Remove</a></th>
<th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=missed&queryname=${model.queryName}">Missed</a></th> <th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=missed&queryname=${model.queryName}">Missed</a></th>
<th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=hitPercent&queryname=${model.queryName}">Hit Rate(%)</a></th> <th class="right"><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=hitPercent&queryname=${model.queryName}">Hit Rate(%)</a></th>
<th class="right"><a href="?domain=${model.domain}&date=${model.date}&type=${payload.type}&sort=avg&queryname=${model.queryName}">Avg</a>(ms)</th> <th class="right"><a href="?domain=${model.domain}&date=${model.date}&type=${payload.type}&sort=avg&queryname=${model.queryName}">Avg</a>(ms)</th>
...@@ -118,16 +118,10 @@ ...@@ -118,16 +118,10 @@
<td <td
style="text-align: left; word-wrap: break-word; word-break: break-all;">${w:shorten(e.id, 80)}</td> style="text-align: left; word-wrap: break-word; word-break: break-all;">${w:shorten(e.id, 80)}</td>
<td>${w:format(e.totalCount,'#,###,###,###,##0')}</td> <td>${w:format(e.totalCount,'#,###,###,###,##0')}</td>
<c:forEach var="method" items="${methods}"> <td>${w:format(item.get,'#,###,###,###,##0')}</td>
<c:choose> <td>${w:format(item.mget,'#,###,###,###,##0')}</td>
<c:when test="${empty item.methodCounts[method]}"> <td>${w:format(item.add,'#,###,###,###,##0')}</td>
<td>0</td> <td>${w:format(item.remove,'#,###,###,###,##0')}</td>
</c:when>
<c:otherwise>
<td>${w:format(item.methodCounts[method],'#,###,###,###,##0')}</td>
</c:otherwise>
</c:choose>
</c:forEach>
<td>${item.missed}</td> <td>${item.missed}</td>
<td>${w:format(item.hited,'0.0000%')}</td> <td>${w:format(item.hited,'0.0000%')}</td>
<td>${w:format(e.avg,'0.0')}</td> <td>${w:format(e.avg,'0.0')}</td>
......
...@@ -70,9 +70,8 @@ ...@@ -70,9 +70,8 @@
<div class="row-fluid"> <div class="row-fluid">
<div class="span7"> <div class="span7">
<table class="data" style="min-width:900px"> <table class="data" style="min-width:900px">
<c:set var="methods" value="${model.report.allMethods}"/>
<tr> <tr>
<th class="left" colspan='${fn:length(methods) + 6}'><input type="text" <th class="left" colspan='10'><input type="text"
name="queryname" id="queryname" size="40" name="queryname" id="queryname" size="40"
value="${model.queryName}"> value="${model.queryName}">
<input id="queryname" style="WIDTH: 60px" <input id="queryname" style="WIDTH: 60px"
...@@ -98,9 +97,10 @@ ...@@ -98,9 +97,10 @@
<a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=type&queryname=${model.queryName}">Name</a> <a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=type&queryname=${model.queryName}">Name</a>
</th> </th>
<th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=total&queryname=${model.queryName}">Total</a></th> <th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=total&queryname=${model.queryName}">Total</a></th>
<c:forEach var="method" items="${methods}"> <th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=get&queryname=${model.queryName}">Get</a></th>
<th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=method:${method}&queryname=${model.queryName}">${method}</a></th> <th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=mget&queryname=${model.queryName}">mGet</a></th>
</c:forEach> <th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=add&queryname=${model.queryName}">Add</a></th>
<th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=remove&queryname=${model.queryName}">Remove</a></th>
<th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=missed&queryname=${model.queryName}">Missed</a></th> <th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=missed&queryname=${model.queryName}">Missed</a></th>
<th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=hitPercent&queryname=${model.queryName}">Hit Rate(%)</a></th> <th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=hitPercent&queryname=${model.queryName}">Hit Rate(%)</a></th>
<th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&type=${payload.type}&sort=avg&queryname=${model.queryName}">Avg</a>(ms)</th> <th class="right"><a href="?op=history&domain=${model.domain}&reportType=${model.reportType}${model.customDate}&date=${model.date}&type=${payload.type}&sort=avg&queryname=${model.queryName}">Avg</a>(ms)</th>
...@@ -115,16 +115,10 @@ ...@@ -115,16 +115,10 @@
style="text-align: left; word-wrap: break-word; word-break: break-all;"> style="text-align: left; word-wrap: break-word; word-break: break-all;">
${w:shorten(e.id, 80)}</td> ${w:shorten(e.id, 80)}</td>
<td>${w:format(e.totalCount,'#,###,###,###,##0')}</td> <td>${w:format(e.totalCount,'#,###,###,###,##0')}</td>
<c:forEach var="method" items="${methods}"> <td>${w:format(item.get,'#,###,###,###,##0')}</td>
<c:choose> <td>${w:format(item.mget,'#,###,###,###,##0')}</td>
<c:when test="${empty item.methodCounts[method]}"> <td>${w:format(item.add,'#,###,###,###,##0')}</td>
<td>0</td> <td>${w:format(item.remove,'#,###,###,###,##0')}</td>
</c:when>
<c:otherwise>
<td>${w:format(item.methodCounts[method],'#,###,###,###,##0')}</td>
</c:otherwise>
</c:choose>
</c:forEach>
<td>${item.missed}</td> <td>${item.missed}</td>
<td>${w:format(item.hited,'0.0000%')}</td> <td>${w:format(item.hited,'0.0000%')}</td>
<td>${w:format(e.avg,'0.0')}</td> <td>${w:format(e.avg,'0.0')}</td>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册