eBPF Tracing
安装¶
eBPF 链路功能分为 eBPF Span(以下简称 eSpan) 的采集器和汇集并链接 eSpan 生成 Trace 的链接器。
- eSpan 的采集功能由 DataKit 中的
ebpf外部采集器实现 - 数据汇集和链接功能由 DataKit ELinker/DataKit 中的
ebpftrace采集器实现。
单个 ebpftrace 采集器接收并链接来自多个 ebpf 采集器的 eSpan 数据,目前数量配比必须为 1:N。
安装 eSpan 的采集器¶
在主机或者集群部署 DataKit。
安装 eSpan 的链接器¶
有主机部署和 Kubernetes 部署安装方案:
-
主机部署 DataKit 的 ELinker 版本或者 DataKit,两种方式目前将互相覆盖:
- 安装 DataKit ELinker。该版本不含
ebpf采集器。 - 安装 DataKit 。该方式后续可能会废弃。
- 安装 DataKit ELinker。该版本不含
-
Kubernetes 部署 DataKit ELinker:
下载 datakit-elinker.yaml,执行命令 kubectl apply -f datakit-elinker.yaml,可通过指定命名空间 datakit-elinker,如 kubectl -n datakit-elinker get all -owide 查看相关资源
为了降低误操作造成的数据污染可能性,推荐部署 DataKit ELinker 而非 DataKit。DataKit 的 ELinker 版本相较于 DataKit 的二进制和镜像大小分别减少约 50% 和 75%。
配置¶
前置条件¶
如果数据量在 1e6 span/min,目前需要至少提供 4C 的 cpu 资源和 4G 的 mem 资源,推荐部署在使用 SSD 硬盘的主机上。
DataKit ELinker 或 DataKit 中的 ebpftrace 插件用于接收和链接 eBPF span , 最终实现链路 trace_id 的生成,并建立 span 间的父子关系。
请参考以下部署模型(如下图): 需要使所有 ebpf 外部采集器的 ebpf-trace 插件生成的 eBPF span 数据发送至同一个开启 ebpftrace 采集器的 DataKit ELinker 或 DataKit 上
如果一个服务的三个应用 App 1 ~ 3 位于两个不同的节点,
ebpftrace目前根据 TCP seq 等来确认进程间的网络调用关系,需要对相关 eBPF span 进行链接以此生成trace_id和设置parent_id。
graph LR
subgraph Node 2
direction LR
dk_ebpf2("App: datakit-ebpf<br/>(ebpf-trace plugin on)")
App1("App 1")
end
subgraph Node 3
direction LR
dk_ebpf3("App: datakit-ebpf<br/>(ebpf-trace plugin on)")
App5("App 3")
end
subgraph Node 1
direction LR
dk_ebpf1("App: datakit-ebpf<br/>(ebpf-trace plugin on)")
App7("App 2")
subgraph Linux Container
App21("App 4")
end
end
%% Aggregator
dk("App: DataKit<br/>(with ebpftracing plugin)")
DataWay("DataWay")
%% Connections
dk_ebpf1 -- "eBPF Span (HTTP POST)" --> dk
dk_ebpf2 -- "eBPF Span (HTTP POST)" --> dk
dk_ebpf3 -- "eBPF Span (HTTP POST)" --> dk
dk -- "Upload Tracing Data<br/>(HTTP POST)" --> DataWay
DataKit ELinker/DataKit 的 ebpftrace 插件配置¶
开启 DataKit ELinker 或 DataKit 中的 ebpftrace 插件。
配置项:
db_path:- 说明: 存放数据库文件的目录。
- 环境变量:
ENV_INPUT_EBPFTRACE_DB_PATH
use_app_trace_id:- 说明:是否继承来自网络路径上的 DataDog/OTEL 等 agent 传播的 trace id。
- 环境变量:
ENV_INPUT_EBPFTRACE_USE_APP_TRACE_ID
window:- 说明:设置 eBPF Trace Span 的链接等待时间窗口,也可视为支持的 eBPF 链路的持续时间。
- 环境变量:
ENV_INPUT_EBPFTRACE_WINDOW
sampling_rate:- 说明:设置链路采样率,范围
0.0 - 1.0,值为1.0不采样。默认开启0.1(10%)采样。 - 环境变量:
ENV_INPUT_EBPFTRACE_SAMPLING_RATE
- 说明:设置链路采样率,范围
配置方法:
- 主机部署方案的配置:
配置文件位于
/var/usr/local/datakit目录下的conf.d/ebpftrace目录,复制ebpftrace.conf.sample并命名为ebpftrace.conf。
[[inputs.ebpftrace]]
db_path = "./ebpf_spandb"
use_app_trace_id = true
window = "20s"
sampling_rate = 0.1
- Kubernetes 部署方案的配置:
修改
datakit-elinker.yaml中的环境变量,必须配置的为dataway地址ENV_DATAWAY,按需配置采样率ENV_INPUT_EBPFTRACE_WINDOW:
- name: ENV_DATAWAY
value: https://openway.guance.com?token=<YOUR-WORKSPACE-TOKEN> # Fill your real Dataway server and(or) workspace token
- name: ENV_INPUT_EBPFTRACE_WINDOW
value: 20s # ebpf trace span link window
- name: ENV_INPUT_EBPFTRACE_SAMPLING_RATE
value: '0.1' # 0.0 - 1.0 (1.0 means no sampling)
- name: ENV_INPUT_EBPFTRACE_USE_APP_TRACE_ID
value: 'true' # true means use app trace id (from otel, datadog ...) as ebpf trace id in ebpftrace
- name: ENV_INPUT_EBPFTRACE_DB_PATH
value: /usr/local/datakit/ebpf_spandb/
完成设置后将 DataKit ELinker/DataKit 或相关 K8s Service 的 <ip>:<port> 提供给 eBPF 采集器用于 eBPF Span 的传输。
DataKit 的 ebpf 插件配置¶
配置项细节见eBPF 采集器环境变量和配置项。
开启该采集器需要在配置文件中进行以下设置:
配置项 trace_server 的地址填写开启了 ebpftrace 插件的 DataKit ELinker/DataKit 的地址
[[inputs.ebpf]]
enabled_plugins = [
"ebpf-net",
"ebpf-trace",
]
l7net_enabled = [
"httpflow",
]
trace_server = "x.x.x.x:9529"
trace_all_process = false
trace_env_list = [
"DK_BPFTRACE_SERVICE",
"DD_SERVICE",
"OTEL_SERVICE_NAME",
]
trace_env_blacklist = []
trace_name_list = []
trace_name_blacklist = [
## The following two processes are hard-coded to never be traced,
## and do not need to be set:
##
# "datakit",
# "datakit-ebpf",
]
有以下几种方法选择是否对其他进程进行链路跟踪:
- 设置
trace_all_process为true跟踪所有进程,可以配合trace_name_blacklist或者trace_env_blacklist排除部分不希望采集的进程 - 设置
trace_env_list对包含任意一个指定环境变量的进程进行跟踪。 - 设置
trace_name_list对包含任意一个指定进程名的进程进行跟踪。
可通过为被采集进程注入以下任意一个环境变,来设置 span 的 service name:
DK_BPFTRACE_SERVICEDD_SERVICEOTEL_SERVICE_NAME