配置参考
Grafana Agent 支持在 流模式 下进行 eBPF 分析。配置文件使用 River 语言编写,并由用于收集、转换和发送数据的组件组成。
pyroscope.ebpf
组件用于通过 eBPF 收集应用程序性能配置文件。
pyroscope.ebpf
在主机上运行,并收集与当前主机上运行的进程相关的堆栈跟踪。
使用targets
参数,您可以指定要对机器上哪些进程和容器进行分析。targets
可以来自发现组件,例如discovery.process
、dicovery.kubernetes
、discovery.docker
和discovery.dockerswarm
。要重新标记已发现的目标并设置自己的标签,可以使用discovery.relabel
组件。有关更多信息,请参考组件。
forward_to
参数应指向pyroscope.write
组件,以将收集的配置文件发送到您的 Pyroscope Server 或Grafana Cloud。
名称 | 类型 | 描述 | 默认值 | 必需 |
---|---|---|---|---|
targets | list(map(string)) | 要按容器 ID 对配置文件进行分组的目标列表 | 是 | |
forward_to | list(ProfilesReceiver) | 要将收集的配置文件发送到的接收器列表。 | 是 | |
collect_interval | duration | 收集配置文件的频率 | 15s | 否 |
sample_rate | int | 每秒收集配置文件样本的次数 | 97 | 否 |
pid_cache_size | int | pid -> proc 符号表 LRU 缓存的大小 | 32 | 否 |
build_id_cache_size | int | elf 文件构建 ID -> 符号表 LRU 缓存的大小 | 64 | 否 |
same_file_cache_size | int | elf 文件 -> 符号表 LRU 缓存的大小 | 8 | 否 |
container_id_cache_size | int | pid -> 容器 ID 表 LRU 缓存的大小 | 1024 | 否 |
collect_user_profile | bool | 启用/禁用收集用户空间配置文件的标志 | true | 否 |
collect_kernel_profile | bool | 启用/禁用收集内核空间配置文件的标志 | true | 否 |
demangle | string | C++ 解码模式。可用选项为:none 、simplified 、templates 、full | none | 否 |
支持的语言
pyroscope.ebpf
组件支持以下语言
- Go
- Rust
- 已启用帧指针的 C/C++
- Python
将数据发送到 Grafana Cloud Profiles
当发送到 Grafana Cloud Profiles 时,您可以使用以下pyroscope.write
组件配置,它使用环境变量
pyroscope.write "endpoint" {
endpoint {
basic_auth {
password = env("GC_PASSWORD")
username = env("GC_USER")
}
url = env("GC_URL")
}
}
确保您已适当地配置GC_URL
、GC_USER
和GC_PASSWORD
环境变量。
配置文件收集行为
pyroscope.ebpf
组件收集与当前主机上运行的进程关联的堆栈跟踪。您可以使用sample_rate
参数来定义每秒收集的堆栈跟踪数量。默认值为 97。
如果您没有定义以下标签,它们将自动注入收集的配置文件中。这些标签可以帮助您确定分析目标。
标签 | 描述 |
---|---|
service_name | Pyroscope 服务名称。如果可能,它会从发现元标签中自动选择。否则,它默认为unspecified 。 |
__name__ | pyroscope 度量名称。默认为process_cpu 。 |
__container_id__ | 从目标派生的容器 ID。 |
权限
您需要以 root 身份运行代理并在主机 pid 命名空间内运行,才能使pyroscope.ebpf
组件正常工作。
目标
以下特殊标签之一必须包含在targets
的每个目标中,并且标签必须与要分析的容器或进程对应
__container_id__
:容器 ID。__meta_docker_container_id
:Docker 容器的 ID。__meta_kubernetes_pod_container_id
:Kubernetes pod 容器的 ID。__process_pid__
: 进程 ID。
然后,每个进程都与目标列表中的指定目标相关联,该目标由容器 ID 或进程 PID 确定。
如果进程的容器 ID 与目标的容器 ID 标签匹配,则堆栈跟踪将根据容器 ID 按目标进行聚合。如果进程的 PID 与目标的进程 PID 标签匹配,则堆栈跟踪将根据进程 PID 按目标进行聚合。否则,该进程不会被分析。
服务名称
特殊标签service_name
是必需的,并且必须始终存在。如果未指定,它将尝试从多个来源推断
__meta_kubernetes_pod_annotation_pyroscope_io_service_name
,它是一个pyroscope.io/service_name
pod 注释。__meta_kubernetes_namespace
和__meta_kubernetes_pod_container_name
__meta_docker_container_name
__meta_dockerswarm_container_label_service_name
和__meta_dockerswarm_service_name
如果未指定service_name
并且无法推断,则将其设置为unspecified
。
公开的 Prometheus 度量
pyroscope.ebpf
组件公开以下 Prometheus 度量
pyroscope_fanout_latency
(histogram):发送到直接和间接组件的写入延迟。pyroscope_ebpf_active_targets
(gauge):组件跟踪的活动目标数量。pyroscope_ebpf_profiling_sessions_total
(counter):已完成的分析会话数量。pyroscope_ebpf_profiling_sessions_failing_total
(counter):分析会话失败的数量。pyroscope_ebpf_pprofs_total
(counter):ebpf 组件收集的 pprof 配置文件数量。
更多信息
查看以下资源以了解有关 eBPF 分析的更多信息
- eBPF 分析的优缺点 博客文章(有关以下火焰图的更多上下文)
- 演示 展示我们示例集群的细分
- Grafana Agent 文档,用于pyroscope.ebpf、pyroscope.write、discovery.kubernetes、discovery.relabel 组件