07.CAT-消息结构
CAT的消息结构 Message
整体类的结构图
client 与 server 的数据交互,支撑的数据结构就是 消息体 Message
7.01 Message
消息的结构定义
消息类型
Event
用来记录一件事发生的次数,比如记录系统异常Heartbeat
表示程序内定期产生的统计信息, 如CPU%, MEM%, 连接池状态, 系统负载等Metric
用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟Trace
用于记录基本的trace信息,类似于log4j的info信息Transaction
适合记录跨越系统边界的程序访问行为
7.02 MessageTree
CAT监控系统将每次URL、Service的请求内部执行情况都封装为一个完整的消息树、消息树可能包括Transaction、Event、Heartbeat、Metric等信息。
完整的消息树
可视化消息树
MessageTree的数据结构
public interface MessageTree extends Cloneable {
public MessageTree copy();
public String getDomain();
public String getHostName();
public String getIpAddress();
public Message getMessage();
public String getMessageId();
public String getParentMessageId();
public String getRootMessageId();
public String getSessionToken();
public String getThreadGroupName();
public String getThreadId();
public String getThreadName();
public boolean isSample();
public void setDomain(String domain);
public void setHostName(String hostName);
public void setIpAddress(String ipAddress);
public void setMessage(Message message);
public void setMessageId(String messageId);
public void setParentMessageId(String parentMessageId);
public void setRootMessageId(String rootMessageId);
public void setSessionToken(String sessionToken);
public void setThreadGroupName(String name);
public void setThreadId(String threadId);
public void setThreadName(String id);
public void setSample(boolean sample);
}
DefaultMessageTree
public class DefaultMessageTree implements MessageTree {
private ByteBuf m_buf;
private String m_domain;
private String m_hostName;
private String m_ipAddress;
private Message m_message;
private String m_messageId;
private String m_parentMessageId;
private String m_rootMessageId;
private String m_sessionToken;
private String m_threadGroupName;
private String m_threadId;
private String m_threadName;
private boolean m_sample = true;
@Override
public MessageTree copy() {
MessageTree tree = new DefaultMessageTree();
tree.setDomain(m_domain);
tree.setHostName(m_hostName);
tree.setIpAddress(m_ipAddress);
tree.setMessageId(m_messageId);
tree.setParentMessageId(m_parentMessageId);
tree.setRootMessageId(m_rootMessageId);
tree.setSessionToken(m_sessionToken);
tree.setThreadGroupName(m_threadGroupName);
tree.setThreadId(m_threadId);
tree.setThreadName(m_threadName);
tree.setMessage(m_message);
tree.setSample(m_sample);
return tree;
}
public ByteBuf getBuffer() {
return m_buf;
}
@Override
public String getDomain() {
return m_domain;
}
@Override
public String getHostName() {
return m_hostName;
}
@Override
public String getIpAddress() {
return m_ipAddress;
}
@Override
public Message getMessage() {
return m_message;
}
@Override
public String getMessageId() {
return m_messageId;
}
@Override
public String getParentMessageId() {
return m_parentMessageId;
}
@Override
public String getRootMessageId() {
return m_rootMessageId;
}
@Override
public String getSessionToken() {
return m_sessionToken;
}
@Override
public String getThreadGroupName() {
return m_threadGroupName;
}
@Override
public String getThreadId() {
return m_threadId;
}
@Override
public String getThreadName() {
return m_threadName;
}
@Override
public boolean isSample() {
return m_sample;
}
public void setBuffer(ByteBuf buf) {
m_buf = buf;
}
@Override
public void setDomain(String domain) {
m_domain = domain;
}
@Override
public void setHostName(String hostName) {
m_hostName = hostName;
}
@Override
public void setIpAddress(String ipAddress) {
m_ipAddress = ipAddress;
}
@Override
public void setMessage(Message message) {
m_message = message;
}
@Override
public void setMessageId(String messageId) {
if (messageId != null && messageId.length() > 0) {
m_messageId = messageId;
}
}
@Override
public void setParentMessageId(String parentMessageId) {
if (parentMessageId != null && parentMessageId.length() > 0) {
m_parentMessageId = parentMessageId;
}
}
@Override
public void setRootMessageId(String rootMessageId) {
if (rootMessageId != null && rootMessageId.length() > 0) {
m_rootMessageId = rootMessageId;
}
}
@Override
public void setSample(boolean sample) {
m_sample = sample;
}
@Override
public void setSessionToken(String sessionToken) {
m_sessionToken = sessionToken;
}
@Override
public void setThreadGroupName(String threadGroupName) {
m_threadGroupName = threadGroupName;
}
@Override
public void setThreadId(String threadId) {
m_threadId = threadId;
}
@Override
public void setThreadName(String threadName) {
m_threadName = threadName;
}
@Override
public String toString() {
PlainTextMessageCodec codec = new PlainTextMessageCodec();
ByteBuf buf = ByteBufAllocator.DEFAULT.buffer();
codec.encode(this, buf);
buf.readInt(); // get rid of length
codec.reset();
return buf.toString(Charset.forName("utf-8"));
}
小结
- 消息的结构主要取决于报表展示的。
- 关注消息树