配置参考
Grafana Alloy 支持 eBPF 性能分析。配置文件使用 River 语言编写,由用于收集、转换和发送数据的组件组成。
pyroscope.ebpf
组件用于通过 eBPF 收集应用性能分析数据。
pyroscope.ebpf
运行在主机上,收集与当前主机上运行的进程相关的堆栈轨迹。
使用 targets
参数,您可以指定要在机器上对哪些进程和容器进行性能分析。targets
可以来自发现组件,例如 discovery.process
、discovery.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 -> 进程符号表的 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++ demangle 模式。可用选项: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 命名空间内运行 Agent,以便 pyroscope.ebpf
组件正常工作。
目标
targets
中的每个目标必须包含以下特殊标签之一,且该标签必须对应于被分析的容器或进程
__container_id__
:容器 ID。__meta_docker_container_id
:Docker 容器的 ID。__meta_kubernetes_pod_container_id
:Kubernetes Pod 容器的 ID。__process_pid__
:进程 ID。
然后,每个进程会与 targets
列表中的一个指定目标关联,通过容器 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
(直方图):发送到直接和间接组件的写入延迟。pyroscope_ebpf_active_targets
(仪表):组件跟踪的活动目标数量。pyroscope_ebpf_profiling_sessions_total
(计数器):已完成的性能分析会话数量。pyroscope_ebpf_profiling_sessions_failing_total
(计数器):失败的性能分析会话数量。pyroscope_ebpf_pprofs_total
(计数器):ebpf 组件收集的 pprof 性能分析数据数量。
更多信息
请查阅以下资源,了解更多关于 eBPF 性能分析的信息
- eBPF 性能分析的优缺点 博客文章(以下火焰图的更多背景信息)
- 演示,展示我们示例集群的细分情况
- Grafana Alloy
- pyroscope.scrape
- pyroscope.write
- discovery.kubernetes
- discovery.docker
- discovery.relabel