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"));
    }

小结

  • 消息的结构主要取决于报表展示的。
  • 关注消息树
posted @ 2021-02-10 16:01  可可逗豆  阅读(235)  评论(0)    收藏  举报