提交 36895e6e 编写于 作者: U unknown

Merge branch 'master' of ssh://192.168.8.22:58422/cat

...@@ -34,11 +34,10 @@ ...@@ -34,11 +34,10 @@
<plugin> <plugin>
<groupId>com.site.maven.plugins</groupId> <groupId>com.site.maven.plugins</groupId>
<artifactId>maven-codegen-plugin</artifactId> <artifactId>maven-codegen-plugin</artifactId>
<version>1.0.0-a5</version> <version>1.0.3</version>
<executions> <executions>
<execution> <execution>
<!-- <id>generate failure report model</id> --> <id>generate failure report model</id>
<id>default-cli</id>
<phase>generate-sources</phase> <phase>generate-sources</phase>
<goals> <goals>
<goal>dal-model</goal> <goal>dal-model</goal>
...@@ -57,6 +56,17 @@ ...@@ -57,6 +56,17 @@
<manifest>${basedir}/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml</manifest> <manifest>${basedir}/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml</manifest>
</configuration> </configuration>
</execution> </execution>
<execution>
<!-- <id>generate IP report model</id> -->
<id>default-cli</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-model</goal>
</goals>
<configuration>
<manifest>${basedir}/src/main/resources/META-INF/dal/model/ip-manifest.xml</manifest>
</configuration>
</execution>
</executions> </executions>
</plugin> </plugin>
</plugins> </plugins>
......
...@@ -124,6 +124,12 @@ public class FailureReportAnalyzer extends AbstractMessageAnalyzer<FailureReport ...@@ -124,6 +124,12 @@ public class FailureReportAnalyzer extends AbstractMessageAnalyzer<FailureReport
} }
return reports; return reports;
} }
@Override
public FailureReport generate(String domain) {
return generateByDomain(domain);
}
@Override @Override
protected void store(List<FailureReport> reports) { protected void store(List<FailureReport> reports) {
......
package com.dianping.cat.consumer.ip;
import java.util.List;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageTree;
public class IpAnalyzer extends AbstractMessageAnalyzer<IpReport> {
@Override
protected void store(List<IpReport> result) {
// TODO Auto-generated method stub
}
@Override
public List<IpReport> generate() {
// TODO Auto-generated method stub
return null;
}
@Override
public IpReport generate(String domain) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void process(MessageTree tree) {
// TODO Auto-generated method stub
}
@Override
protected boolean isTimeout() {
// TODO Auto-generated method stub
return false;
}
}
...@@ -6,9 +6,11 @@ package com.dianping.cat.consumer.transaction; ...@@ -6,9 +6,11 @@ package com.dianping.cat.consumer.transaction;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.codehaus.plexus.logging.LogEnabled; import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.Logger;
...@@ -34,14 +36,13 @@ import com.site.lookup.annotation.Inject; ...@@ -34,14 +36,13 @@ import com.site.lookup.annotation.Inject;
* @since Jan 5, 2012 * @since Jan 5, 2012
*/ */
public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<TransactionReport> implements Initializable, LogEnabled { public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<TransactionReport> implements Initializable, LogEnabled {
private final static long MINUTE = 60 * 1000L;
private static final SimpleDateFormat FILE_SDF = new SimpleDateFormat("yyyyMMddHHmm"); private final static SimpleDateFormat FILE_SDF = new SimpleDateFormat("yyyyMMddHHmm");
@Inject @Inject
private MessageManager m_manager; private MessageManager m_manager;
private TransactionReport report; private Map<String, TransactionReport> m_reports = new HashMap<String, TransactionReport>();
private long m_extraTime; private long m_extraTime;
...@@ -49,10 +50,17 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti ...@@ -49,10 +50,17 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
private Logger m_logger; private Logger m_logger;
private void computeMeanSquareDeviation() { private long m_startTime;
Collection<TransactionType> types = report.getTypes().values();
for (TransactionType type : types) { private long m_duration;
private TransactionReport computeMeanSquareDeviation(String domain) {
TransactionReport report = m_reports.get(domain);
if (report == null) {
return report;
}
for (TransactionType type : report.getTypes().values()) {
long typeCount = 0; long typeCount = 0;
long typeFailCount = 0; long typeFailCount = 0;
double typeSum = 0; double typeSum = 0;
...@@ -91,16 +99,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti ...@@ -91,16 +99,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
type.setFailPercent(100.0 * typeFailCount / typeCount); type.setFailPercent(100.0 * typeFailCount / typeCount);
type.setStd(std(typeCount, typeAvg, typeSum2)); type.setStd(std(typeCount, typeAvg, typeSum2));
} }
} return report;
/**
* @param count
* @param ave
* @param sum2
* @return
*/
public double std(long count, double ave, double sum2) {
return Math.sqrt(sum2 / count - 2 * ave * ave + ave * ave);
} }
@Override @Override
...@@ -109,12 +108,27 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti ...@@ -109,12 +108,27 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
} }
@Override @Override
public TransactionReport generate() { public List<TransactionReport> generate() {
computeMeanSquareDeviation(); List<TransactionReport> reports = new ArrayList<TransactionReport>();
for (String domain : m_reports.keySet()) {
reports.add(generate(domain));
}
return reports;
}
@Override
public TransactionReport generate(String domain) {
ArrayList<String> domains = new ArrayList<String>(this.m_reports.keySet());
if (domain == null) {
domain = domains.get(0);
}
TransactionReport report = computeMeanSquareDeviation(domain);
for (String ele : domains) {
report.addDomain(ele);
}
return report; return report;
} }
// TODO
private String getTransactionFileName(TransactionReport report) { private String getTransactionFileName(TransactionReport report) {
StringBuffer result = new StringBuffer(); StringBuffer result = new StringBuffer();
String start = FILE_SDF.format(report.getStartTime()); String start = FILE_SDF.format(report.getStartTime());
...@@ -139,7 +153,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti ...@@ -139,7 +153,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
@Override @Override
protected boolean isTimeout() { protected boolean isTimeout() {
long endTime = report.getEndTime().getTime(); long endTime = m_startTime + m_duration + m_extraTime;
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
if (currentTime > endTime + m_extraTime) { if (currentTime > endTime + m_extraTime) {
...@@ -148,7 +162,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti ...@@ -148,7 +162,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
return false; return false;
} }
private void process(Message message, String messageId) { private void process(TransactionReport report, Message message, String messageId) {
if (message instanceof Transaction) { if (message instanceof Transaction) {
Transaction t = (Transaction) message; Transaction t = (Transaction) message;
String tType = t.getType(); String tType = t.getType();
...@@ -184,47 +198,65 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti ...@@ -184,47 +198,65 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
} }
List<Message> children = t.getChildren(); List<Message> children = t.getChildren();
for (Message child : children) { for (Message child : children) {
process(child, null); process(report, child, null);
} }
} }
} }
@Override @Override
protected void process(MessageTree tree) { protected void process(MessageTree tree) {
String domain = tree.getDomain();
TransactionReport report = this.m_reports.get(domain);
if (report == null) { if (report == null) {
this.report = new TransactionReport(tree.getDomain()); report = new TransactionReport(domain);
this.m_reports.put(domain, report);
} }
Message message = tree.getMessage(); Message message = tree.getMessage();
process(message, tree.getMessageId()); process(report, message, tree.getMessageId());
} }
public void setAnalyzerInfo(long startTime, long duration, String domain, long extraTime) { public void setAnalyzerInfo(long startTime, long duration, String domain, long extraTime) {
report = new TransactionReport(domain);
report.setStartTime(new Date(startTime));
report.setEndTime(new Date(startTime + duration - MINUTE));
m_extraTime = extraTime; m_extraTime = extraTime;
m_startTime = startTime;
m_duration = duration;
} }
public void setReportPath(String configPath) { public void setReportPath(String configPath) {
m_reportPath = configPath; m_reportPath = configPath;
} }
/**
* @param count
* @param ave
* @param sum2
* @return
*/
public double std(long count, double ave, double sum2) {
return Math.sqrt(sum2 / count - 2 * ave * ave + ave * ave);
}
@Override @Override
protected void store(TransactionReport result) { protected void store(List<TransactionReport> reports) {
String failureFileName = getTransactionFileName(report); if (reports == null || reports.size() == 0) {
String htmlPath = new StringBuilder().append(m_reportPath).append(failureFileName).append(".html").toString(); return;
File file = new File(htmlPath); }
for (TransactionReport report : reports) {
String failureFileName = getTransactionFileName(report);
String htmlPath = new StringBuilder().append(m_reportPath).append(failureFileName).append(".html").toString();
File file = new File(htmlPath);
file.getParentFile().mkdirs(); file.getParentFile().mkdirs();
DefaultJsonBuilder builder = new DefaultJsonBuilder(); DefaultJsonBuilder builder = new DefaultJsonBuilder();
report.accept(builder); report.accept(builder);
try { try {
Files.forIO().writeTo(file, builder.getString()); Files.forIO().writeTo(file, builder.getString());
} catch (IOException e) { } catch (IOException e) {
m_logger.error(String.format("Error when writing to file(%s)!", file), e); m_logger.error(String.format("Error when writing to file(%s)!", file), e);
}
} }
} }
} }
<?xml version="1.0" encoding="UTF-8"?>
<model>
<entity name="ip-report" root="true">
<attribute name="domain" value-type="String" />
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<entity-ref name="segment" type="list" names="segments" />
</entity>
<entity name="segment">
<attribute name="minute" value-type="int" />
<entity-ref name="ip" type="list" names="ips" />
</entity>
<entity name="ip">
<attribute name="address" value-type="String" />
<attribute name="count" value-type="int" />
</entity>
</model>
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<file path="ip-codegen.xml" />
<file path="ip-model.xml" />
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<model model-package="com.dianping.cat.consumer.ip.model" enable-merger="true" enable-json-builder="true"
enable-xml-parser="true" enable-base-visitor="true">
<entity name="ip-report" root="true">
<entity-ref name="segment" type="map" names="segments" />
</entity>
<entity name="segment">
<attribute name="minute" value-type="int" key="true" />
<entity-ref name="ip" type="map" names="ips" />
</entity>
<entity name="ip">
<attribute name="address" value-type="String" key="true"/>
<attribute name="count" value-type="int" format="#,###,###"/>
</entity>
</model>
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<model> <model>
<entity name="transaction-report" root="true"> <entity name="transaction-report" root="true">
<attribute name="domain" value-type="String" /> <attribute name="domain" value-type="String" />
<element name="domain" value-type="String" type="set" names="domains"/>
<attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" /> <attribute name="startTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" /> <attribute name="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<entity-ref name="type" type="list" names="types" /> <entity-ref name="type" type="list" names="types" />
......
...@@ -60,6 +60,12 @@ public class ManyAnalyzerTest extends ComponentTestCase { ...@@ -60,6 +60,12 @@ public class ManyAnalyzerTest extends ComponentTestCase {
@Override @Override
protected void store(List<AnalyzerResult> result) { protected void store(List<AnalyzerResult> result) {
} }
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
} }
public static class MockAnalyzer2 extends public static class MockAnalyzer2 extends
...@@ -82,6 +88,12 @@ public class ManyAnalyzerTest extends ComponentTestCase { ...@@ -82,6 +88,12 @@ public class ManyAnalyzerTest extends ComponentTestCase {
@Override @Override
protected void store(List<AnalyzerResult> result) { protected void store(List<AnalyzerResult> result) {
} }
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
} }
public static class MockAnalyzer3 extends public static class MockAnalyzer3 extends
...@@ -104,6 +116,12 @@ public class ManyAnalyzerTest extends ComponentTestCase { ...@@ -104,6 +116,12 @@ public class ManyAnalyzerTest extends ComponentTestCase {
@Override @Override
protected void store(List<AnalyzerResult> result) { protected void store(List<AnalyzerResult> result) {
} }
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
} }
public static class AnalyzerResult { public static class AnalyzerResult {
......
...@@ -78,6 +78,12 @@ public class OneAnalyzerTwoDurationTest extends ComponentTestCase { ...@@ -78,6 +78,12 @@ public class OneAnalyzerTwoDurationTest extends ComponentTestCase {
@Override @Override
protected void store(List<AnalyzerResult> result) { protected void store(List<AnalyzerResult> result) {
} }
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
} }
public static class AnalyzerResult { public static class AnalyzerResult {
......
package com.dianping.cat.consumer.ip;
import org.junit.Assert;
import org.junit.Test;
import com.dianping.cat.consumer.ip.model.entity.IpReport;
import com.dianping.cat.consumer.ip.model.transform.DefaultParser;
import com.site.helper.Files;
public class IpAnalyzerTest {
@Test
public void testXml() throws Exception {
DefaultParser parser = new DefaultParser();
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("ip.xml"), "utf-8");
IpReport report = parser.parse(expected);
Assert.assertEquals("XML is not well parsed!", expected.replace("\r", ""), report.toString().replace("\r", ""));
}
}
...@@ -93,7 +93,7 @@ public class TransactionReportMessageAnalyzerTest { ...@@ -93,7 +93,7 @@ public class TransactionReportMessageAnalyzerTest {
analyzer.process(tree); analyzer.process(tree);
} }
TransactionReport report = analyzer.generate(); TransactionReport report = analyzer.generate("group");
TransactionType typeA = report.getTypes().get("A"); TransactionType typeA = report.getTypes().get("A");
TransactionName n1 = typeA.getNames().get("n1"); TransactionName n1 = typeA.getNames().get("n1");
assertEquals(1000, n1.getTotalCount()); assertEquals(1000, n1.getTotalCount());
......
<ip-report domain="Review" startTime="2012-01-25 13:00:00" endTime="2012-01-25 13:59:00">
<segment minute="24">
<ip address="127.0.0.1" count="123"/>
<ip address="192.168.63.30" count="3"/>
</segment>
<segment>
</segment>
</ip-report>
...@@ -138,7 +138,12 @@ public class DefaultMessageManager extends ContainerHolder implements MessageMan ...@@ -138,7 +138,12 @@ public class DefaultMessageManager extends ContainerHolder implements MessageMan
m_tree.setDomain(domain); m_tree.setDomain(domain);
m_tree.setSessionToken(sessionToken); m_tree.setSessionToken(sessionToken);
m_tree.setRequestToken(requestToken); m_tree.setRequestToken(requestToken);
m_tree.setThreadId(Long.toHexString(Thread.currentThread().getId()));
Thread thread = Thread.currentThread();
m_tree.setThreadId(Long.toHexString(thread.getId()));
m_tree.setThreadId(thread.getName());
m_tree.setHostName(hostName); m_tree.setHostName(hostName);
m_tree.setIpAddress(ipAddress); m_tree.setIpAddress(ipAddress);
m_tree.setMessageId(UUID.randomUUID().toString()); // TODO optimize it m_tree.setMessageId(UUID.randomUUID().toString()); // TODO optimize it
......
...@@ -2,6 +2,7 @@ package com.dianping.cat.message.spi; ...@@ -2,6 +2,7 @@ package com.dianping.cat.message.spi;
import java.util.List; import java.util.List;
public abstract class AbstractMessageAnalyzer<R> implements MessageAnalyzer { public abstract class AbstractMessageAnalyzer<R> implements MessageAnalyzer {
@Override @Override
public void analyze(MessageQueue queue) { public void analyze(MessageQueue queue) {
...@@ -31,6 +32,8 @@ public abstract class AbstractMessageAnalyzer<R> implements MessageAnalyzer { ...@@ -31,6 +32,8 @@ public abstract class AbstractMessageAnalyzer<R> implements MessageAnalyzer {
protected abstract void store(List<R> result); protected abstract void store(List<R> result);
public abstract List<R> generate(); public abstract List<R> generate();
public abstract R generate(String domain);
protected abstract void process(MessageTree tree); protected abstract void process(MessageTree tree);
......
...@@ -19,6 +19,8 @@ public interface MessageTree { ...@@ -19,6 +19,8 @@ public interface MessageTree {
public String getThreadId(); public String getThreadId();
public String getThreadName();
public void setDomain(String domain); public void setDomain(String domain);
public void setHostName(String hostName); public void setHostName(String hostName);
...@@ -34,4 +36,6 @@ public interface MessageTree { ...@@ -34,4 +36,6 @@ public interface MessageTree {
public void setSessionToken(String sessionToken); public void setSessionToken(String sessionToken);
public void setThreadId(String threadId); public void setThreadId(String threadId);
public void setThreadName(String threadName);
} }
...@@ -64,6 +64,7 @@ public class HtmlMessageCodec implements MessageCodec { ...@@ -64,6 +64,7 @@ public class HtmlMessageCodec implements MessageCodec {
count += helper.td(buf, tree.getHostName()); count += helper.td(buf, tree.getHostName());
count += helper.td(buf, tree.getIpAddress()); count += helper.td(buf, tree.getIpAddress());
count += helper.td(buf, tree.getThreadId()); count += helper.td(buf, tree.getThreadId());
count += helper.td(buf, tree.getThreadName());
count += helper.td(buf, tree.getMessageId()); count += helper.td(buf, tree.getMessageId());
count += helper.td(buf, tree.getRequestToken()); count += helper.td(buf, tree.getRequestToken());
count += helper.td(buf, tree.getSessionToken()); count += helper.td(buf, tree.getSessionToken());
...@@ -320,13 +321,15 @@ public class HtmlMessageCodec implements MessageCodec { ...@@ -320,13 +321,15 @@ public class HtmlMessageCodec implements MessageCodec {
* Thread safe date helper class. DateFormat is NOT thread safe. * Thread safe date helper class. DateFormat is NOT thread safe.
*/ */
protected static class DateHelper { protected static class DateHelper {
private static final String DATE_PATTERN = "HH:mm:ss.SSS";
private BlockingQueue<SimpleDateFormat> m_queue = new ArrayBlockingQueue<SimpleDateFormat>(20); private BlockingQueue<SimpleDateFormat> m_queue = new ArrayBlockingQueue<SimpleDateFormat>(20);
public String format(long timestamp) { public String format(long timestamp) {
SimpleDateFormat format = m_queue.poll(); SimpleDateFormat format = m_queue.poll();
if (format == null) { if (format == null) {
format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); format = new SimpleDateFormat(DATE_PATTERN);
} }
try { try {
...@@ -342,7 +345,7 @@ public class HtmlMessageCodec implements MessageCodec { ...@@ -342,7 +345,7 @@ public class HtmlMessageCodec implements MessageCodec {
SimpleDateFormat format = m_queue.poll(); SimpleDateFormat format = m_queue.poll();
if (format == null) { if (format == null) {
format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); format = new SimpleDateFormat(DATE_PATTERN);
} }
try { try {
......
...@@ -53,6 +53,7 @@ public class PlainTextMessageCodec implements MessageCodec { ...@@ -53,6 +53,7 @@ public class PlainTextMessageCodec implements MessageCodec {
String hostName = helper.read(buf, TAB); String hostName = helper.read(buf, TAB);
String ipAddress = helper.read(buf, TAB); String ipAddress = helper.read(buf, TAB);
String threadId = helper.read(buf, TAB); String threadId = helper.read(buf, TAB);
String threadName = helper.read(buf, TAB);
String messageId = helper.read(buf, TAB); String messageId = helper.read(buf, TAB);
String requestToken = helper.read(buf, TAB); String requestToken = helper.read(buf, TAB);
String sessionToken = helper.read(buf, LF); String sessionToken = helper.read(buf, LF);
...@@ -62,6 +63,7 @@ public class PlainTextMessageCodec implements MessageCodec { ...@@ -62,6 +63,7 @@ public class PlainTextMessageCodec implements MessageCodec {
tree.setHostName(hostName); tree.setHostName(hostName);
tree.setIpAddress(ipAddress); tree.setIpAddress(ipAddress);
tree.setThreadId(threadId); tree.setThreadId(threadId);
tree.setThreadName(threadName);
tree.setMessageId(messageId); tree.setMessageId(messageId);
tree.setRequestToken(requestToken); tree.setRequestToken(requestToken);
tree.setSessionToken(sessionToken); tree.setSessionToken(sessionToken);
...@@ -208,6 +210,8 @@ public class PlainTextMessageCodec implements MessageCodec { ...@@ -208,6 +210,8 @@ public class PlainTextMessageCodec implements MessageCodec {
count += helper.write(buf, TAB); count += helper.write(buf, TAB);
count += helper.write(buf, tree.getThreadId()); count += helper.write(buf, tree.getThreadId());
count += helper.write(buf, TAB); count += helper.write(buf, TAB);
count += helper.write(buf, tree.getThreadName());
count += helper.write(buf, TAB);
count += helper.write(buf, tree.getMessageId()); count += helper.write(buf, tree.getMessageId());
count += helper.write(buf, TAB); count += helper.write(buf, TAB);
count += helper.write(buf, tree.getRequestToken()); count += helper.write(buf, tree.getRequestToken());
......
...@@ -24,6 +24,8 @@ public class DefaultMessageTree implements MessageTree { ...@@ -24,6 +24,8 @@ public class DefaultMessageTree implements MessageTree {
private String m_threadId; private String m_threadId;
private String m_threadName;
private Message m_message; private Message m_message;
@Override @Override
...@@ -66,6 +68,10 @@ public class DefaultMessageTree implements MessageTree { ...@@ -66,6 +68,10 @@ public class DefaultMessageTree implements MessageTree {
return m_threadId; return m_threadId;
} }
public String getThreadName() {
return m_threadName;
}
@Override @Override
public void setDomain(String domain) { public void setDomain(String domain) {
m_domain = domain; m_domain = domain;
...@@ -106,6 +112,10 @@ public class DefaultMessageTree implements MessageTree { ...@@ -106,6 +112,10 @@ public class DefaultMessageTree implements MessageTree {
m_threadId = threadId; m_threadId = threadId;
} }
public void setThreadName(String threadName) {
m_threadName = threadName;
}
@Override @Override
public String toString() { public String toString() {
PlainTextMessageCodec codec = new PlainTextMessageCodec(); PlainTextMessageCodec codec = new PlainTextMessageCodec();
......
...@@ -69,6 +69,7 @@ public class HtmlMessageCodecTest { ...@@ -69,6 +69,7 @@ public class HtmlMessageCodecTest {
tree.setRequestToken("requestToken"); tree.setRequestToken("requestToken");
tree.setSessionToken("sessionToken"); tree.setSessionToken("sessionToken");
tree.setThreadId("threadId"); tree.setThreadId("threadId");
tree.setThreadName("threadName");
return tree; return tree;
} }
...@@ -90,7 +91,7 @@ public class HtmlMessageCodecTest { ...@@ -90,7 +91,7 @@ public class HtmlMessageCodecTest {
Event event = newEvent("type", "name", timestamp, "0", "here is the data."); Event event = newEvent("type", "name", timestamp, "0", "here is the data.");
check(event, check(event,
"<tr><td>E2012-01-02 15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>here is the data.</td></tr>\r\n"); "<tr><td>E15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>here is the data.</td></tr>\r\n");
} }
@Test @Test
...@@ -102,7 +103,7 @@ public class HtmlMessageCodecTest { ...@@ -102,7 +103,7 @@ public class HtmlMessageCodecTest {
Event event = newEvent("Exception", Exception.class.getName(), timestamp, "ERROR", trace); Event event = newEvent("Exception", Exception.class.getName(), timestamp, "ERROR", trace);
check(event, check(event,
"<tr><td>E2012-01-02 15:33:41.987</td><td>Exception</td><td>java.lang.Exception</td><td class=\"error\">ERROR</td><td>java.lang.Exception\n<br>" "<tr><td>E15:33:41.987</td><td>Exception</td><td>java.lang.Exception</td><td class=\"error\">ERROR</td><td>java.lang.Exception\n<br>"
+ "\tat com.dianping.cat.message.spi.codec.PlainTextMessageCodecTest.testEventForException(PlainTextMessageCodecTest.java:112)\n<br>" + "\tat com.dianping.cat.message.spi.codec.PlainTextMessageCodecTest.testEventForException(PlainTextMessageCodecTest.java:112)\n<br>"
+ "\tat com.dianping.cat.message.spi.codec.PlainTextMessageCodecTest.testEventForException(PlainTextMessageCodecTest.java:108)\n<br>" + "\tat com.dianping.cat.message.spi.codec.PlainTextMessageCodecTest.testEventForException(PlainTextMessageCodecTest.java:108)\n<br>"
+ "</td></tr>\r\n"); + "</td></tr>\r\n");
...@@ -114,7 +115,7 @@ public class HtmlMessageCodecTest { ...@@ -114,7 +115,7 @@ public class HtmlMessageCodecTest {
Heartbeat heartbeat = newHeartbeat("type", "name", timestamp, "0", "here is the data."); Heartbeat heartbeat = newHeartbeat("type", "name", timestamp, "0", "here is the data.");
check(heartbeat, check(heartbeat,
"<tr><td>H2012-01-02 15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>here is the data.</td></tr>\r\n"); "<tr><td>H15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>here is the data.</td></tr>\r\n");
} }
@Test @Test
...@@ -123,14 +124,14 @@ public class HtmlMessageCodecTest { ...@@ -123,14 +124,14 @@ public class HtmlMessageCodecTest {
DefaultMessageTree tree = newMessageTree(); DefaultMessageTree tree = newMessageTree();
long timestamp = 1325489621987L; long timestamp = 1325489621987L;
String expected1 = "<table class=\"logview\">\r\n" String expected1 = "<table class=\"logview\">\r\n"
+ "<tr><td>HT1</td><td>domain</td><td>hostName</td><td>ipAddress</td><td>threadId</td><td>messageId</td><td>requestToken</td><td>sessionToken</td></tr>\r\n" + "<tr><td>HT1</td><td>domain</td><td>hostName</td><td>ipAddress</td><td>threadId</td><td>threadName</td><td>messageId</td><td>requestToken</td><td>sessionToken</td></tr>\r\n"
+ "</table>"; + "</table>";
checkTree(tree, expected1); checkTree(tree, expected1);
String expected2 = "<table class=\"logview\">\r\n" String expected2 = "<table class=\"logview\">\r\n"
+ "<tr><td>HT1</td><td>domain</td><td>hostName</td><td>ipAddress</td><td>threadId</td><td>messageId</td><td>requestToken</td><td>sessionToken</td></tr>\r\n" + "<tr><td>HT1</td><td>domain</td><td>hostName</td><td>ipAddress</td><td>threadId</td><td>messageId</td><td>requestToken</td><td>sessionToken</td></tr>\r\n"
+ "<tr class=\"odd\"><td>E2012-01-02 15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>here is the data.</td></tr>\r\n" + "<tr class=\"odd\"><td>E15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>here is the data.</td></tr>\r\n"
+ "</table>"; + "</table>";
tree.setMessage(newEvent("type", "name", timestamp, "0", "here is the data.")); tree.setMessage(newEvent("type", "name", timestamp, "0", "here is the data."));
...@@ -151,15 +152,15 @@ public class HtmlMessageCodecTest { ...@@ -151,15 +152,15 @@ public class HtmlMessageCodecTest {
root.addChild(newEvent("URL", "View", timestamp + 40, "0", "view=HTML")); root.addChild(newEvent("URL", "View", timestamp + 40, "0", "view=HTML"));
check(root, check(root,
"<tr><td>t2012-01-02 15:33:41.987</td><td>URL</td><td>Review</td><td></td><td></td></tr>\r\n" "<tr><td>t15:33:41.987</td><td>URL</td><td>Review</td><td></td><td></td></tr>\r\n"
+ "<tr><td>&nbsp;&nbsp;E2012-01-02 15:33:41.987</td><td>URL</td><td>Payload</td><td>0</td><td>ip=127.0.0.1&amp;ua=Mozilla 5.0...&amp;refer=...&amp;...</td></tr>\r\n" + "<tr><td>&nbsp;&nbsp;E15:33:41.987</td><td>URL</td><td>Payload</td><td>0</td><td>ip=127.0.0.1&amp;ua=Mozilla 5.0...&amp;refer=...&amp;...</td></tr>\r\n"
+ "<tr><td>&nbsp;&nbsp;A2012-01-02 15:33:41.987</td><td>Service</td><td>Auth</td><td>0</td><td>20ms userId=1357&amp;token=...</td></tr>\r\n" + "<tr><td>&nbsp;&nbsp;A15:33:41.987</td><td>Service</td><td>Auth</td><td>0</td><td>20ms userId=1357&amp;token=...</td></tr>\r\n"
+ "<tr><td>&nbsp;&nbsp;t2012-01-02 15:33:42.009</td><td>Cache</td><td>findReviewByPK</td><td></td><td></td></tr>\r\n" + "<tr><td>&nbsp;&nbsp;t15:33:42.009</td><td>Cache</td><td>findReviewByPK</td><td></td><td></td></tr>\r\n"
+ "<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;E2012-01-02 15:33:42.009</td><td>CacheHost</td><td>host-1</td><td>0</td><td>ip=192.168.8.123</td></tr>\r\n" + "<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;E15:33:42.009</td><td>CacheHost</td><td>host-1</td><td>0</td><td>ip=192.168.8.123</td></tr>\r\n"
+ "<tr><td>&nbsp;&nbsp;T2012-01-02 15:33:42.010</td><td>Cache</td><td>findReviewByPK</td><td class=\"error\">Missing</td><td>1ms 2468</td></tr>\r\n" + "<tr><td>&nbsp;&nbsp;T15:33:42.010</td><td>Cache</td><td>findReviewByPK</td><td class=\"error\">Missing</td><td>1ms 2468</td></tr>\r\n"
+ "<tr><td>&nbsp;&nbsp;A2012-01-02 15:33:42.012</td><td>DAL</td><td>findReviewByPK</td><td>0</td><td>5ms select title,content from Review where id = ?</td></tr>\r\n" + "<tr><td>&nbsp;&nbsp;A15:33:42.012</td><td>DAL</td><td>findReviewByPK</td><td>0</td><td>5ms select title,content from Review where id = ?</td></tr>\r\n"
+ "<tr><td>&nbsp;&nbsp;E2012-01-02 15:33:42.027</td><td>URL</td><td>View</td><td>0</td><td>view=HTML</td></tr>\r\n" + "<tr><td>&nbsp;&nbsp;E15:33:42.027</td><td>URL</td><td>View</td><td>0</td><td>view=HTML</td></tr>\r\n"
+ "<tr><td>T2012-01-02 15:33:42.087</td><td>URL</td><td>Review</td><td>0</td><td>100ms /review/2468</td></tr>\r\n"); + "<tr><td>T15:33:42.087</td><td>URL</td><td>Review</td><td>0</td><td>100ms /review/2468</td></tr>\r\n");
} }
@Test @Test
...@@ -168,6 +169,6 @@ public class HtmlMessageCodecTest { ...@@ -168,6 +169,6 @@ public class HtmlMessageCodecTest {
Transaction transaction = newTransaction("type", "name", timestamp, "0", 10, "here is the data."); Transaction transaction = newTransaction("type", "name", timestamp, "0", 10, "here is the data.");
check(transaction, check(transaction,
"<tr><td>A2012-01-02 15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>10ms here is the data.</td></tr>\r\n"); "<tr><td>A15:33:41.987</td><td>type</td><td>name</td><td>0</td><td>10ms here is the data.</td></tr>\r\n");
} }
} }
...@@ -81,6 +81,7 @@ public class PlainTextMessageCodecTest { ...@@ -81,6 +81,7 @@ public class PlainTextMessageCodecTest {
tree.setRequestToken("requestToken"); tree.setRequestToken("requestToken");
tree.setSessionToken("sessionToken"); tree.setSessionToken("sessionToken");
tree.setThreadId("threadId"); tree.setThreadId("threadId");
tree.setThreadName("threadName");
return tree; return tree;
} }
...@@ -127,7 +128,7 @@ public class PlainTextMessageCodecTest { ...@@ -127,7 +128,7 @@ public class PlainTextMessageCodecTest {
public void testMessageTree() { public void testMessageTree() {
DefaultMessageTree tree = newMessageTree(); DefaultMessageTree tree = newMessageTree();
long timestamp = 1325489621987L; long timestamp = 1325489621987L;
String expected = "PT1\tdomain\thostName\tipAddress\tthreadId\tmessageId\trequestToken\tsessionToken\n"; String expected = "PT1\tdomain\thostName\tipAddress\tthreadId\tthreadName\tmessageId\trequestToken\tsessionToken\n";
checkTree(tree, expected); checkTree(tree, expected);
......
...@@ -41,7 +41,7 @@ public class Handler implements PageHandler<Context> { ...@@ -41,7 +41,7 @@ public class Handler implements PageHandler<Context> {
.getCurrentAnalyzer("transaction"); .getCurrentAnalyzer("transaction");
if (analyzer != null) { if (analyzer != null) {
model.setReport(analyzer.generate()); model.setReport(analyzer.generate(ctx.getRequestContext().getParameterProvider().getParameter("domain")));
} else { } else {
model.setReport(new TransactionReport("none")); model.setReport(new TransactionReport("none"));
} }
......
...@@ -51,6 +51,13 @@ ...@@ -51,6 +51,13 @@
<tag-class>com.ebay.webres.taglib.basic.UseCssTagHandler</tag-class> <tag-class>com.ebay.webres.taglib.basic.UseCssTagHandler</tag-class>
<body-content>JSP</body-content> <body-content>JSP</body-content>
<attribute> <attribute>
<description><![CDATA[Set the css value with EL or a css ref.]]></description>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<attribute>
<description><![CDATA[Identify whether the link URL is secure or not.]]></description> <description><![CDATA[Identify whether the link URL is secure or not.]]></description>
<name>secure</name> <name>secure</name>
<required>false</required> <required>false</required>
...@@ -72,13 +79,6 @@ ...@@ -72,13 +79,6 @@
<type>java.lang.String</type> <type>java.lang.String</type>
</attribute> </attribute>
<attribute> <attribute>
<description><![CDATA[Set the css value with EL or a css ref.]]></description>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<attribute>
<description><![CDATA[Target placement for this css resource to render]]></description> <description><![CDATA[Target placement for this css resource to render]]></description>
<name>target</name> <name>target</name>
<required>false</required> <required>false</required>
...@@ -114,18 +114,18 @@ ...@@ -114,18 +114,18 @@
<tag-class>com.ebay.webres.taglib.basic.SetTagHandler</tag-class> <tag-class>com.ebay.webres.taglib.basic.SetTagHandler</tag-class>
<body-content>JSP</body-content> <body-content>JSP</body-content>
<attribute> <attribute>
<description><![CDATA[The name.]]></description> <description><![CDATA[The value]]></description>
<name>id</name> <name>value</name>
<required>true</required> <required>true</required>
<rtexprvalue>true</rtexprvalue> <rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type> <type>java.lang.Object</type>
</attribute> </attribute>
<attribute> <attribute>
<description><![CDATA[The value]]></description> <description><![CDATA[The name.]]></description>
<name>value</name> <name>id</name>
<required>true</required> <required>true</required>
<rtexprvalue>true</rtexprvalue> <rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type> <type>java.lang.String</type>
</attribute> </attribute>
<dynamic-attributes>false</dynamic-attributes> <dynamic-attributes>false</dynamic-attributes>
</tag> </tag>
...@@ -135,6 +135,13 @@ ...@@ -135,6 +135,13 @@
<tag-class>com.ebay.webres.taglib.basic.UseJsTagHandler</tag-class> <tag-class>com.ebay.webres.taglib.basic.UseJsTagHandler</tag-class>
<body-content>JSP</body-content> <body-content>JSP</body-content>
<attribute> <attribute>
<description><![CDATA[Set the js value with EL or a js ref.]]></description>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<attribute>
<description><![CDATA[Identify whether the link URL is secure or not.]]></description> <description><![CDATA[Identify whether the link URL is secure or not.]]></description>
<name>secure</name> <name>secure</name>
<required>false</required> <required>false</required>
...@@ -156,13 +163,6 @@ ...@@ -156,13 +163,6 @@
<type>java.lang.String</type> <type>java.lang.String</type>
</attribute> </attribute>
<attribute> <attribute>
<description><![CDATA[Set the js value with EL or a js ref.]]></description>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<attribute>
<description><![CDATA[Target placement for this js resource to render]]></description> <description><![CDATA[Target placement for this js resource to render]]></description>
<name>target</name> <name>target</name>
<required>false</required> <required>false</required>
...@@ -177,6 +177,13 @@ ...@@ -177,6 +177,13 @@
<tag-class>com.ebay.webres.taglib.basic.LinkTagHandler</tag-class> <tag-class>com.ebay.webres.taglib.basic.LinkTagHandler</tag-class>
<body-content>JSP</body-content> <body-content>JSP</body-content>
<attribute> <attribute>
<description><![CDATA[The value for link, could be a expression or a link ref.]]></description>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<attribute>
<description><![CDATA[Identify whether the link URL is secure or not.]]></description> <description><![CDATA[Identify whether the link URL is secure or not.]]></description>
<name>secure</name> <name>secure</name>
<required>false</required> <required>false</required>
...@@ -190,13 +197,6 @@ ...@@ -190,13 +197,6 @@
<rtexprvalue>true</rtexprvalue> <rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type> <type>java.lang.String</type>
</attribute> </attribute>
<attribute>
<description><![CDATA[The value for link, could be a expression or a link ref.]]></description>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<dynamic-attributes>true</dynamic-attributes> <dynamic-attributes>true</dynamic-attributes>
</tag> </tag>
<tag> <tag>
...@@ -205,6 +205,13 @@ ...@@ -205,6 +205,13 @@
<tag-class>com.ebay.webres.taglib.basic.ImageTagHandler</tag-class> <tag-class>com.ebay.webres.taglib.basic.ImageTagHandler</tag-class>
<body-content>JSP</body-content> <body-content>JSP</body-content>
<attribute> <attribute>
<description><![CDATA[The value for image, could be a expression or a image path.]]></description>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<attribute>
<description><![CDATA[Identify whether the image URL is secure or not.]]></description> <description><![CDATA[Identify whether the image URL is secure or not.]]></description>
<name>secure</name> <name>secure</name>
<required>false</required> <required>false</required>
...@@ -225,13 +232,6 @@ ...@@ -225,13 +232,6 @@
<rtexprvalue>true</rtexprvalue> <rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type> <type>java.lang.String</type>
</attribute> </attribute>
<attribute>
<description><![CDATA[The value for image, could be a expression or a image path.]]></description>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<dynamic-attributes>true</dynamic-attributes> <dynamic-attributes>true</dynamic-attributes>
</tag> </tag>
<tag> <tag>
......
...@@ -11,7 +11,10 @@ $(function(){ ...@@ -11,7 +11,10 @@ $(function(){
); );
$(function() $(function()
{ {
domainlinks = 'Domains ';
$.each(data.domains, function(i, t){domainlinks += "[ <a href=\"/cat/r/t?domain="+t+"\">"+t+"</a> ]"});
$("#domainlist").html(domainlinks);
$("#gridTable").jqGrid({ $("#gridTable").jqGrid({
datatype: "local", datatype: "local",
colNames:['Type', 'Total Count', 'Fail Count', 'Failure%', 'Sample Link', 'Min/Max/Avg/Std(ms)'], colNames:['Type', 'Total Count', 'Fail Count', 'Failure%', 'Sample Link', 'Min/Max/Avg/Std(ms)'],
...@@ -25,7 +28,7 @@ $(function() ...@@ -25,7 +28,7 @@ $(function()
], ],
sortname:'type', sortname:'type',
sortorder:'asc', sortorder:'asc',
caption: "Transaction Summary", caption: "Domain " + data["domain"] + " Transaction Summary",
height: '100%', height: '100%',
autowidth: true, autowidth: true,
loadComplete: function() { loadComplete: function() {
......
<%@ page contentType="text/html; charset=utf-8" %> <%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="a" uri="/WEB-INF/app.tld"%> <%@ taglib prefix="a" uri="/WEB-INF/app.tld"%>
<%@ taglib prefix="res" uri="http://www.ebay.com/webres"%> <%@ taglib prefix="res" uri="http://www.ebay.com/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.transaction.Context" scope="request"/> <jsp:useBean id="ctx"
<jsp:useBean id="payload" type="com.dianping.cat.report.page.transaction.Payload" scope="request"/> type="com.dianping.cat.report.page.transaction.Context" scope="request" />
<jsp:useBean id="model" type="com.dianping.cat.report.page.transaction.Model" scope="request"/> <jsp:useBean id="payload"
type="com.dianping.cat.report.page.transaction.Payload" scope="request" />
<jsp:useBean id="model"
type="com.dianping.cat.report.page.transaction.Model" scope="request" />
<a:body> <a:body>
<res:useCss value='${res.css.local.default_css}' target="head-css"/> <res:useCss value='${res.css.local.default_css}' target="head-css" />
<res:useCss value='${res.css.local.jquery_css}' target="head-css"/> <res:useCss value='${res.css.local.jquery_css}' target="head-css" />
<res:useCss value='${res.css.local.jqgrid_css}' target="head-css"/> <res:useCss value='${res.css.local.jqgrid_css}' target="head-css" />
<res:useJs value='${res.js.local.jquery_min_js}' target="head-js"/> <res:useJs value='${res.js.local.jquery_min_js}' target="head-js" />
<res:useJs value='${res.js.local.jquery_ui_min_js}' target="head-js"/> <res:useJs value='${res.js.local.jquery_ui_min_js}' target="head-js" />
<res:useJs value='${res.js.local.grid_js}' target="head-js"/> <res:useJs value='${res.js.local.grid_js}' target="head-js" />
<res:useJs value='${res.js.local.jqgrid_min_js}' target="head-js"/> <res:useJs value='${res.js.local.jqgrid_min_js}' target="head-js" />
<script type="text/javascript"> <script type="text/javascript">
var data = ${model.reportInJson}; var data = ${model.reportInJson};
</script> </script>
<table width="100%" border="0" cellpadding="6" cellspacing="0"
class="navbar">
<tbody>
<tr>
<td id="domainlist" nowrap="nowrap" align="left" class="seealso">
</td>
</tr>
</tbody>
</table>
<table id="gridTable"></table>
<div id="gridPager"></div>
<table id="gridTable"></table> <res:useJs value="${res.js.local.transaction_js}" target="bottom-js" />
<div id="gridPager"></div>
<res:useJs value="${res.js.local.transaction_js}" target="bottom-js"/>
</a:body> </a:body>
\ No newline at end of file
...@@ -16,14 +16,14 @@ ...@@ -16,14 +16,14 @@
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>com.dianping.cat</groupId> <groupId>com.dianping.cat</groupId>
<artifactId>cat-core</artifactId> <artifactId>cat-core</artifactId>
<version>0.1.0</version> <version>0.1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.dianping.cat</groupId> <groupId>com.dianping.cat</groupId>
<artifactId>cat-consumer</artifactId> <artifactId>cat-consumer</artifactId>
<version>0.1.0</version> <version>0.1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.site.common</groupId> <groupId>com.site.common</groupId>
...@@ -90,11 +90,11 @@ ...@@ -90,11 +90,11 @@
<artifactId>jsp-api</artifactId> <artifactId>jsp-api</artifactId>
<version>2.1</version> <version>2.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.12</version> <version>5.1.12</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jboss.netty</groupId> <groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId> <artifactId>netty</artifactId>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册