从0到1开发eBPF监控工具gala-filetrace代码结构与核心组件解析【免费下载链接】gala-filetraceReal-time monitoring component of configuration files based on eBPF项目地址: https://gitcode.com/openeuler/gala-filetrace前往项目官网免费下载https://ar.openeuler.org/ar/gala-filetrace是A-OPS中的一个功能组件作为基于eBPF的配置文件实时监控工具主要用于对openEuler系统中配置文件进行实时监控并能将监控信息推送到gala-ragdoll。它支持监控多种命令和系统调用还能对接Prometheus提供API设置监控文件等功能。核心功能与架构概览 ✨主要功能特性gala-filetrace具备以下核心功能命令监控支持对vim/vi、sed、echo、cp、move等命令进行监控。系统调用监控可监控write等系统调用。Prometheus对接能够与Prometheus集成方便进行监控数据的收集和展示。API支持提供API用于设置监控文件。Web UI待开发未来将支持Web界面操作。整体架构设计gala-filetrace的实现架构围绕eBPF技术展开通过在Linux内核中植入eBPF程序实现对文件操作的高效跟踪和监控。其架构主要包括eBPF探针、用户空间程序以及相关的配置和输出组件。代码结构解析 gala-filetrace项目的代码结构清晰主要包含以下文件和目录关键源代码文件filetrace.bpf.c这是eBPF程序的核心实现文件定义了多个tracepoint来监控系统调用如sys_enter_openat、sys_enter_unlinkat、sys_enter_copy_file_range等用于捕获文件操作事件。filetrace.cpp用户空间程序的主要文件负责加载和附加eBPF程序处理从内核空间发送的事件并与配置和输出模块交互。exporter.cpp与Prometheus对接的导出器实现用于将监控数据以Prometheus可识别的格式暴露。post.cpp实现监控信息的推送功能可将数据推送到gala-ragdoll。头文件include/filetrace.h定义了事件结构、常量等公共数据结构和宏定义。include/exporter.hpp声明了与Prometheus导出相关的类和函数。include/post.hpp声明了信息推送相关的类和函数。配置文件config/gala-filetrace.json项目的配置文件包含主机ID、域名称、ragdoll API地址、是否推送、Prometheus导出器地址等配置项。config/gala-filetrace.servicesystemd服务配置文件用于将gala-filetrace作为系统服务管理。config/gala-filetrace.specRPM包构建规范文件。核心组件深入剖析 eBPF探针模块filetrace.bpf.ceBPF探针是gala-filetrace实现监控功能的核心。在filetrace.bpf.c中通过定义多个SEC(tracepoint/syscalls/...)函数来挂载到不同的系统调用入口点。例如监控文件打开操作的代码片段SEC(tracepoint/syscalls/sys_enter_openat) int enter_openat(const struct trace_event_raw_sys_enter *ctx) { struct task_struct* t; struct task_struct* p; struct event *e bpf_create_ringbuf(); if(!e) { return 0; } e-flag SYS_openat; t (struct task_struct*)bpf_get_current_task(); unsigned long pid_tgid bpf_get_current_pid_tgid(); e-pid pid_tgid 32; // 获取 tgid用户空间 PID bpf_probe_read(e-cmd, sizeof(e-cmd), t-comm); // ... 其他代码获取进程信息和文件路径等 bpf_ringbuf_submit(e, 0); return 0; }该函数在系统调用openat被调用时触发创建事件结构收集进程ID、命令、文件路径等信息并通过环形缓冲区ring buffer将事件发送到用户空间。同时为了获取文件名称gala-filetrace采用了特定的方法其原理可参考下图用户空间处理模块filetrace.cpp用户空间程序负责加载eBPF程序、处理事件和与外部系统交互。在filetrace.cpp的main函数中主要流程包括解析命令行参数获取配置文件路径和监控文件路径等。设置信号处理函数用于优雅退出。加载和验证eBPF程序骨架skeleton。创建PostData实例用于处理事件的发送和缓存。附加eBPF程序到相应的钩子点。创建环形缓冲区轮询并处理来自内核的事件。事件处理函数handle_event会对收到的事件进行验证和处理根据配置决定是否打印、发送或缓存事件。配置管理配置文件gala-filetrace.json中的配置项如下表所示配置项值说明host_idstring主机UUIDdomain_namestring主机所在域/数据中心ragdoll_apistringragdoll地址publishbool是否推送到ragdollexporter_addressstringPrometheus Node Exporter监听地址通过这些配置可以灵活调整gala-filetrace的行为。编译与运行指南 依赖安装根据不同的openEuler版本依赖安装方式有所不同。以openEuler 2203_SP3为例可通过仓库安装依赖# yum install bpftrace libcurl-devel libbpf-devel cpp-httplib-devel zlib-devel nlohmann-json-devel bpftool clang llvm cpp-httplib-devel编译可以直接编译或构建RPM包直接编译# 编译之前安装依赖包 # make deps # make # debug模式添加bpf_printk可通过cat /sys/kernel/debug/tracing/trace_pipe查看 # make DEBUG1RPM构建# wget -O ~/rpmbuild/SOURCES/master.zip https://raw.atomgit.com/openeuler/gala-filetrace/archive/refs/heads/master.zip # git clone https://gitcode.com/openeuler/gala-filetrace.git # rpmbuild -ba config/gala-filetrace.spec安装与启动编译安装# 默认安装 # make install # 自定义安装目录 # make install DESTDIR/your/install/pathRPM安装cd ~/rpmbuild/RPMS/arch rpm -ivh gala-filetrace-version-release.arch.rpm启动通过命令启动# filetrace通过systemd服务启动# systemctl start gala-filetrace总结gala-filetrace作为一款基于eBPF的配置文件实时监控工具通过精巧的代码结构和核心组件设计实现了对openEuler系统中文件操作的高效监控。其eBPF探针模块能够精准捕获各类文件操作事件用户空间处理模块则负责事件的接收、处理和输出配合灵活的配置管理使得gala-filetrace成为系统监控和管理的有力工具。通过本文的解析希望能帮助开发者更好地理解和使用gala-filetrace。【免费下载链接】gala-filetraceReal-time monitoring component of configuration files based on eBPF项目地址: https://gitcode.com/openeuler/gala-filetrace创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考