提交 3dbacc0c 编写于 作者: F Frankie Wu

merge

上级 eb0ecded
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.3.0</version>
<version>0.3.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-consumer</artifactId>
......
package com.dianping.cat.consumer.problem.model;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import org.junit.Test;
import com.dianping.cat.consumer.problem.model.transform.BaseVisitor;
import com.dianping.cat.consumer.problem2.model.entity.Duration;
import com.dianping.cat.consumer.problem2.model.entity.Entry;
import com.dianping.cat.consumer.problem2.model.entity.JavaThread;
import com.dianping.cat.consumer.problem2.model.entity.Machine;
import com.dianping.cat.consumer.problem2.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem2.model.entity.Segment;
import com.site.helper.Files;
public class Problem2ReportTest {
@Test
public void testXml() throws Exception {
String source = Files.forIO().readFrom(new File("/Users/qmwu/Downloads/LAST.xml"), "utf-8");
com.dianping.cat.consumer.problem.model.entity.ProblemReport p1 = com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser
.parse(source);
ProblemReport p2 = new ProblemReport(p1.getDomain());
ProblemConverter converter = new ProblemConverter(p2);
p1.accept(converter);
System.out.println("old size: " + p1.toString().length());
System.out.println("new size: " + p2.toString().length());
// junit.framework.Assert.assertEquals(p1.toString(), p2.toString());
}
static class ProblemConverter extends BaseVisitor {
private Stack<Object> m_stack = new Stack<Object>();
private Map<String, Object> m_map = new HashMap<String, Object>();
public ProblemConverter(ProblemReport root) {
m_stack.push(root);
}
@Override
public void visitEntry(com.dianping.cat.consumer.problem.model.entity.Entry entry) {
String type = entry.getType();
String status = entry.getStatus();
int duration = entry.getDuration();
String messageId = entry.getMessageId();
Entry e = (Entry) get("entry", type + ":" + status);
if (e == null) {
Machine parent = (Machine) m_stack.peek();
e = new Entry().setType(type).setStatus(status);
parent.addEntry(e);
set("entry", type + ":" + status, e);
}
if (duration > 1000) {
duration = duration - duration % 1000;
} else {
duration = duration - duration % 100;
}
Duration d = e.findOrCreateDuration(duration);
d.incCount();
boolean limitedMessage = true;
if (!limitedMessage || limitedMessage && d.getMessages().size() < 60) {
d.addMessage(messageId);
}
boolean needThread = false;
if (needThread) {
JavaThread t = e.findOrCreateThread((String) get("thread", "id"));
Segment s = t.findOrCreateSegment((Integer) get("segment", "id"));
if (t.getGroupName() == null) {
t.setGroupName((String) get("thread", "groupName"));
t.setName((String) get("thread", "name"));
}
s.incCount();
s.addMessage(messageId);
}
}
@Override
public void visitMachine(com.dianping.cat.consumer.problem.model.entity.Machine machine) {
ProblemReport parent = (ProblemReport) m_stack.peek();
Machine m = new Machine();
m.setIp(machine.getIp());
parent.addMachine(m);
m_stack.push(m);
super.visitMachine(machine);
m_stack.pop();
}
@Override
public void visitProblemReport(com.dianping.cat.consumer.problem.model.entity.ProblemReport problemReport) {
ProblemReport root = (ProblemReport) m_stack.peek();
root.setStartTime(problemReport.getStartTime());
root.setEndTime(problemReport.getEndTime());
root.getDomainNames().addAll(problemReport.getDomainNames());
root.getIps().addAll(problemReport.getIps());
super.visitProblemReport(problemReport);
}
@Override
public void visitSegment(com.dianping.cat.consumer.problem.model.entity.Segment segment) {
set("segment", "id", segment.getId());
super.visitSegment(segment);
}
@Override
public void visitThread(com.dianping.cat.consumer.problem.model.entity.JavaThread thread) {
set("thread", "groupName", thread.getGroupName());
set("thread", "name", thread.getName());
set("thread", "id", thread.getId());
super.visitThread(thread);
}
@SuppressWarnings("unchecked")
private <T> T get(String group, String key) {
return (T) m_map.get(group + ":" + key);
}
private void set(String group, String key, Object value) {
m_map.put(group + ":" + key, value);
}
}
}
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.3.0</version>
<version>0.3.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-core</artifactId>
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.3.0</version>
<version>0.3.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-hadoop</artifactId>
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.3.0</version>
<version>0.3.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-home</artifactId>
......
......@@ -23,7 +23,7 @@ public enum ReportPage implements Page {
SQL("sql", "sql", "SQL", "SQL Report", true),
HEATMAP("heatmap", "heatmap", "Heatmap", "Heatmap", true),
HEATMAP("heatmap", "heatmap", "Heatmap", "Heatmap", false),
DASHBOARD("dashboard", "dashboard", "Dashboard", "Dashboard", true);
......
......@@ -80,16 +80,20 @@ public abstract class AbstractReportPayload<A extends Action> implements ActionP
m_date = temp;
}
}
// yestoday is default
if ("day".equals(m_reportType)) {
Calendar today = Calendar.getInstance();
long current = getCurrentDate();
today.setTimeInMillis(current);
today.set(Calendar.HOUR_OF_DAY, 0);
if (m_date == today.getTimeInMillis()) {
m_date = m_date - 24 * ONE_HOUR;
}
// yestoday is default
public void defaultIsYesterday(){
if ("day".equals(m_reportType)) {
Calendar today = Calendar.getInstance();
long current = getCurrentDate();
today.setTimeInMillis(current);
today.set(Calendar.HOUR_OF_DAY, 0);
if (m_date == today.getTimeInMillis()) {
m_date = m_date - 24 * ONE_HOUR;
}
}
}
}
public Date getHistoryStartDate() {
......
......@@ -33,8 +33,6 @@ public class Handler implements PageHandler<Context> {
private Gson m_gson = new Gson();
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
@PayloadMeta(Payload.class)
@InboundActionMeta(name = "dashboard")
......@@ -52,7 +50,7 @@ public class Handler implements PageHandler<Context> {
TransactionReport catReport = getHourlyReport("Cat");
Set<String> domains = catReport.getDomainNames();
Map<String, String> data = new HashMap<String, String>();
data.put("timestamp", sdf.format(new Date()));
data.put("timestamp", String.valueOf(new Date().getTime()));
TransactionReport report = null;
for (String domain : domains) {
......
......@@ -24,9 +24,8 @@ public class DisplayEventNameReport {
Map<String, EventType> types = report.getMachines().get(ip).getTypes();
if (types != null) {
EventType names = types.get(type);
for (Entry<String, EventName> entry : names.getNames().entrySet()) {
m_results.add(new EventNameModel(entry.getKey(), entry.getValue()));
for (Entry<String, EventName> entry : names.getNames().entrySet()) {
m_results.add(new EventNameModel(entry.getKey(), entry.getValue()));
}
}
if (!StringUtils.isEmpty(sorted)) {
......
......@@ -223,6 +223,7 @@ public class Handler implements PageHandler<Context> {
if (eventReport == null) {
return;
}
eventReport.setDomain(model.getDisplayDomain());
model.setReport(eventReport);
if (!StringUtils.isEmpty(type)) {
model.setDisplayNameReport(new DisplayEventNameReport().display(sorted, type, ip, eventReport));
......@@ -256,6 +257,7 @@ public class Handler implements PageHandler<Context> {
}
model.setReportType(payload.getReportType());
payload.computeStartDate();
payload.defaultIsYesterday();
model.setLongDate(payload.getDate());
}
}
......
......@@ -22,7 +22,7 @@ import com.site.lookup.annotation.Inject;
public abstract class BaseCompositeModelService<T> extends ModelServiceWithCalSupport implements ModelService<T>,
Initializable {
private static ExecutorService s_threadPool = Threads.forPool().getFixedThreadPool("Cat-ModelService", 10);
private static ExecutorService s_threadPool = Threads.forPool().getFixedThreadPool("Cat-ModelService", 50);
@Inject
private List<ModelService<T>> m_services;
......
......@@ -298,6 +298,7 @@ public class Handler implements PageHandler<Context> {
}
model.setReportType(payload.getReportType());
payload.computeStartDate();
payload.defaultIsYesterday();
model.setLongDate(payload.getDate());
}
}
......
......@@ -71,11 +71,6 @@ public class Handler implements PageHandler<Context> {
model.setMobileResponse(gson.toJson(report));
break;
}
if (payload.getPeriod().isCurrent()) {
model.setCreatTime(new Date());
} else {
model.setCreatTime(new Date(payload.getDate() + 60 * 60 * 1000 - 1000));
}
m_jspViewer.view(ctx, model);
}
......
......@@ -219,7 +219,7 @@ public class Handler implements PageHandler<Context> {
item.setStart(start);
item.setSize(size);
item.setTitles(display + " Response Time");
item.setTitles(display + " Response Time (ms)");
Map<String, double[]> graphData = getGraphData(model, payload);
double[] sum = graphData.get("sum");
double[] totalCount = graphData.get("total_count");
......@@ -233,13 +233,13 @@ public class Handler implements PageHandler<Context> {
model.setResponseTrend(item.getJsonString());
item.getValues().clear();
item.setTitles(display + " Hits");
item.setTitles(display + " Hits (count)");
item.addValue(totalCount);
model.setHitTrend(item.getJsonString());
item.getValues().clear();
item.setTitles(display+ " Error");
item.setTitles(display+ " Error (count)");
item.addValue(graphData.get("failure_count"));
model.setErrorTrend(item.getJsonString());
}
......@@ -319,6 +319,7 @@ public class Handler implements PageHandler<Context> {
}
model.setReportType(payload.getReportType());
payload.computeStartDate();
payload.defaultIsYesterday();
model.setLongDate(payload.getDate());
}
}
......
/**
*
*/
package com.dianping.cat.report.task;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import com.dianping.cat.consumer.event.model.entity.EventName;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.event.model.entity.EventType;
import com.dianping.cat.hadoop.dal.Graph;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class EventGraphCreator implements GraphCreator<EventReport> {
@Override
public List<Graph> splitReportToGraphs(Date reportPeriod, String domainName, String reportName, EventReport eventReport) {
Set<String> ips = eventReport.getIps();
List<Graph> graphs = new ArrayList<Graph>(ips.size() + 1); // all and every machine
Map<String, GraphLine> allDetailCache = new TreeMap<String, GraphLine>();
Map<String, GraphLine> allSummaryCache = new TreeMap<String, GraphLine>();
Date creationDate = new Date();
for (String ip : ips) {
Graph graph = new Graph();
graph.setIp(ip);
graph.setDomain(domainName);
graph.setName(reportName);
graph.setPeriod(reportPeriod);
graph.setType(3);
graph.setCreationDate(creationDate);
com.dianping.cat.consumer.event.model.entity.Machine machine = eventReport.getMachines().get(ip);
Map<String, EventType> types = machine.getTypes();
StringBuilder detailBuilder = new StringBuilder();
StringBuilder summaryBuilder = new StringBuilder();
for (Entry<String, EventType> eventEntry : types.entrySet()) {
EventType eventType = eventEntry.getValue();
summaryBuilder.append(eventType.getId());
summaryBuilder.append('\t');
summaryBuilder.append(eventType.getTotalCount());
summaryBuilder.append('\t');
summaryBuilder.append(eventType.getFailCount());
summaryBuilder.append('\n');
String summaryKey = eventType.getId();
GraphLine summaryLine = allSummaryCache.get(summaryKey);
if (summaryLine == null) {
summaryLine = new GraphLine();
allSummaryCache.put(summaryKey, summaryLine);
}
summaryLine.totalCount += eventType.getTotalCount();
summaryLine.failCount += eventType.getFailCount();
Map<String, EventName> names = eventType.getNames();
for (Entry<String, EventName> nameEntry : names.entrySet()) {
EventName eventName = nameEntry.getValue();
detailBuilder.append(eventType.getId());
detailBuilder.append('\t');
detailBuilder.append(eventName.getId());
detailBuilder.append('\t');
detailBuilder.append(eventName.getTotalCount());
detailBuilder.append('\t');
detailBuilder.append(eventName.getFailCount());
detailBuilder.append('\n');
String key = eventType.getId() + "\t" + eventName.getId();
GraphLine detailLine = allDetailCache.get(key);
if (detailLine == null) {
detailLine = new GraphLine();
allDetailCache.put(key, detailLine);
}
detailLine.totalCount += eventName.getTotalCount();
detailLine.failCount += eventName.getFailCount();
}
}
graph.setDetailContent(detailBuilder.toString());
graph.setSummaryContent(summaryBuilder.toString());
graphs.add(graph);
}
Graph allGraph = new Graph();
allGraph.setIp("all");
allGraph.setDomain(domainName);
allGraph.setName(reportName);
allGraph.setPeriod(reportPeriod);
allGraph.setType(3);
allGraph.setCreationDate(creationDate);
StringBuilder detailSb = new StringBuilder();
for (Entry<String, GraphLine> entry : allDetailCache.entrySet()) {
detailSb.append(entry.getKey());
detailSb.append('\t');
GraphLine value = entry.getValue();
detailSb.append(value.totalCount);
detailSb.append('\t');
detailSb.append(value.failCount);
detailSb.append('\t');
detailSb.append('\n');
}
allGraph.setDetailContent(detailSb.toString());
StringBuilder summarySb = new StringBuilder();
for (Entry<String, GraphLine> entry : allSummaryCache.entrySet()) {
summarySb.append(entry.getKey());
summarySb.append('\t');
GraphLine value = entry.getValue();
summarySb.append(value.totalCount);
summarySb.append('\t');
summarySb.append(value.failCount);
summarySb.append('\n');
}
allGraph.setSummaryContent(summarySb.toString());
graphs.add(allGraph);
return graphs;
}
}
/**
*
*/
package com.dianping.cat.report.task;
import java.io.IOException;
import java.util.List;
import org.xml.sax.SAXException;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.event.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.event.EventReportMerger;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class EventMerger implements ReportMerger<EventReport> {
@Override
public EventReport merge(String reportDomain, List<Report> reports) {
EventReport eventReport;
EventReportMerger merger = new HistoryEventReportMerger(new EventReport(reportDomain));
for (Report report : reports) {
String xml = report.getContent();
EventReport model;
try {
model = DefaultSaxParser.parse(xml);
model.accept(merger);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
eventReport = merger == null ? null : merger.getEventReport();
return eventReport;
}
@Override
public String mergeAll(String reportDomain, List<Report> reports) {
EventReport eventReport = merge(reportDomain, reports);
EventReportMerger merger = new HistoryEventReportMerger(new EventReport(reportDomain));
EventReport eventReport2 = merge(reportDomain, reports);
com.dianping.cat.consumer.event.model.entity.Machine allMachines = merger.mergesForAllMachine(eventReport2);
eventReport.addMachine(allMachines);
eventReport.getIps().add("All");
String content = eventReport.toString();
return content;
}
}
/**
*
*/
package com.dianping.cat.report.task;
import java.util.Date;
import java.util.List;
import com.dianping.cat.hadoop.dal.Graph;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public interface GraphCreator<E> {
List<Graph> splitReportToGraphs(Date reportPeriod, String reportDomain, String reportName, E report);
}
package com.dianping.cat.report.task;
final class GraphLine {
long totalCount;
long failCount;
double min;
double max;
double sum;
double sum2;
int[] minuteCounts;
double[] minuteNumbers;
}
\ No newline at end of file
/**
*
*/
package com.dianping.cat.report.task;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import com.dianping.cat.consumer.heartbeat.model.entity.Disk;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.heartbeat.model.entity.Period;
import com.dianping.cat.hadoop.dal.Graph;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class HeartbeatGraphCreator implements GraphCreator<HeartbeatReport> {
@Override
public List<Graph> splitReportToGraphs(Date reportPeriod, String domainName, String reportName, HeartbeatReport heartbeatReport) {
Set<String> ips = heartbeatReport.getIps();
List<Graph> graphs = new ArrayList<Graph>(ips.size());
for (String ip : ips) {
Graph graph = new Graph();
graph.setIp(ip);
graph.setDomain(domainName);
graph.setName(reportName);
graph.setPeriod(reportPeriod);
graph.setType(3);
com.dianping.cat.consumer.heartbeat.model.entity.Machine machine = heartbeatReport.getMachines().get(ip);
List<Period> periods = machine.getPeriods();
Map<String, GraphLine> detailCache = new TreeMap<String, GraphLine>();
for (Period period : periods) {
int minute = period.getMinute();
String key = "CatMessageSize";
Number value = period.getCatMessageSize();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "CatMessageOverflow";
value = period.getCatMessageOverflow();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "CatMessageProduced";
value = period.getCatMessageProduced();
cacheHeartbeatColumn(detailCache, minute, value, key);
List<Disk> disks = period.getDisks();
for (Disk d : disks) {
key = "Disk " + d.getPath();
value = d.getFree();
cacheHeartbeatColumn(detailCache, minute, value, key);
}
key = "MemoryFree";
value = period.getMemoryFree();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "HeapUsage";
value = period.getHeapUsage();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "NoneHeapUsage";
value = period.getNoneHeapUsage();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "SystemLoadAverage";
value = period.getSystemLoadAverage();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "OldGcCount";
value = period.getOldGcCount();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "NewGcCount";
value = period.getNewGcCount();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "PigeonStartedThread";
value = period.getPigeonThreadCount();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "CatThreadCount";
value = period.getCatThreadCount();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "TotalStartedThread";
value = period.getTotalStartedCount();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "DaemonThread";
value = period.getDaemonCount();
cacheHeartbeatColumn(detailCache, minute, value, key);
key = "ActiveThread";
value = period.getThreadCount();
cacheHeartbeatColumn(detailCache, minute, value, key);
}
for (Entry<String, GraphLine> entry : detailCache.entrySet()) {
GraphLine line = entry.getValue();
double[] numbers = line.minuteNumbers;
double minValue = numbers[0];
double maxValue = minValue;
double sum = minValue;
double sum2 = sum * sum;
for (int i = 1; i < numbers.length; i++) {
double n = numbers[i];
if (n > maxValue) {
maxValue = n;
}
if (n < minValue) {
minValue = n;
}
sum += n;
sum2 += n * n;
}
line.min = minValue;
line.max = maxValue;
line.sum = sum;
line.sum2 = sum2;
}
StringBuilder sb = new StringBuilder(64 * detailCache.size());
for (Entry<String, GraphLine> entry : detailCache.entrySet()) {
GraphLine value = entry.getValue();
sb.append(entry.getKey());
sb.append('\t');
sb.append(value.min);
sb.append('\t');
sb.append(value.max);
sb.append('\t');
sb.append(value.sum);
sb.append('\t');
sb.append(value.sum2);
sb.append('\t');
sb.append(TaskHelper.join(value.minuteNumbers, ','));
sb.append('\n');
}
graph.setDetailContent(sb.toString());
graph.setCreationDate(new Date());
graphs.add(graph);
}
return graphs;
}
private void cacheHeartbeatColumn(Map<String, GraphLine> detailCache, int minute, Number value, String key) {
GraphLine detailLine = detailCache.get(key);
if (detailLine == null) {
detailLine = new GraphLine();
detailLine.minuteNumbers = new double[60];
detailCache.put(key, detailLine);
}
detailLine.minuteNumbers[minute] = value.doubleValue();
}
}
/**
*
*/
package com.dianping.cat.report.task;
import java.io.IOException;
import java.util.List;
import org.xml.sax.SAXException;
import com.dianping.cat.consumer.heartbeat.model.entity.HeartbeatReport;
import com.dianping.cat.consumer.heartbeat.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.heartbeat.HeartbeatReportMerger;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class HeartbeatMerger implements ReportMerger<HeartbeatReport> {
@Override
public HeartbeatReport merge(String reportDomain, List<Report> reports) {
HeartbeatReportMerger merger = new HeartbeatReportMerger(new HeartbeatReport(reportDomain));
for (Report report : reports) {
String xml = report.getContent();
HeartbeatReport model;
try {
model = DefaultSaxParser.parse(xml);
model.accept(merger);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
HeartbeatReport heartbeatReport = merger == null ? null : merger.getHeartbeatReport();
return heartbeatReport;
}
@Override
public String mergeAll(String reportDomain, List<Report> reports) {
// TODO Auto-generated method stub
return null;
}
}
package com.dianping.cat.report.task;
import com.dianping.cat.consumer.event.model.entity.EventName;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.report.page.model.event.EventReportMerger;
public class HistoryEventReportMerger extends EventReportMerger{
public HistoryEventReportMerger(EventReport eventReport) {
super(eventReport);
}
@Override
protected void mergeName(EventName old, EventName other) {
old.getRanges().clear();
other.getRanges().clear();
super.mergeName(old, other);
}
@Override
public void visitName(EventName name) {
name.getRanges().clear();
super.visitName(name);
}
}
package com.dianping.cat.report.task;
import com.dianping.cat.consumer.transaction.model.entity.TransactionName;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.report.page.model.transaction.TransactionReportMerger;
public class HistoryTransactionReportMerger extends TransactionReportMerger {
public HistoryTransactionReportMerger(TransactionReport transactionReport) {
super(transactionReport);
}
@Override
public void visitName(TransactionName name) {
name.getDurations().clear();
name.getRanges().clear();
super.visitName(name);
}
@Override
protected void mergeName(TransactionName old, TransactionName other) {
old.getDurations().clear();
old.getRanges().clear();
other.getDurations().clear();
other.getRanges().clear();
super.mergeName(old, other);
}
}
/**
*
*/
package com.dianping.cat.report.task;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import com.dianping.cat.consumer.problem.model.entity.JavaThread;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem.model.entity.Segment;
import com.dianping.cat.hadoop.dal.Graph;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class ProblemGraphCreator implements GraphCreator<ProblemReport> {
@Override
public List<Graph> splitReportToGraphs(Date reportPeriod, String reportDomain, String reportName, ProblemReport report) {
Set<String> ips = report.getIps();
List<Graph> graphs = new ArrayList<Graph>(ips.size() + 1); // all and every machine
Map<String, GraphLine> allDetailCache = new TreeMap<String, GraphLine>();
Map<String, GraphLine> allSummaryCache = new TreeMap<String, GraphLine>();
for (String ip : ips) {
Map<String, GraphLine> detailCache = new TreeMap<String, GraphLine>();
Map<String, GraphLine> summaryCache = new TreeMap<String, GraphLine>();
Graph graph = new Graph();
graph.setIp(ip);
graph.setDomain(reportDomain);
graph.setName(reportName);
graph.setPeriod(reportPeriod);
graph.setType(3);
com.dianping.cat.consumer.problem.model.entity.Machine machine = report.getMachines().get(ip);
Map<String, JavaThread> types = machine.getThreads();
for (Entry<String, JavaThread> transactionEntry : types.entrySet()) {
JavaThread thread = transactionEntry.getValue();
for (Entry<Integer, Segment> segmentEntry : thread.getSegments().entrySet()) {
Segment segment = segmentEntry.getValue();
int minute = segment.getId();
for (com.dianping.cat.consumer.problem.model.entity.Entry entry : segment.getEntries()) {
String summaryKey = entry.getType();
GraphLine summaryLine = summaryCache.get(summaryKey);
if (summaryLine == null) {
summaryLine = new GraphLine();
summaryLine.minuteCounts = new int[60];
summaryCache.put(summaryKey, summaryLine);
}
summaryLine.totalCount++;
summaryLine.minuteCounts[minute]++;
GraphLine allSummaryLine = allSummaryCache.get(summaryKey);
if (allSummaryLine == null) {
allSummaryLine = new GraphLine();
allSummaryLine.minuteCounts = new int[60];
allSummaryCache.put(summaryKey, allSummaryLine);
}
allSummaryLine.totalCount++;
allSummaryLine.minuteCounts[minute]++;
String detailKey = entry.getType() + "\t" + entry.getStatus();
GraphLine detailLine = detailCache.get(detailKey);
if (detailLine == null) {
detailLine = new GraphLine();
detailLine.minuteCounts = new int[60];
detailCache.put(detailKey, detailLine);
}
detailLine.totalCount++;
detailLine.minuteCounts[minute]++;
GraphLine allDetailLine = allDetailCache.get(detailKey);
if (allDetailLine == null) {
allDetailLine = new GraphLine();
allDetailLine.minuteCounts = new int[60];
allDetailCache.put(detailKey, allDetailLine);
}
allDetailLine.totalCount++;
allDetailLine.minuteCounts[minute]++;
}
}
}
StringBuilder summaryBuilder = new StringBuilder();
for (Entry<String, GraphLine> summaryEntry : summaryCache.entrySet()) {
GraphLine summaryLine = summaryEntry.getValue();
summaryBuilder.append(summaryEntry.getKey());
summaryBuilder.append("\t");
summaryBuilder.append(summaryLine.totalCount);
summaryBuilder.append("\t");
summaryBuilder.append(TaskHelper.join(summaryLine.minuteCounts, ','));
summaryBuilder.append("\n");
}
graph.setSummaryContent(summaryBuilder.toString());
StringBuilder detailBuilder = new StringBuilder();
for (Entry<String, GraphLine> detailEntry : detailCache.entrySet()) {
GraphLine detailLine = detailEntry.getValue();
detailBuilder.append(detailEntry.getKey());
detailBuilder.append("\t");
detailBuilder.append(detailLine.totalCount);
detailBuilder.append("\t");
detailBuilder.append(TaskHelper.join(detailLine.minuteCounts, ','));
detailBuilder.append("\n");
}
graph.setDetailContent(detailBuilder.toString());
graph.setCreationDate(new Date());
graphs.add(graph);
}
Graph allGraph = new Graph();
allGraph.setIp("all");
allGraph.setDomain(reportDomain);
allGraph.setName(reportName);
allGraph.setPeriod(reportPeriod);
allGraph.setType(3);
StringBuilder summaryBuilder = new StringBuilder();
for (Entry<String, GraphLine> summaryEntry : allSummaryCache.entrySet()) {
GraphLine summaryLine = summaryEntry.getValue();
summaryBuilder.append(summaryEntry.getKey());
summaryBuilder.append("\t");
summaryBuilder.append(summaryLine.totalCount);
summaryBuilder.append("\t");
summaryBuilder.append(TaskHelper.join(summaryLine.minuteCounts, ','));
summaryBuilder.append("\n");
}
allGraph.setSummaryContent(summaryBuilder.toString());
StringBuilder detailBuilder = new StringBuilder();
for (Entry<String, GraphLine> detailEntry : allDetailCache.entrySet()) {
GraphLine detailLine = detailEntry.getValue();
detailBuilder.append(detailEntry.getKey());
detailBuilder.append("\t");
detailBuilder.append(detailLine.totalCount);
detailBuilder.append("\t");
detailBuilder.append(TaskHelper.join(detailLine.minuteCounts, ','));
detailBuilder.append("\n");
}
allGraph.setDetailContent(detailBuilder.toString());
allGraph.setCreationDate(new Date());
graphs.add(allGraph);
return graphs;
}
}
/**
*
*/
package com.dianping.cat.report.task;
import java.io.IOException;
import java.util.List;
import org.xml.sax.SAXException;
import com.dianping.cat.consumer.problem.model.entity.ProblemReport;
import com.dianping.cat.consumer.problem.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.problem.ProblemReportMerger;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class ProblemMerger implements ReportMerger<ProblemReport> {
@Override
public ProblemReport merge(String reportDomain, List<Report> reports) {
ProblemReportMerger merger = new ProblemReportMerger(new ProblemReport(reportDomain));
for (Report report : reports) {
String xml = report.getContent();
ProblemReport model;
try {
model = DefaultSaxParser.parse(xml);
model.accept(merger);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
ProblemReport problemReport = merger == null ? null : merger.getProblemReport();
return problemReport;
}
@Override
public String mergeAll(String reportDomain, List<Report> reports) {
return null;
}
}
/**
*
*/
package com.dianping.cat.report.task;
import java.util.List;
import com.dianping.cat.hadoop.dal.Report;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public interface ReportMerger<E> {
public E merge(String reportDomain, List<Report> reports);
public String mergeAll(String reportDomain, List<Report> reports);
}
/**
*
*/
package com.dianping.cat.report.task;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map.Entry;
import com.dianping.cat.consumer.transaction.model.entity.Machine;
import com.dianping.cat.consumer.transaction.model.entity.TransactionName;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionType;
import com.dianping.cat.hadoop.dal.Graph;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class TransactionGraphCreator implements GraphCreator<TransactionReport> {
@Override
public List<Graph> splitReportToGraphs(Date reportPeriod, String reportDomain, String reportName, TransactionReport report) {
Set<String> ips = report.getIps();
List<Graph> graphs = new ArrayList<Graph>(ips.size() + 1); // all and every machine
Map<String, GraphLine> allDetailCache = new TreeMap<String, GraphLine>();
Map<String, GraphLine> allSummaryCache = new TreeMap<String, GraphLine>();
Date creationDate = new Date();
for (String ip : ips) {
Graph graph = new Graph();
graph.setIp(ip);
graph.setDomain(reportDomain);
graph.setName(reportName);
graph.setPeriod(reportPeriod);
graph.setType(3);
graph.setCreationDate(creationDate);
Machine machine = report.getMachines().get(ip);
Map<String, TransactionType> types = machine.getTypes();
StringBuilder detailBuilder = new StringBuilder();
StringBuilder summaryBuilder = new StringBuilder();
for (Entry<String, TransactionType> transactionEntry : types.entrySet()) {
TransactionType transactionType = transactionEntry.getValue();
summaryBuilder.append(transactionType.getId());
summaryBuilder.append('\t');
summaryBuilder.append(transactionType.getTotalCount());
summaryBuilder.append('\t');
summaryBuilder.append(transactionType.getFailCount());
summaryBuilder.append('\t');
summaryBuilder.append(transactionType.getMin());
summaryBuilder.append('\t');
summaryBuilder.append(transactionType.getMax());
summaryBuilder.append('\t');
summaryBuilder.append(transactionType.getSum());
summaryBuilder.append('\t');
summaryBuilder.append(transactionType.getSum2());
summaryBuilder.append('\n');
String summaryKey = transactionType.getId();
GraphLine summaryLine = allSummaryCache.get(summaryKey);
if (summaryLine == null) {
summaryLine = new GraphLine();
allSummaryCache.put(summaryKey, summaryLine);
}
summaryLine.totalCount += transactionType.getTotalCount();
summaryLine.failCount += transactionType.getFailCount();
summaryLine.min += transactionType.getMin();
summaryLine.max += transactionType.getMax();
summaryLine.sum += transactionType.getSum();
summaryLine.sum2 += transactionType.getSum2();
Map<String, TransactionName> names = transactionType.getNames();
for (Entry<String, TransactionName> nameEntry : names.entrySet()) {
TransactionName transactionName = nameEntry.getValue();
detailBuilder.append(transactionType.getId());
detailBuilder.append('\t');
detailBuilder.append(transactionName.getId());
detailBuilder.append('\t');
detailBuilder.append(transactionName.getTotalCount());
detailBuilder.append('\t');
detailBuilder.append(transactionName.getFailCount());
detailBuilder.append('\t');
detailBuilder.append(transactionName.getMin());
detailBuilder.append('\t');
detailBuilder.append(transactionName.getMax());
detailBuilder.append('\t');
detailBuilder.append(transactionName.getSum());
detailBuilder.append('\t');
detailBuilder.append(transactionName.getSum2());
detailBuilder.append('\n');
String key = transactionType.getId() + "\t" + transactionName.getId();
GraphLine detailLine = allDetailCache.get(key);
if (detailLine == null) {
detailLine = new GraphLine();
allDetailCache.put(key, detailLine);
}
detailLine.totalCount += transactionName.getTotalCount();
detailLine.failCount += transactionName.getFailCount();
detailLine.min += transactionName.getMin();
detailLine.max += transactionName.getMax();
detailLine.sum += transactionName.getSum();
detailLine.sum2 += transactionName.getSum2();
}
}
graph.setDetailContent(detailBuilder.toString());
graph.setSummaryContent(summaryBuilder.toString());
graphs.add(graph);
}
Graph allGraph = new Graph();
allGraph.setIp("all");
allGraph.setDomain(reportDomain);
allGraph.setName(reportName);
allGraph.setPeriod(reportPeriod);
allGraph.setType(3);
allGraph.setCreationDate(creationDate);
StringBuilder detailSb = new StringBuilder();
for (Entry<String, GraphLine> entry : allDetailCache.entrySet()) {
detailSb.append(entry.getKey());
detailSb.append('\t');
GraphLine value = entry.getValue();
detailSb.append(value.totalCount);
detailSb.append('\t');
detailSb.append(value.failCount);
detailSb.append('\t');
detailSb.append(value.min);
detailSb.append('\t');
detailSb.append(value.max);
detailSb.append('\t');
detailSb.append(value.sum);
detailSb.append('\t');
detailSb.append(value.sum2);
detailSb.append('\n');
}
allGraph.setDetailContent(detailSb.toString());
StringBuilder summarySb = new StringBuilder();
for (Entry<String, GraphLine> entry : allSummaryCache.entrySet()) {
summarySb.append(entry.getKey());
summarySb.append('\t');
GraphLine value = entry.getValue();
summarySb.append(value.totalCount);
summarySb.append('\t');
summarySb.append(value.failCount);
summarySb.append('\t');
summarySb.append(value.min);
summarySb.append('\t');
summarySb.append(value.max);
summarySb.append('\t');
summarySb.append(value.sum);
summarySb.append('\t');
summarySb.append(value.sum2);
summarySb.append('\n');
}
allGraph.setSummaryContent(summarySb.toString());
graphs.add(allGraph);
return graphs;
}
}
/**
*
*/
package com.dianping.cat.report.task;
import java.io.IOException;
import java.util.List;
import org.xml.sax.SAXException;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.transform.DefaultSaxParser;
import com.dianping.cat.hadoop.dal.Report;
import com.dianping.cat.report.page.model.transaction.TransactionReportMerger;
/**
* @author sean.wang
* @since Jun 20, 2012
*/
public class TransactionMerger implements ReportMerger<TransactionReport> {
public String mergeAll(String reportDomain, List<Report> reports) {
TransactionReport transactionReport = merge(reportDomain, reports);
TransactionReportMerger merger = new HistoryTransactionReportMerger(new TransactionReport(reportDomain));
TransactionReport transactionReport2 = merge(reportDomain, reports);
com.dianping.cat.consumer.transaction.model.entity.Machine allMachines = merger.mergesForAllMachine(transactionReport2);
transactionReport.addMachine(allMachines);
transactionReport.getIps().add("All");
String content = transactionReport.toString();
return content;
}
public TransactionReport merge(String reportDomain, List<Report> reports) {
TransactionReport transactionReport;
TransactionReportMerger merger = new HistoryTransactionReportMerger(new TransactionReport(reportDomain));
for (Report report : reports) {
String xml = report.getContent();
TransactionReport model;
try {
model = DefaultSaxParser.parse(xml);
model.accept(merger);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
transactionReport = merger == null ? null : merger.getTransactionReport();
return transactionReport;
}
}
......@@ -13,9 +13,7 @@
<res:useCss value='${res.css.local.body_css}' target="head-css"/>
</head>
<body>
<h1>
${model.page.description}
</h1>
<table style="height:10px"></table>
<ul class="tabs">
<c:forEach var="page" items="${navBar.visiblePages}">
<c:if test="${page.standalone}">
......
......@@ -16,7 +16,7 @@
<tr>
<td class="title">${title}</td>
<td class="switch">Browse Mode:History Summarize Report
[&nbsp;<a href="?domain=${model.domain}&date=${model.date}">Hourly Mode</a>&nbsp;]&nbsp;
[&nbsp;<a href="?domain=${model.domain}">Hourly Mode</a>&nbsp;]&nbsp;
</td>
</tr>
</table>
......
......@@ -16,7 +16,7 @@
<tr>
<td class="title">${title}</td>
<td class="switch">Browse Mode:Hourly Report
[&nbsp;<a href="${model.baseUri}?op=history&domain=${model.domain}&date=${model.date}">History Mode</a>&nbsp;]&nbsp;
[&nbsp;<a href="${model.baseUri}?op=history&domain=${model.domain}">History Mode</a>&nbsp;]&nbsp;
</td>
</tr>
</table>
......
......@@ -46,7 +46,8 @@ tr.link td {
}
.graph {
width: 550px;
height: 250px;
width: 450px;
height: 200px;
margin: 4px auto;
}
......@@ -60,8 +60,8 @@ function graph(container, data) {
console.log(opts.xaxis.max);
console.log(new Date(opts.xaxis.max));
console.log(formatDate(new Date(opts.xaxis.max)))
o.title = data.titles + " From "
+ formatDate(new Date(opts.xaxis.min)) + " To"
o.title = " From "
+ formatDate(new Date(opts.xaxis.min)) + " To "
+ formatDate(new Date(opts.xaxis.max));
} else {
}
......
......@@ -54,8 +54,8 @@ function graph(container, data) {
o = Flotr._.extend(Flotr._.clone(options), opts || {});
if (opts != null && opts.xaxis != null) {
o.title = data.titles + " From "
+ formatDate(new Date(opts.xaxis.min)) + " To"
o.title = " From "
+ formatDate(new Date(opts.xaxis.min)) + " To "
+ formatDate(new Date(opts.xaxis.max));
} else {
}
......
......@@ -48,8 +48,8 @@ function graph(container, data) {
o = Flotr._.extend(Flotr._.clone(options), opts || {});
if (opts != null && opts.xaxis != null) {
o.title = data.titles + " From "
+ formatDate(new Date(opts.xaxis.min)) + " To"
o.title = " From "
+ formatDate(new Date(opts.xaxis.min)) + " To "
+ formatDate(new Date(opts.xaxis.max));
} else {
}
......
......@@ -82,7 +82,7 @@
</c:when>
<c:otherwise>
<tr>
<th><a href="?op=graphs&domain=${report.domain}&date=${model.date}&type=${payload.type}" class="graph_link" data-status="-1">[:: show ::]</a>
<th><a href="?op=graphs&domain=${model.domain}&date=${model.date}&type=${payload.type}" class="graph_link" data-status="-1">[:: show ::]</a>
<a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=type"> Name</a></th>
<th><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=total">Total Count</a></th>
<th><a href="?domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&sort=failure">Failure Count</a></th>
......
......@@ -50,7 +50,7 @@
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td style="text-align: left">
<a href="?op=historyGraph&domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&reportType=${model.reportType}&type=${item.type}" class="history_graph_link" data-status="${status.index}">[:: show ::]</a>
<a href="?op=history&domain=${report.domain}&date=${model.date}&ip=${model.ipAddress}&reportType=${model.reportType}&type=${item.type}">${item.type}</a></td>
<a href="?op=history&domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&reportType=${model.reportType}&type=${item.type}">${item.type}</a></td>
<td>${e.totalCount}</td>
<td>${e.failCount}</td>
<td>${w:format(e.failPercent,'0.00')}</td>
......
......@@ -35,7 +35,7 @@
</table>
<br>
<table class="graph">
<table>
<tr>
<th colspan="3">Thread Info</th>
</tr>
......
......@@ -93,7 +93,8 @@
<c:set var="e" value="${item.detail}"/>
<c:set var="lastIndex" value="${status.index}"/>
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td style="text-align:left"><a href="?op=graphs&domain=${report.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&name=${e.id}" class="graph_link" data-status="${status.index}">[:: show ::]</a> ${e.id}</td>
<td width="25%" style="text-align:left;word-wrap:break-word;word-break:break-all;"><a href="?op=graphs&domain=${report.domain}&date=${model.date}&ip=${model.ipAddress}&type=${payload.type}&name=${e.id}" class="graph_link" data-status="${status.index}">[:: show ::]</a>
${w:shorten(e.id, 50)}</td>
<td>${e.totalCount}</td>
<td>${e.failCount}</td>
<td>${w:format(e.failPercent,'0.00')}</td>
......
......@@ -2,8 +2,8 @@
<jsp:useBean id="model" type="com.dianping.cat.report.page.transaction.Model" scope="request" />
<style type="text/css">
.graph {
width: 550px;
height: 250px;
width: 450px;
height: 200px;
margin: 4px auto;
}
</style>
......@@ -15,8 +15,8 @@
<tr>
<td><div id="responseTrend" class="graph"></div></td>
<td><div id="hitTrend" class="graph"></div></td>
<td><div id="errorTrend" class="graph"></div></td>
</tr>
<tr><td><div id="errorTrend" class="graph"></div></td></tr>
<tr><td style="display:none">
<div id ="responseTrendMeta">${model.responseTrend}</div>
......
......@@ -94,7 +94,7 @@
<c:set var="lastIndex" value="${status.index}" />
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td style="text-align: left"><a href="?op=historyGraph&domain=${model.domain}&date=${model.date}&ip=${model.ipAddress}&reportType=${model.reportType}&type=${payload.type}&name=${e.id}" class="history_graph_link" data-status="${status.index}">[:: show ::]</a>
${e.id}</td>
${w:shorten(e.id, 50)}</td>
<td>${e.totalCount}</td>
<td>${e.failCount}</td>
<td>${w:format(e.failPercent,'0.00')}</td>
......
......@@ -77,9 +77,11 @@ public class PayloadTest {
Date lastTwoDay = new Date(temp - 2 * ONE_DAY);
Date lastOneDay = new Date(temp - ONE_DAY);
Date currentDay = new Date(temp);
Date nextDay = new Date(temp+ONE_DAY);
String lastTwo = sdf.format(lastTwoDay);
String lastOne = sdf.format(lastOneDay);
String current = sdf.format(currentDay);
String next = sdf.format(nextDay);
payload.setDate(sdf.format(input));
payload.setStep(-1);
......@@ -98,13 +100,13 @@ public class PayloadTest {
payload.setStep(1);
payload.computeStartDate();
checkDate(lastOne, payload.getHistoryStartDate());
checkDate(current, payload.getHistoryEndDate());
checkDate(current, payload.getHistoryStartDate());
checkDate(next, payload.getHistoryEndDate());
payload.setStep(1);
payload.computeStartDate();
checkDate(lastOne, payload.getHistoryStartDate());
checkDate(current, payload.getHistoryEndDate());
checkDate(current, payload.getHistoryStartDate());
checkDate(next, payload.getHistoryEndDate());
}
@Test
......
package com.dianping.cat.report.task;
import org.junit.Assert;
import org.junit.Test;
import org.unidal.webres.helper.Files;
import com.dianping.cat.consumer.event.model.entity.EventReport;
import com.dianping.cat.consumer.event.model.transform.DefaultDomParser;
import com.dianping.cat.consumer.event.model.transform.DefaultXmlBuilder;
import com.dianping.cat.report.page.model.event.EventReportMerger;
public class HistoryEventMergerTest {
@Test
public void testMerge() throws Exception{
String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("event.xml"), "utf-8");
EventReport report1 = new DefaultDomParser().parse(oldXml);
EventReport report2 = new DefaultDomParser().parse(oldXml);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("eventResult.xml"),
"utf-8");
EventReportMerger merger = new HistoryEventReportMerger(new EventReport(report1.getDomain()));
merger.mergesFrom(report1);
merger.mergesFrom(report2);
String actual = new DefaultXmlBuilder().buildXml(report1);
Assert.assertEquals("Check the merge result!", expected.replace("\r", ""), actual.replace("\r", ""));
}
}
package com.dianping.cat.report.task;
import org.junit.Assert;
import org.junit.Test;
import org.unidal.webres.helper.Files;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.transform.DefaultDomParser;
import com.dianping.cat.consumer.transaction.model.transform.DefaultXmlBuilder;
import com.dianping.cat.report.page.model.transaction.TransactionReportMerger;
public class HistoryTransactionMergerTest {
@Test
public void testMerge() throws Exception{
String oldXml = Files.forIO().readFrom(getClass().getResourceAsStream("transaction.xml"), "utf-8");
TransactionReport report1 = new DefaultDomParser().parse(oldXml);
TransactionReport report2 = new DefaultDomParser().parse(oldXml);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("result.xml"),
"utf-8");
TransactionReportMerger merger = new HistoryTransactionReportMerger(new TransactionReport(report1.getDomain()));
merger.mergesFrom(report1);
merger.mergesFrom(report2);
String actual = new DefaultXmlBuilder().buildXml(report1);
Assert.assertEquals("Check the merge result!", expected.replace("\r", ""), actual.replace("\r", ""));
}
}
<event-report domain="MobileApi" startTime="2012-06-18 15:00:00"
endTime="2012-06-18 15:59:59">
<domain>Cat</domain>
<domain>MobileApi</domain>
<ip>10.1.77.193</ip>
<ip>10.1.77.191</ip>
<machine ip="10.1.77.191">
<type id="RemoteCall" totalCount="4" failCount="0" failPercent="0.00">
<successMessageUrl>MobileApi-0a014dbf-1340004471358-0
</successMessageUrl>
<range value="0" count="10453" fails="0" />
<range value="5" count="10229" fails="0" />
<range value="10" count="9411" fails="0" />
<range value="15" count="9230" fails="0" />
<range value="20" count="8420" fails="0" />
<range value="25" count="7847" fails="0" />
<range value="30" count="7666" fails="0" />
<range value="35" count="7375" fails="0" />
<range value="40" count="7007" fails="0" />
<range value="45" count="6648" fails="0" />
<range value="50" count="6553" fails="0" />
<range value="55" count="6460" fails="0" />
</type>
<type id="PigeonRespone" totalCount="2" failCount="0"
failPercent="0.00">
<successMessageUrl>MobileApi-0a014dbf-1340004471574-0
</successMessageUrl>
<range value="0" count="10453" fails="0" />
<range value="5" count="10229" fails="0" />
<range value="10" count="9411" fails="0" />
<range value="15" count="9230" fails="0" />
<range value="20" count="8420" fails="0" />
<range value="25" count="7847" fails="0" />
<range value="30" count="7666" fails="0" />
<range value="35" count="7375" fails="0" />
<range value="40" count="7007" fails="0" />
<range value="45" count="6648" fails="0" />
<range value="50" count="6553" fails="0" />
<range value="55" count="6460" fails="0" />
</type>
</machine>
</event-report>
\ No newline at end of file
<event-report domain="MobileApi" startTime="2012-06-18 15:00:00" endTime="2012-06-18 15:59:59">
<domain>Cat</domain>
<domain>MobileApi</domain>
<ip>10.1.77.193</ip>
<ip>10.1.77.191</ip>
<machine ip="10.1.77.191">
<type id="RemoteCall" totalCount="8" failCount="0" failPercent="0.00">
<successMessageUrl>MobileApi-0a014dbf-1340004471358-0
</successMessageUrl>
</type>
<type id="PigeonRespone" totalCount="4" failCount="0" failPercent="0.00">
<successMessageUrl>MobileApi-0a014dbf-1340004471574-0
</successMessageUrl>
</type>
</machine>
</event-report>
<transaction-report domain="MobileApi" startTime="2012-06-18 16:00:00"
endTime="2012-06-18 16:59:59">
<domain>Cat</domain>
<domain>MobileApi</domain>
<ip>10.1.77.193</ip>
<machine ip="10.1.77.193">
<type id="Result" totalCount="208" failCount="0" failPercent="0.00"
min="0.225" max="673.736" avg="7.8" sum="1618.0" sum2="490858.8" std="48.0"
tps="0.00" line95Value="44.00" line95Sum="44.00" line95Count="1">
<successMessageUrl>MobileApi-0a014dc1-1340006403188-1
</successMessageUrl>
<name id="ClientInfo" totalCount="3664668" failCount="0"
failPercent="0.00">
<successMessageUrl>MobileApi-0a01017e-1340121600084-0
</successMessageUrl>
<range value="0" count="10453" fails="0" />
<range value="5" count="10229" fails="0" />
<range value="10" count="9411" fails="0" />
<range value="15" count="9230" fails="0" />
<range value="20" count="8420" fails="0" />
<range value="25" count="7847" fails="0" />
<range value="30" count="7666" fails="0" />
<range value="35" count="7375" fails="0" />
<range value="40" count="7007" fails="0" />
<range value="45" count="6648" fails="0" />
<range value="50" count="6553" fails="0" />
<range value="55" count="6460" fails="0" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
</name>
<name id="Payload" totalCount="3664668" failCount="0"
failPercent="0.00">
<successMessageUrl>MobileApi-0a01017e-1340121600084-0
</successMessageUrl>
<range value="0" count="10453" fails="0" />
<range value="5" count="10229" fails="0" />
<range value="10" count="9411" fails="0" />
<range value="15" count="9230" fails="0" />
<range value="20" count="8420" fails="0" />
<range value="25" count="7847" fails="0" />
<range value="30" count="7666" fails="0" />
<range value="35" count="7375" fails="0" />
<range value="40" count="7007" fails="0" />
<range value="45" count="6648" fails="0" />
<range value="50" count="6553" fails="0" />
<range value="55" count="6460" fails="0" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
<duration value="1" count="14999" />
</name>
</type>
</machine>
</transaction-report>
\ No newline at end of file
<transaction-report domain="MobileApi" startTime="2012-06-18 16:00:00" endTime="2012-06-18 16:59:59">
<domain>Cat</domain>
<domain>MobileApi</domain>
<ip>10.1.77.193</ip>
<machine ip="10.1.77.193">
<type id="Result" totalCount="416" failCount="0" failPercent="0.00" min="0.225" max="673.736" avg="7.8" sum="3236.0" sum2="981717.6" std="48.0" tps="0.00" line95Value="44.00" line95Sum="88.00" line95Count="2">
<successMessageUrl>MobileApi-0a014dc1-1340006403188-1
</successMessageUrl>
<name id="ClientInfo" totalCount="7329336" failCount="0" failPercent="0.00" min="8.64E7" max="-1.0" avg="0.0" sum="0.0" sum2="0.0" std="0.0" tps="0.00" line95Value="0.00" line95Sum="0.00" line95Count="0">
<successMessageUrl>MobileApi-0a01017e-1340121600084-0
</successMessageUrl>
</name>
<name id="Payload" totalCount="7329336" failCount="0" failPercent="0.00" min="8.64E7" max="-1.0" avg="0.0" sum="0.0" sum2="0.0" std="0.0" tps="0.00" line95Value="0.00" line95Sum="0.00" line95Count="0">
<successMessageUrl>MobileApi-0a01017e-1340121600084-0
</successMessageUrl>
</name>
</type>
</machine>
</transaction-report>
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.3.0</version>
<version>0.3.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-job</artifactId>
......
......@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.3.0</version>
<version>0.3.1</version>
<name>CAT</name>
<packaging>pom</packaging>
<modules>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册