开源工具学习记录之流程梳理
近期对腾讯的的开源项目: nettrace(网络故障分析工具) ,进行源码学习。
开源仓库:Nettrace开源仓库
开源工具实现注释:nettrace学习记录
nettrace rtt分析器

DEFINE_ANALYZER_ENTRY(rtt, TRACE_MODE_ALL_MASK)
{
/*1.通过define_pure_event提取rtt事件数据*/
define_pure_event(rtt_event_t, event, e->event);
char *msg = malloc(1024);
msg[0] = '\0';
/*2.将first_rtt和last_rtt格式化成字符串,用于输出和日志记录*/
sprintf(msg, PFMT_EMPH_STR(" *rtt:%ums, rtt_min:%ums*"),
event->first_rtt, event->last_rtt);
/*3.entry_set_msg将聚合后的消息绑定到当前分析条目analy_entry_t*/
entry_set_msg(e, msg);
return RESULT_CONT;
}
DEFINE_ANALYZER_EXIT_FUNC_DEFAULT(rtt)
1. rtt分析器逻辑
1.1 逻辑梳理
首先看一下哪些跟踪点会触发该分析器:
trace_t trace_tcp_ack_update_rtt = {
.desc = "",
.type = TRACE_FUNCTION,
.analyzer = &ANALYZER(rtt),
.is_backup = false,
.probe = false,
.name = "tcp_ack_update_rtt",
.sk = 1,
.custom = true,
.def = true,
.index = INDEX_tcp_ack_update_rtt,
.prog = "__trace_tcp_ack_update_rtt",
.parent = &group_tcp_state,
.rules = LIST_HEAD_INIT(trace_tcp_ack_update_rtt.rules),
};
trace_list_t trace_tcp_ack_update_rtt_list = {
.trace = &trace_tcp_ack_update_rtt,
.list = LIST_HEAD_INIT(trace_tcp_ack_update_rtt_list.list)
};
在跟踪点的定义中,发现tcp_ack_update_rtt触发该分析器;
看一下该分析器的具体逻辑:
analyzer_result_t analyzer_rtt_exit(trace_t *trace, analy_exit_t *e) __attribute__((weak));
analyzer_result_t analyzer_rtt_entry(trace_t *trace, analy_entry_t *e) __attribute__((weak));
/*analyzer_rtt结构体,trace_t中的.analyzer指向的就是这个结构体*/
analyzer_t analyzer_rtt = {
.analy_entry = analyzer_rtt_entry,
.analy_exit = analyzer_rtt_exit,
.mode = TRACE_MODE_ALL_MASK,
};
analyzer_result_t analyzer_rtt_entry(trace_t *trace, analy_entry_t *e)
{
/*1.通过define_pure_event提取rtt事件数据*/
define_pure_event(rtt_event_t, event

最低0.47元/天 解锁文章
1519

被折叠的 条评论
为什么被折叠?



