From 4b8edf98e3f4d2f6795c5105183c5de47f2a03cb Mon Sep 17 00:00:00 2001 From: "yong.you" Date: Tue, 29 Oct 2013 18:01:49 +0800 Subject: [PATCH] add cat trace type --- README.md | 10 +++---- .../src/main/java/com/dianping/cat/Cat.java | 5 ++++ .../dianping/cat/message/MessageProducer.java | 28 ++++++++++++++++-- .../java/com/dianping/cat/message/Trace.java | 18 ++++++++++++ .../internal/DefaultMessageProducer.java | 29 +++++++++++++++++++ .../cat/message/internal/DefaultTrace.java | 27 +++++++++++++++++ .../cat/message/internal/NullMessage.java | 7 +++-- .../spi/codec/PlainTextMessageCodec.java | 20 +++++++++++++ .../message/spi/core/HtmlMessageCodec.java | 12 ++++---- 9 files changed, 142 insertions(+), 14 deletions(-) create mode 100644 cat-client/src/main/java/com/dianping/cat/message/Trace.java create mode 100644 cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTrace.java diff --git a/README.md b/README.md index bab5b5e46..1fb66f875 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -CAT [![Build Status](https://travis-ci.org/dianping/cat.png?branch=biz)](https://travis-ci.org/dianping/cat) +CAT === - -Central Application Tracking +
+Central Application Tracking [![Build Status](https://travis-ci.org/dianping/cat.png?branch=biz)](https://travis-ci.org/dianping/cat) #####1、安装Mysql服务器 #####2、配置Hadoop集群服务器【可选】 @@ -10,10 +10,10 @@ Central Application Tracking #####5、在本地磁盘中创建两个目录/data/appdatas/cat,以及/data/applogs/cat mkdir -p /data/appdatas/cat mkdir -p /data/applogs/cat -#####6、确保运行程序对上面两个目录拥有读写权限,比如用cat用户启动程序 +#####6、确保运行程序对刚刚创建的两个目录拥有读写权限,比如用cat用户启动程序 chown cat:cat /data/appdatas/cat -R chown cat:cat /data/applogs/cat -R -#####7、确保系统的临时目录程序拥有读写权限 +#####7、确保系统的临时目录程序拥有读写权限,Linux为/tmp/目录 #####8、拷贝script文件夹下的'client.xml datasources.xml server.xml'到/data/appdatas/cat目录下 cp script/*.xml /data/appdatas/cat #####9、修改/data/appdatas/cat/datasource.xml中cat数据源的基本信息,使用您自己的数据库链接信息 diff --git a/cat-client/src/main/java/com/dianping/cat/Cat.java b/cat-client/src/main/java/com/dianping/cat/Cat.java index 43af1f682..4a42e5154 100644 --- a/cat-client/src/main/java/com/dianping/cat/Cat.java +++ b/cat-client/src/main/java/com/dianping/cat/Cat.java @@ -21,6 +21,7 @@ import com.dianping.cat.message.Event; import com.dianping.cat.message.Heartbeat; import com.dianping.cat.message.Message; import com.dianping.cat.message.MessageProducer; +import com.dianping.cat.message.Trace; import com.dianping.cat.message.Transaction; import com.dianping.cat.message.spi.MessageManager; @@ -257,6 +258,10 @@ public class Cat { return Cat.getProducer().newEvent(type, name); } + public static Trace newTrace(String type, String name) { + return Cat.getProducer().newTrace(type, name); + } + public static Heartbeat newHeartbeat(String type, String name) { return Cat.getProducer().newHeartbeat(type, name); } diff --git a/cat-client/src/main/java/com/dianping/cat/message/MessageProducer.java b/cat-client/src/main/java/com/dianping/cat/message/MessageProducer.java index b75e31f60..7f5fcfc42 100644 --- a/cat-client/src/main/java/com/dianping/cat/message/MessageProducer.java +++ b/cat-client/src/main/java/com/dianping/cat/message/MessageProducer.java @@ -169,7 +169,21 @@ public interface MessageProducer { * @param nameValuePairs * name value pairs in the format of "a=1&b=2&..." */ - public void logEvent(String type, String name, String status, String nameValuePairs); + public void logEvent(String type, String name, String status, String nameValuePairs); + + /** + * Log an trace in one shot. + * + * @param type + * trace type + * @param name + * trace name + * @param status + * "0" means success, otherwise means error code + * @param nameValuePairs + * name value pairs in the format of "a=1&b=2&..." + */ + public void logTrace(String type, String name, String status, String nameValuePairs); /** * Log a heartbeat in one shot. @@ -205,7 +219,17 @@ public interface MessageProducer { * @param name * event name */ - public Event newEvent(String type, String name); + public Event newEvent(String type, String name); + + /** + * Create a new trace with given type and name. + * + * @param type + * trace type + * @param name + * trace name + */ + public Trace newTrace(String type, String name); /** * Create a new heartbeat with given type and name. diff --git a/cat-client/src/main/java/com/dianping/cat/message/Trace.java b/cat-client/src/main/java/com/dianping/cat/message/Trace.java new file mode 100644 index 000000000..ad987c5ed --- /dev/null +++ b/cat-client/src/main/java/com/dianping/cat/message/Trace.java @@ -0,0 +1,18 @@ +package com.dianping.cat.message; + +/** + *

+ * Trace is used to log anything for trace message info happens at a specific time. Such as an debug or info message. + *

+ * + *

+ * All CAT message will be constructed as a message tree and send to back-end for further analysis, and for monitoring. + * Only Transaction can be a tree node, all other message will be the tree leaf. The transaction without + * other messages nested is an atomic transaction. + *

+ * + * @author Frankie Wu + */ +public interface Trace extends Message { + +} diff --git a/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultMessageProducer.java b/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultMessageProducer.java index fc4d4eb93..6d68f5696 100644 --- a/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultMessageProducer.java +++ b/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultMessageProducer.java @@ -10,6 +10,7 @@ import com.dianping.cat.message.Heartbeat; import com.dianping.cat.message.Message; import com.dianping.cat.message.MessageProducer; import com.dianping.cat.message.Metric; +import com.dianping.cat.message.Trace; import com.dianping.cat.message.Transaction; import com.dianping.cat.message.spi.MessageManager; @@ -77,6 +78,18 @@ public class DefaultMessageProducer implements MessageProducer { event.complete(); } + @Override + public void logTrace(String type, String name, String status, String nameValuePairs) { + Trace trace = newTrace(type, name); + + if (nameValuePairs != null && nameValuePairs.length() > 0) { + trace.addData(nameValuePairs); + } + + trace.setStatus(status); + trace.complete(); + } + @Override public void logHeartbeat(String type, String name, String status, String nameValuePairs) { Heartbeat heartbeat = newHeartbeat(type, name); @@ -115,6 +128,22 @@ public class DefaultMessageProducer implements MessageProducer { } } + @Override + public Trace newTrace(String type, String name) { + if (!m_manager.hasContext()) { + m_manager.setup(); + } + + if (m_manager.isCatEnabled()) { + DefaultTrace trace = new DefaultTrace(type, name); + + m_manager.add(trace); + return trace; + } else { + return NullMessage.TRACE; + } + } + public Event newEvent(Transaction parent, String type, String name) { if (!m_manager.hasContext()) { m_manager.setup(); diff --git a/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTrace.java b/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTrace.java new file mode 100644 index 000000000..2938767b1 --- /dev/null +++ b/cat-client/src/main/java/com/dianping/cat/message/internal/DefaultTrace.java @@ -0,0 +1,27 @@ +package com.dianping.cat.message.internal; + +import com.dianping.cat.message.Trace; +import com.dianping.cat.message.spi.MessageManager; + +public class DefaultTrace extends AbstractMessage implements Trace { + private MessageManager m_manager; + + public DefaultTrace(String type, String name) { + super(type, name); + } + + public DefaultTrace(String type, String name, MessageManager manager) { + super(type, name); + + m_manager = manager; + } + + @Override + public void complete() { + setCompleted(true); + + if (m_manager != null && m_manager.getThreadLocalMessageTree().getMessage() == null) { + m_manager.add(this); + } + } +} diff --git a/cat-client/src/main/java/com/dianping/cat/message/internal/NullMessage.java b/cat-client/src/main/java/com/dianping/cat/message/internal/NullMessage.java index 2f7e06cf4..42831f65d 100644 --- a/cat-client/src/main/java/com/dianping/cat/message/internal/NullMessage.java +++ b/cat-client/src/main/java/com/dianping/cat/message/internal/NullMessage.java @@ -7,15 +7,18 @@ import com.dianping.cat.message.Event; import com.dianping.cat.message.Heartbeat; import com.dianping.cat.message.Message; import com.dianping.cat.message.Metric; +import com.dianping.cat.message.Trace; import com.dianping.cat.message.Transaction; -public enum NullMessage implements Transaction, Event, Metric, Heartbeat { +public enum NullMessage implements Transaction, Event, Metric, Trace, Heartbeat { TRANSACTION, EVENT, - + METRIC, + TRACE, + HEARTBEAT; @Override diff --git a/cat-client/src/main/java/com/dianping/cat/message/spi/codec/PlainTextMessageCodec.java b/cat-client/src/main/java/com/dianping/cat/message/spi/codec/PlainTextMessageCodec.java index d682a3402..c3252cba7 100644 --- a/cat-client/src/main/java/com/dianping/cat/message/spi/codec/PlainTextMessageCodec.java +++ b/cat-client/src/main/java/com/dianping/cat/message/spi/codec/PlainTextMessageCodec.java @@ -22,10 +22,12 @@ import com.dianping.cat.message.Event; import com.dianping.cat.message.Heartbeat; import com.dianping.cat.message.Message; import com.dianping.cat.message.Metric; +import com.dianping.cat.message.Trace; import com.dianping.cat.message.Transaction; import com.dianping.cat.message.internal.DefaultEvent; import com.dianping.cat.message.internal.DefaultHeartbeat; import com.dianping.cat.message.internal.DefaultMetric; +import com.dianping.cat.message.internal.DefaultTrace; import com.dianping.cat.message.internal.DefaultTransaction; import com.dianping.cat.message.spi.MessageCodec; import com.dianping.cat.message.spi.MessageTree; @@ -165,6 +167,22 @@ public class PlainTextMessageCodec implements MessageCodec, LogEnabled { } else { return event; } + } else if (identifier == 'L') { + DefaultTrace trace = new DefaultTrace(type, name); + String status = helper.read(buf, TAB); + String data = helper.readRaw(buf, TAB); + + helper.read(buf, LF); // get rid of line feed + trace.setTimestamp(m_dateHelper.parse(timestamp)); + trace.setStatus(status); + trace.addData(data); + + if (parent != null) { + parent.addChild(trace); + return parent; + } else { + return trace; + } } else if (identifier == 'M') { DefaultMetric metric = new DefaultMetric(type, name); String status = helper.read(buf, TAB); @@ -339,6 +357,8 @@ public class PlainTextMessageCodec implements MessageCodec, LogEnabled { } } else if (message instanceof Event) { return encodeLine(message, buf, 'E', Policy.DEFAULT); + } else if (message instanceof Trace) { + return encodeLine(message, buf, 'L', Policy.DEFAULT); } else if (message instanceof Metric) { return encodeLine(message, buf, 'M', Policy.DEFAULT); } else if (message instanceof Heartbeat) { diff --git a/cat-core/src/main/java/com/dianping/cat/message/spi/core/HtmlMessageCodec.java b/cat-core/src/main/java/com/dianping/cat/message/spi/core/HtmlMessageCodec.java index a25da5f1e..3359539f6 100644 --- a/cat-core/src/main/java/com/dianping/cat/message/spi/core/HtmlMessageCodec.java +++ b/cat-core/src/main/java/com/dianping/cat/message/spi/core/HtmlMessageCodec.java @@ -18,6 +18,7 @@ import com.dianping.cat.message.Event; import com.dianping.cat.message.Heartbeat; import com.dianping.cat.message.Message; import com.dianping.cat.message.Metric; +import com.dianping.cat.message.Trace; import com.dianping.cat.message.Transaction; import com.dianping.cat.message.spi.MessageCodec; import com.dianping.cat.message.spi.MessageTree; @@ -184,7 +185,7 @@ public class HtmlMessageCodec implements MessageCodec, Initializable { count += helper.tr1(buf, null); } - String link = message.getData().toString(); + String link = message.getData().toString(); count += helper.td1(buf); @@ -213,14 +214,13 @@ public class HtmlMessageCodec implements MessageCodec, Initializable { count += helper.tr1(buf, null); } - String link = message.getData().toString(); + String link = message.getData().toString(); String name = message.getName(); - + count += helper.td1(buf); count += helper.nbsp(buf, level * 2); // 2 spaces per level - count += helper.write(buf, String.format("[:: %s ::]", - link, name)); + count += helper.write(buf, String.format("[:: %s ::]", link, name)); count += helper.td2(buf); count += helper.tr2(buf); count += helper.crlf(buf); @@ -262,6 +262,8 @@ public class HtmlMessageCodec implements MessageCodec, Initializable { } else { return encodeLine(tree, message, buf, 'E', Policy.DEFAULT, level, counter); } + } else if (message instanceof Trace) { + return encodeLine(tree, message, buf, 'L', Policy.DEFAULT, level, counter); } else if (message instanceof Metric) { return encodeLine(tree, message, buf, 'M', Policy.DEFAULT, level, counter); } else if (message instanceof Heartbeat) { -- GitLab