提交 4b8edf98 编写于 作者: Y yong.you

add cat trace type

上级 cdb0015d
CAT [![Build Status](https://travis-ci.org/dianping/cat.png?branch=biz)](https://travis-ci.org/dianping/cat)
CAT
===
Central Application Tracking
<hr>
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数据源的基本信息,使用您自己的数据库链接信息
......
......@@ -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);
}
......
......@@ -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.
......
package com.dianping.cat.message;
/**
* <p>
* <code>Trace</code> is used to log anything for trace message info happens at a specific time. Such as an debug or info message.
* </p>
*
* <p>
* All CAT message will be constructed as a message tree and send to back-end for further analysis, and for monitoring.
* Only <code>Transaction</code> can be a tree node, all other message will be the tree leaf. The transaction without
* other messages nested is an atomic transaction.
* </p>
*
* @author Frankie Wu
*/
public interface Trace extends Message {
}
......@@ -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();
......
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);
}
}
}
......@@ -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
......
......@@ -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) {
......
......@@ -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("<a href=\"%s\" target=\"_blank\">[:: %s ::]</a>",
link, name));
count += helper.write(buf, String.format("<a href=\"%s\" target=\"_blank\">[:: %s ::]</a>", 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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册