Nettrace 源码分析

开源工具学习记录之流程梳理

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

Nettrace 源码分析

nettrace数据分析模块主要涉及到以下几个文件中的源码:

  • nettrace.c
  • trace.c,trace.h
  • analysis.c,analysis.h
  • trace_group.c

在这里插入图片描述

1. 数据采集模块

详细分析:Nettrace数据采集方法研究

1.1 main()入口函数

nettrace.cmain()函数中,实现了从初始化跟踪数组, 到准备跟踪环境,再到加载并附加bpf程序, 最终通过trace_poll函数启动网络数据监听与数据处理;

在这里插入图片描述

int main(int argc, char *argv[])
{
   
   
	/*1.初始化跟踪组*/
	init_trace_group();
    /*2.参数解析*/
	do_parse_args(argc, argv);
	/*3.跟踪点有效性标记*/
	if (trace_prepare())
		goto err;
	/*4.加载并附加eBPF程序*/
	if (trace_bpf_load_and_attach()) {
   
   
		pr_err("failed to load bpf\n");
		goto err;
	}

	signal(SIGTERM, do_exit);
	signal(SIGINT, do_exit);

	pr_info("begin trace...\n");
	/*5.启动网络追踪功能*/
	trace_poll(trace_ctx);
	do_exit(0);
	return 0;
err:
	return -1;
}
1.1.1初始化跟踪组

在项目编译过程中,会通过gen_trace.py脚本去解析trace.yaml文件,生成trace_group.ckprobe_trace.h文件,前者定义了所有的挂载点以及跟踪点链表, 并组建成了跟踪点树, 后者对所有的挂载点定义了其索引;

                               nettrace.c ----------------- nettrace
                                  trace.c                       |
                                    xxxxx                       |
                                                                |
                                                                |
                            trace_group.c                       ||
trace.yaml -- gen_trace.py                                      ||
                            kprobe_trace.h                      ||
                                            kprobe.o → kprobe.skel.h
                                          ╱
                                  kprobe.c

trace_group.c文件中依靠init_trace_group()函数初始化了跟踪组,将项目所涉及的所有跟踪点构建成树的形式;

trace_group_t root_group = {
   
   
	.name = "all",
	.desc = "trace the whole kernel network stack",
	.children = LIST_HEAD_INIT(root_group.children),
	.traces = LIST_HEAD_INIT(root_group.traces),
	.list = LIST_HEAD_INIT(root_group.list),
};
trace_group_t group_link = {
   
   
	.name = "link",
	.desc = "link layer (L2) of the network stack",
	.children = LIST_HEAD_INIT(group_link.children),
	.traces = LIST_HEAD_INIT(group_link.traces),
	.list = LIST_HEAD_INIT(group_link.list),
};
trace_t trace_dev_gro_receive = {
   
   
	.desc = "",
	.type = TRACE_FUNCTION,
	.analyzer = &ANALYZER(default),
	.is_backup = false,
	.probe = false,
	.name = "dev_gro_receive",
	.skb = 2,
	.custom = false,
	.def = true,
	.index = INDEX_dev_gro_receive,
	.prog = "__trace_dev_gro_receive",
	.parent = &group_link_in,
	.rules = LIST_HEAD_INIT(trace_dev_gro_receive.rules),
};
trace_list_t trace_dev_gro_receive_list = {
   
   
	.trace = &trace_dev_gro_receive,
	.list = LIST_HEAD_INIT(trace_dev_gro_receive_list.list)
};
rule_t rule_trace_dev_gro_receive_0 = {
   
   	.level 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值