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

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

......@@ -34,11 +34,10 @@
<plugin>
<groupId>com.site.maven.plugins</groupId>
<artifactId>maven-codegen-plugin</artifactId>
<version>1.0.0-a5</version>
<version>1.0.3</version>
<executions>
<execution>
<!-- <id>generate failure report model</id> -->
<id>default-cli</id>
<id>generate failure report model</id>
<phase>generate-sources</phase>
<goals>
<goal>dal-model</goal>
......@@ -57,6 +56,17 @@
<manifest>${basedir}/src/main/resources/META-INF/dal/model/transaction-report-manifest.xml</manifest>
</configuration>
</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>
</plugin>
</plugins>
......
......@@ -125,6 +125,12 @@ public class FailureReportAnalyzer extends AbstractMessageAnalyzer<FailureReport
return reports;
}
@Override
public FailureReport generate(String domain) {
return generateByDomain(domain);
}
@Override
protected void store(List<FailureReport> reports) {
if (reports != null) {
......
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;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
......@@ -34,14 +36,13 @@ import com.site.lookup.annotation.Inject;
* @since Jan 5, 2012
*/
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
private MessageManager m_manager;
private TransactionReport report;
private Map<String, TransactionReport> m_reports = new HashMap<String, TransactionReport>();
private long m_extraTime;
......@@ -49,10 +50,17 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
private Logger m_logger;
private void computeMeanSquareDeviation() {
Collection<TransactionType> types = report.getTypes().values();
private long m_startTime;
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 typeFailCount = 0;
double typeSum = 0;
......@@ -91,16 +99,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
type.setFailPercent(100.0 * typeFailCount / typeCount);
type.setStd(std(typeCount, typeAvg, typeSum2));
}
}
/**
* @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);
return report;
}
@Override
......@@ -109,12 +108,27 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
}
@Override
public TransactionReport generate() {
computeMeanSquareDeviation();
public List<TransactionReport> generate() {
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;
}
// TODO
private String getTransactionFileName(TransactionReport report) {
StringBuffer result = new StringBuffer();
String start = FILE_SDF.format(report.getStartTime());
......@@ -139,7 +153,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
@Override
protected boolean isTimeout() {
long endTime = report.getEndTime().getTime();
long endTime = m_startTime + m_duration + m_extraTime;
long currentTime = System.currentTimeMillis();
if (currentTime > endTime + m_extraTime) {
......@@ -148,7 +162,7 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
return false;
}
private void process(Message message, String messageId) {
private void process(TransactionReport report, Message message, String messageId) {
if (message instanceof Transaction) {
Transaction t = (Transaction) message;
String tType = t.getType();
......@@ -184,33 +198,49 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
}
List<Message> children = t.getChildren();
for (Message child : children) {
process(child, null);
process(report, child, null);
}
}
}
@Override
protected void process(MessageTree tree) {
String domain = tree.getDomain();
TransactionReport report = this.m_reports.get(domain);
if (report == null) {
this.report = new TransactionReport(tree.getDomain());
report = new TransactionReport(domain);
this.m_reports.put(domain, report);
}
Message message = tree.getMessage();
process(message, tree.getMessageId());
process(report, message, tree.getMessageId());
}
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_startTime = startTime;
m_duration = duration;
}
public void setReportPath(String 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
protected void store(TransactionReport result) {
protected void store(List<TransactionReport> reports) {
if (reports == null || reports.size() == 0) {
return;
}
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);
......@@ -227,4 +257,6 @@ public class TransactionReportAnalyzer extends AbstractMessageAnalyzer<Transacti
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 @@
<model>
<entity name="transaction-report" root="true">
<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="endTime" value-type="Date" format="yyyy-MM-dd HH:mm:ss" />
<entity-ref name="type" type="list" names="types" />
......
......@@ -59,6 +59,12 @@ public class ManyAnalyzerTest extends ComponentTestCase {
@Override
protected void store(List<AnalyzerResult> result) {
}
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
}
......@@ -81,6 +87,12 @@ public class ManyAnalyzerTest extends ComponentTestCase {
@Override
protected void store(List<AnalyzerResult> result) {
}
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
}
......@@ -103,6 +115,12 @@ public class ManyAnalyzerTest extends ComponentTestCase {
@Override
protected void store(List<AnalyzerResult> result) {
}
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
}
......
......@@ -77,6 +77,12 @@ public class OneAnalyzerTwoDurationTest extends ComponentTestCase {
@Override
protected void store(List<AnalyzerResult> result) {
}
@Override
public AnalyzerResult generate(String domain) {
// TODO Auto-generated method stub
return null;
}
}
......
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 {
analyzer.process(tree);
}
TransactionReport report = analyzer.generate();
TransactionReport report = analyzer.generate("group");
TransactionType typeA = report.getTypes().get("A");
TransactionName n1 = typeA.getNames().get("n1");
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
m_tree.setDomain(domain);
m_tree.setSessionToken(sessionToken);
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.setIpAddress(ipAddress);
m_tree.setMessageId(UUID.randomUUID().toString()); // TODO optimize it
......
......@@ -2,6 +2,7 @@ package com.dianping.cat.message.spi;
import java.util.List;
public abstract class AbstractMessageAnalyzer<R> implements MessageAnalyzer {
@Override
public void analyze(MessageQueue queue) {
......@@ -32,6 +33,8 @@ public abstract class AbstractMessageAnalyzer<R> implements MessageAnalyzer {
public abstract List<R> generate();
public abstract R generate(String domain);
protected abstract void process(MessageTree tree);
protected abstract boolean isTimeout();
......
......@@ -19,6 +19,8 @@ public interface MessageTree {
public String getThreadId();
public String getThreadName();
public void setDomain(String domain);
public void setHostName(String hostName);
......@@ -34,4 +36,6 @@ public interface MessageTree {
public void setSessionToken(String sessionToken);
public void setThreadId(String threadId);
public void setThreadName(String threadName);
}
......@@ -64,6 +64,7 @@ public class HtmlMessageCodec implements MessageCodec {
count += helper.td(buf, tree.getHostName());
count += helper.td(buf, tree.getIpAddress());
count += helper.td(buf, tree.getThreadId());
count += helper.td(buf, tree.getThreadName());
count += helper.td(buf, tree.getMessageId());
count += helper.td(buf, tree.getRequestToken());
count += helper.td(buf, tree.getSessionToken());
......@@ -320,13 +321,15 @@ public class HtmlMessageCodec implements MessageCodec {
* Thread safe date helper class. DateFormat is NOT thread safe.
*/
protected static class DateHelper {
private static final String DATE_PATTERN = "HH:mm:ss.SSS";
private BlockingQueue<SimpleDateFormat> m_queue = new ArrayBlockingQueue<SimpleDateFormat>(20);
public String format(long timestamp) {
SimpleDateFormat format = m_queue.poll();
if (format == null) {
format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
format = new SimpleDateFormat(DATE_PATTERN);
}
try {
......@@ -342,7 +345,7 @@ public class HtmlMessageCodec implements MessageCodec {
SimpleDateFormat format = m_queue.poll();
if (format == null) {
format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss");
format = new SimpleDateFormat(DATE_PATTERN);
}
try {
......
......@@ -53,6 +53,7 @@ public class PlainTextMessageCodec implements MessageCodec {
String hostName = helper.read(buf, TAB);
String ipAddress = helper.read(buf, TAB);
String threadId = helper.read(buf, TAB);
String threadName = helper.read(buf, TAB);
String messageId = helper.read(buf, TAB);
String requestToken = helper.read(buf, TAB);
String sessionToken = helper.read(buf, LF);
......@@ -62,6 +63,7 @@ public class PlainTextMessageCodec implements MessageCodec {
tree.setHostName(hostName);
tree.setIpAddress(ipAddress);
tree.setThreadId(threadId);
tree.setThreadName(threadName);
tree.setMessageId(messageId);
tree.setRequestToken(requestToken);
tree.setSessionToken(sessionToken);
......@@ -208,6 +210,8 @@ public class PlainTextMessageCodec implements MessageCodec {
count += helper.write(buf, TAB);
count += helper.write(buf, tree.getThreadId());
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, TAB);
count += helper.write(buf, tree.getRequestToken());
......
......@@ -24,6 +24,8 @@ public class DefaultMessageTree implements MessageTree {
private String m_threadId;
private String m_threadName;
private Message m_message;
@Override
......@@ -66,6 +68,10 @@ public class DefaultMessageTree implements MessageTree {
return m_threadId;
}
public String getThreadName() {
return m_threadName;
}
@Override
public void setDomain(String domain) {
m_domain = domain;
......@@ -106,6 +112,10 @@ public class DefaultMessageTree implements MessageTree {
m_threadId = threadId;
}
public void setThreadName(String threadName) {
m_threadName = threadName;
}
@Override
public String toString() {
PlainTextMessageCodec codec = new PlainTextMessageCodec();
......
......@@ -69,6 +69,7 @@ public class HtmlMessageCodecTest {
tree.setRequestToken("requestToken");
tree.setSessionToken("sessionToken");
tree.setThreadId("threadId");
tree.setThreadName("threadName");
return tree;
}
......@@ -90,7 +91,7 @@ public class HtmlMessageCodecTest {
Event event = newEvent("type", "name", timestamp, "0", "here is the data.");
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
......@@ -102,7 +103,7 @@ public class HtmlMessageCodecTest {
Event event = newEvent("Exception", Exception.class.getName(), timestamp, "ERROR", trace);
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:108)\n<br>"
+ "</td></tr>\r\n");
......@@ -114,7 +115,7 @@ public class HtmlMessageCodecTest {
Heartbeat heartbeat = newHeartbeat("type", "name", timestamp, "0", "here is the data.");
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
......@@ -123,14 +124,14 @@ public class HtmlMessageCodecTest {
DefaultMessageTree tree = newMessageTree();
long timestamp = 1325489621987L;
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>";
checkTree(tree, expected1);
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 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>";
tree.setMessage(newEvent("type", "name", timestamp, "0", "here is the data."));
......@@ -151,15 +152,15 @@ public class HtmlMessageCodecTest {
root.addChild(newEvent("URL", "View", timestamp + 40, "0", "view=HTML"));
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>&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;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;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;&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;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;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;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>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:41.987</td><td>URL</td><td>Review</td><td></td><td></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;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;t15:33:42.009</td><td>Cache</td><td>findReviewByPK</td><td></td><td></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;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;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;E15:33:42.027</td><td>URL</td><td>View</td><td>0</td><td>view=HTML</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
......@@ -168,6 +169,6 @@ public class HtmlMessageCodecTest {
Transaction transaction = newTransaction("type", "name", timestamp, "0", 10, "here is the data.");
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 {
tree.setRequestToken("requestToken");
tree.setSessionToken("sessionToken");
tree.setThreadId("threadId");
tree.setThreadName("threadName");
return tree;
}
......@@ -127,7 +128,7 @@ public class PlainTextMessageCodecTest {
public void testMessageTree() {
DefaultMessageTree tree = newMessageTree();
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);
......
......@@ -41,7 +41,7 @@ public class Handler implements PageHandler<Context> {
.getCurrentAnalyzer("transaction");
if (analyzer != null) {
model.setReport(analyzer.generate());
model.setReport(analyzer.generate(ctx.getRequestContext().getParameterProvider().getParameter("domain")));
} else {
model.setReport(new TransactionReport("none"));
}
......
......@@ -51,6 +51,13 @@
<tag-class>com.ebay.webres.taglib.basic.UseCssTagHandler</tag-class>
<body-content>JSP</body-content>
<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>
<name>secure</name>
<required>false</required>
......@@ -72,13 +79,6 @@
<type>java.lang.String</type>
</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>
<name>target</name>
<required>false</required>
......@@ -114,18 +114,18 @@
<tag-class>com.ebay.webres.taglib.basic.SetTagHandler</tag-class>
<body-content>JSP</body-content>
<attribute>
<description><![CDATA[The name.]]></description>
<name>id</name>
<description><![CDATA[The value]]></description>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<type>java.lang.Object</type>
</attribute>
<attribute>
<description><![CDATA[The value]]></description>
<name>value</name>
<description><![CDATA[The name.]]></description>
<name>id</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
<type>java.lang.String</type>
</attribute>
<dynamic-attributes>false</dynamic-attributes>
</tag>
......@@ -135,6 +135,13 @@
<tag-class>com.ebay.webres.taglib.basic.UseJsTagHandler</tag-class>
<body-content>JSP</body-content>
<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>
<name>secure</name>
<required>false</required>
......@@ -156,13 +163,6 @@
<type>java.lang.String</type>
</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>
<name>target</name>
<required>false</required>
......@@ -177,6 +177,13 @@
<tag-class>com.ebay.webres.taglib.basic.LinkTagHandler</tag-class>
<body-content>JSP</body-content>
<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>
<name>secure</name>
<required>false</required>
......@@ -190,13 +197,6 @@
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</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>
</tag>
<tag>
......@@ -205,6 +205,13 @@
<tag-class>com.ebay.webres.taglib.basic.ImageTagHandler</tag-class>
<body-content>JSP</body-content>
<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>
<name>secure</name>
<required>false</required>
......@@ -225,13 +232,6 @@
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</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>
</tag>
<tag>
......
......@@ -12,6 +12,9 @@ $(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({
datatype: "local",
colNames:['Type', 'Total Count', 'Fail Count', 'Failure%', 'Sample Link', 'Min/Max/Avg/Std(ms)'],
......@@ -25,7 +28,7 @@ $(function()
],
sortname:'type',
sortorder:'asc',
caption: "Transaction Summary",
caption: "Domain " + data["domain"] + " Transaction Summary",
height: '100%',
autowidth: true,
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="res" uri="http://www.ebay.com/webres"%>
<jsp:useBean id="ctx" type="com.dianping.cat.report.page.transaction.Context" 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"/>
<jsp:useBean id="ctx"
type="com.dianping.cat.report.page.transaction.Context" 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>
<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.jqgrid_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.jqgrid_css}' target="head-css" />
<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.grid_js}' target="head-js"/>
<res:useJs value='${res.js.local.jqgrid_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.grid_js}' target="head-js" />
<res:useJs value='${res.js.local.jqgrid_min_js}' target="head-js" />
<script type="text/javascript">
var data = ${model.reportInJson};
</script>
<script type="text/javascript">
var data = ${model.reportInJson};
</script>
<table id="gridTable"></table>
<div id="gridPager"></div>
<table width="100%" border="0" cellpadding="6" cellspacing="0"
class="navbar">
<tbody>
<tr>
<td id="domainlist" nowrap="nowrap" align="left" class="seealso">
</td>
<res:useJs value="${res.js.local.transaction_js}" target="bottom-js"/>
</tr>
</tbody>
</table>
<table id="gridTable"></table>
<div id="gridPager"></div>
<res:useJs value="${res.js.local.transaction_js}" target="bottom-js" />
</a:body>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册