项目概览
eunomia-bpf 包含如下几个项目:
- eunomia-bpf:一个基于 libbpf 的 CO-RE eBPF 运行时库,使用 C/C++ 语言。提供 Rust 等语言的 sdk;提供 ecli 作为命令行工具;
- eunomia-cc:一个编译工具链;
- eunomia-exporter:使用 Prometheus 或 OpenTelemetry 进行可观测性数据收集,使用 Rust 编写;
- ebpm-template:使用 Github Action 进行远程编译,本地一键运行;
一个 eunomia-bpf 库
libbpf 主要功能的封装,一些用于用户开发的辅助功能。
- 提供将 ebpf 代码加载到内核并运行它的能力。
- 使用一些额外的数据来帮助加载和配置 eBPF 字节码。
- 多语言绑定:参见 eunomia-sdks。 我们现在有 Rust 的 API,将来会添加更多;
安装运行
大多数时候安装时只需要下载对应的二进制即可:
# download the release from https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecli
wget https://aka.pw/bpf-ecli -O ecli && chmod +x ecli
有关详细信息,请参见 eunomia-bpf 文件夹。 借助该库,我们提供了一个简单的 cli,在支持 eBPF 的内核版本上,您可以简单地使用 url 或路径运行预编译 eBPF 数据:
sudo ./ecli run https://eunomia-bpf.github.io/ebpm-template/package.json # simply run a pre-compiled ebpf code from a url
可以使用容器进行编译, 仅需要专注于编写内核态代码:
docker run -it -v ./examples/bpftools/bootstrap:/src yunwei37/ebpm:latest
sudo ./ecli run examples/bpftools/bootstrap/package.json # run the compiled ebpf code
更多的例子请参考 examples/bpftools 文件夹.
用于生成预编译 eBPF 数据的编译工具链
有关详细信息,请参阅编译工具链 eunomia-cc。
您也可以简单地使用 ebpm-template repo 作为 github 中的模板开始编写代码,只需推送后,Github Actions 即可以帮助您编译 CO-RE ebpf 代码!
一个可观测性工具
基于 async Rust 的 Prometheus 或 OpenTelemetry 自定义可观测性数据收集器: eunomia-exporter
可以自行编译或通过 release 下载
example
这是一个 opensnoop
程序,追踪所有的打开文件,源代码来自 bcc/libbpf-tools, 我们修改过后的源代码在这里: examples/bpftools/opensnoop
在编译之后,可以定义一个这样的配置文件:
programs:
- name: opensnoop
metrics:
counters:
- name: eunomia_file_open_counter
description: test
labels:
- name: pid
- name: comm
- name: filename
from: fname
compiled_ebpf_filename: examples/bpftools/opensnoop/package.json
然后,您可以在任何地方使用 config.yaml
和预编译的 eBPF 数据 package.json
启动 Prometheus 导出器,您可以看到如下指标:
您可以在任何内核版本上部署导出器,而无需依赖 LLVM/Clang
。 有关详细信息,请参阅 eunomia-exporter。