ebpf 采集ebpf 采集tag+tcp五元组
在这里对文章题目作一些说明。笔者想了很长时间也无法给这篇文章想个恰当的表意题目。实际上使用
ebpf来进行服务观测是有在进行的,比如获取目前l1s上的常见的四元组。但是本文不是介绍这部分可观测实践的。文章希望阐述的场景是:采集请求触发里的一些信息(诸如trace及其他header等)并和服务请求下游的传输层五元组(protocol, src-ip, src-port, dst-ip, dst-port)进行关联。这也是最近工作中实际遇到的问题。
基于ebpf的丰富的特性能够获取服务很多的信息,不同特性的组合更是可以达到极强的数据整合能力。比如通过uprobe便捷的获取业务信息后,结合kprobe来获取系统调用里的内容,可以获取一般侵入式可观测代码无法获取的内容。笔者最近遇到的一个实际问题是:获取服务A的接口/a响应后,向下游B发起的请求时,所使用的传输层五元组,同时带上结合一些/a触发时的一些内容,比如caller_fun或者traceId。
这里值得说明的是,用户态请求的是一个域名。域名的解析是在golang的http里完成的。但是请注意,golang发起tcp请求时,local port设置的是0,然后由内核态的tpc处理来选择一个空闲的port作为socket里的lport。这部分的信息通过代码的埋点显然是无法获取的(详情可参考TCP连接中客户端的端口号是如何确定的?)。
下面介绍下实现效果及思路。
关于
bpftrace使用的介绍,可以参见:bpftrace 无侵入遍历golang链表,关于ebpf来进行数据采集的实践,可以参见ebpf采集mysql请求信息及ebpf对应用安全的思考。
emacs org-mode 绘制思维导图
工作中难免会搞一些思维导图,一些小的需求又不希望切换窗口到另外一个界面去特地绘制。使用 emacs 来整理思维导图可以提升一些的效率,在当前窗口(文本编辑器)里即可完成简单思维导图的绘制。同时可以便于对工作内容进行归档(比如把相关的文本都放到一起)。live in emacs.
依赖内容
- org-contrib 扩展文件。用来将 org-mode 格式的文本转换成 freemind mm 文件。
- freemind 软件。用来查看生成的 mm 文件。
笔者试了一下,Xmind思维导图看起来无法打开mm文件,freemind工作正常。也可能是我操作有问题。
此外,生成的思维导图展现样式肯定没有目前专业的思维导图工具丰富,如果有正式的使用需求,还是首先考虑下专业的思维导图工具。
golang常见类型作为参数的eBPF解析
即将过去的2022年,笔者相当比例的精力都投入在了eBPF上。最初的时候,写了一篇golang 常见类型字节数 ,开启了
eBPF+golang的总结性工作。此后陆续整理了一些关于ebpf的使用文章,同时项目也在逐步的推进。eBPF的实际落地有很大的挑战,但是最终还是找到了一些落地的场景。年底了,结合最近的调研工作,笔者整理了这篇文章。既算是对之前文章的呼应,也是对今年整理内容的总结。
eBPF能够提供一种切入服务细节的独特视角。本文即通过实例,对golang常见类型作为函数参数时进行解析,期望读者能够感受这一视角。需要说明的是,本文是基于golang-1.16来整理的。
基于ebpf实现的gls
虽然
golang并不推荐使用goid来构建gls(goroutine local storage),仍然有着很多的实现gls并使用的尝试。github-gls这里是一个常见的实现,基本表述了golang里gls的实现思路:获取goid,基于goid构建一个存储。本文中笔者尝试基于ebpf来构建一个golang的gls。
基本功能
本文中基于ebpf实现的gls具有如下功能:
- 基于
goid的存储。即map[goid]=value; - 基于
goroutine派生关系设置的value缺省值。即map[goid=1]=121,且goid=1派生goid=2,则map[goid=2]=map[goid=1]=121;
本文建议参照黑魔法-ebpf-对用户空间数据的写入进行理解。
黑魔法--用 ebpf 构建用户空间数据的桥梁
在之前的示例中,仅涉及到ebpf对用户空间数据的读取。工程性较强的如:ebpf采集mysql请求信息及ebpf对应用安全的思考也仅是通过urpobe采集用户空间的数据。本文介绍点ebpf的“黑魔法”:将用户空间数据的读取、用户空间数据的写入结合起来,成为用户空间数据交互的桥梁。
ebpf采集mysql请求信息及ebpf对应用安全的思考
本文笔者继续介绍
ebpf的应用:使用bpftrace采集mysql连接信息,包括数据库地址、db_name、user_name。在展示采集操作的同时,附上对ebpf对云时代应用安全的一些思考。
目标
使用bpftrace对一个运行中进程的mysql请求进行采集,目标采集内容包括数据库地址、db_name、user_name。