开发者必读如何为gala-gopher开发自定义eBPF探针模块【免费下载链接】gala-gopherA low-overhead eBPF-based probes framework项目地址: https://gitcode.com/openeuler/gala-gopher前往项目官网免费下载https://ar.openeuler.org/ar/gala-gopher是一款基于eBPF技术的低开销探针框架专为系统和应用性能观测设计。本文将详细介绍如何为gala-gopher开发自定义eBPF探针模块帮助开发者快速扩展其观测能力。1. 了解gala-gopher探针框架架构gala-gopher采用模块化设计主要由框架核心和探针程序两部分组成。探针分为Native探针C语言实现和Extend探针多语言支持eBPF探针属于Extend探针的一种。框架核心组件包括probe-mng负责探针生命周期管理ingress/egress数据接收与输出IMDB数据缓存处理API提供REST接口管理探针eBPF探针开发主要涉及src/probes/extends/ebpf.probe目录遵循统一的开发规范和目录结构。2. 开发环境准备2.1 必要依赖安装# 配置openEuler源 cat /etc/yum.repos.d/openEuler.repo EOF [source] nameSOURCE baseurlhttps://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS-SP2/source/ enabled1 gpgcheck0 [everything] nameEveryThing enabled1 gpgcheck0 baseurlhttp://repo.huaweicloud.com/openeuler/openEuler-20.03-LTS-SP2/everything/x86_64/ EOF # 安装编译依赖 yum install -y elfutils-devel clang llvm git2.2 获取源码git clone https://gitcode.com/openeuler/gala-gopher cd gala-gopher/src/probes/extends/ebpf.probe2.3 生成内核头文件eBPF程序需要内核头文件支持使用工具自动生成./build.sh -g生成的头文件位于src/include/目录如linux_4.19.90-2012.4.0.0053.oe1.h并通过vmlinux.h软链接引用。3. 开发eBPF探针的基本步骤3.1 创建探针目录结构在src目录下创建探针目录以myprobe为例mkdir -p src/myprobe cd src/myprobe touch myprobe.bpf.c myprobe.c myprobe.h myprobe.meta3.2 修改Makefile编辑src/Makefile添加新探针APPS : tcpprobe/tcpprobe \ myprobe/myprobe \ # 添加此行 lvsprobe/trace_lvs \ ...3.3 编写内核态eBPF程序内核态程序命名为myprobe.bpf.c使用框架提供的SDK#define BPF_PROG_KERN #include bpf.h // 定义Kprobe观测点 KPROBE(sys_write, pt_regs) { u32 pid bpf_get_current_pid_tgid() 32; u32 tid bpf_get_current_pid_tgid(); // 获取参数 int fd PT_REGS_PARM1(ctx); const char *buf (const char *)PT_REGS_PARM2(ctx); size_t count PT_REGS_PARM3(ctx); // 采集数据逻辑 // ... return 0; }3.4 编写用户态程序用户态程序命名为myprobe.c负责加载BPF程序和处理数据#include bpf.h #include myprobe.skel.h int main(int argc, char **argv) { struct myprobe_bpf *skel; int err; // 加载BPF程序 skel myprobe_bpf__open_and_load(); if (!skel) { fprintf(stderr, Failed to open and load BPF skeleton\n); return 1; } // 附加探针 err myprobe_bpf__attach(skel); if (err) { fprintf(stderr, Failed to attach BPF skeleton: %d\n, err); goto cleanup; } // 数据处理逻辑 // ... cleanup: myprobe_bpf__destroy(skel); return err 0 ? -err : 0; }3.5 定义元数据文件创建myprobe.meta文件定义数据格式version 1.0.0 measurements: ( { table_name: myprobe_write, entity_name: process, fields: ( { description: id of process, type: key, name: tgid, }, { description: write bytes, type: counter, name: write_bytes, }, ) } )3.6 实现数据上报按照meta定义的格式输出数据// 在用户态程序中 fprintf(stdout, |%s|%u|%llu|\n, myprobe_write, tgid, write_bytes);4. 编译与安装4.1 编译探针cd ../../../.. # 返回ebpf.probe目录 ./build.sh -b编译成功后在.output/myprobe目录下生成myprobe.bpf.oBPF目标文件myprobe.skel.h自动生成的BPF骨架头文件4.2 安装探针./install.sh探针将安装到/usr/bin/extends/ebpf.probe/目录。5. 集成到gala-gopher框架5.1 注册探针类型编辑src/common/ipc.h添加探针类型enum probe_type_e { PROBE_BASEINFO 1, // ... 其他探针 PROBE_MYPROBE, // 添加此行 PROBE_TYPE_MAX };5.2 配置REST API编辑src/lib/probe/pod_mng.c添加探针定义struct probe_define_s probe_define[] { // ... 其他探针 {myprobe, /opt/gala-gopher/extend_probes/myprobe, PROBE_MYPROBE}, };5.3 启动探针通过REST API启动探针curl -X PUT http://localhost:9999/myprobe --data-urlencode json { cmd: { probe: [myprobe_write] }, state: running } 6. 调试与验证6.1 查看探针状态curl http://localhost:9999/myprobe6.2 查看输出数据默认情况下数据输出到日志文件可在框架配置中修改输出方式如Kafka、Prometheustail -f /var/log/gala-gopher/metrics.log6.3 使用性能分析工具gala-gopher提供性能Profiling能力可用于调试探针性能7. 最佳实践与注意事项7.1 性能优化减少内核态数据量只采集必要数据批量处理使用ring buffer批量传输数据合理设置采样率高频率事件需设置采样7.2 跨内核版本兼容使用CO-RECompile Once - Run Everywhere技术通过BTF文件实现跨版本兼容# 检查BTF文件 ls /sys/kernel/btf/vmlinux7.3 参考现有探针TCP探针src/tcpprobe/NGINX探针src/nginxprobe/Kafka探针src/kafkaprobe/8. 总结通过本文介绍的步骤你可以快速开发并集成自定义eBPF探针到gala-gopher框架。关键步骤包括环境准备、探针代码编写、编译安装和框架集成。gala-gopher提供了完善的SDK和工具链简化了eBPF探针的开发难度。如需进一步了解可参考详细开发文档doc/how_to_add_probe.mdeBPF探针开发指南src/probes/extends/ebpf.probe/README.md祝你开发顺利【免费下载链接】gala-gopherA low-overhead eBPF-based probes framework项目地址: https://gitcode.com/openeuler/gala-gopher创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考