Pyroscope
Datakit 从 Version-1.67.0 版本开始增加了 Pyroscope
采集器,支持接入 Grafana Pyroscope Agent 上报的数据,帮助用户定位应用程序中的 CPU、内存、IO 等的性能瓶颈。
采集器配置¶
进入 DataKit 安装目录下的 conf.d/pyroscope
目录,复制 pyroscope.conf.sample
并命名为 pyroscope.conf
。配置文件说明如下:
[[inputs.pyroscope]]
## pyroscope Agent endpoints register by version respectively.
## Endpoints can be skipped listen by remove them from the list.
## Default value set as below. DO NOT MODIFY THESE ENDPOINTS if not necessary.
endpoints = ["/ingest"]
## set true to enable election, pull mode only
election = true
## the max allowed size of http request body (of MB), 32MB by default.
body_size_limit_mb = 32 # MB
## set false to stop generating apm metrics from ddtrace output.
generate_metrics = true
## io_config is used to control profiling uploading behavior.
## cache_path set the disk directory where temporarily cache profiling data.
## cache_capacity_mb specify the max storage space (in MiB) that profiling cache can use.
## clear_cache_on_start set whether we should clear all previous profiling cache on restarting Datakit.
## upload_workers set the count of profiling uploading workers.
## send_timeout specify the http timeout when uploading profiling data to dataway.
## send_retry_count set the max retry count when sending every profiling request.
# [inputs.pyroscope.io_config]
# cache_path = "/usr/local/datakit/cache/pyroscope_inputs" # C:\Program Files\datakit\cache\pyroscope_inputs by default on Windows
# cache_capacity_mb = 10240 # 10240MB
# clear_cache_on_start = false
# upload_workers = 8
# send_timeout = "75s"
# send_retry_count = 4
## set custom tags for profiling data
# [inputs.pyroscope.tags]
# some_tag = "some_value"
# more_tag = "some_other_value"
配置好后,重启 DataKit ,开启 Pyroscope 采集器。
目前可以通过 ConfigMap 方式注入采集器配置来开启采集器。
客户端应用配置¶
Pyroscope 采集器目前支持 Java,Python 和 Go 三种语言的 Pyroscope Agent 接入,其他语言正在陆续接入中:
从 Github 下载最新的 pyroscope.jar
包,作为 Java Agent 启动你的应用:
PYROSCOPE_APPLICATION_NAME="java-pyro-demo" \
PYROSCOPE_LOG_LEVEL=debug \
PYROSCOPE_FORMAT="jfr" \
PYROSCOPE_PROFILER_EVENT="cpu" \
PYROSCOPE_LABELS="service=java-pyro-demo,version=1.2.3,env=dev,some_other_tag=other_value" \
PYROSCOPE_UPLOAD_INTERVAL="60s" \
PYROSCOPE_JAVA_STACK_DEPTH_MAX=512 \
PYROSCOPE_PROFILING_INTERVAL="10ms" \
PYROSCOPE_PROFILER_ALLOC=128k \
PYROSCOPE_PROFILER_LOCK=10ms \
PYROSCOPE_ALLOC_LIVE=false \
PYROSCOPE_GC_BEFORE_DUMP=true \
PYROSCOPE_SERVER_ADDRESS="http://127.0.0.1:9529" \
java -javaagent:pyroscope.jar -jar your-app.jar
安装 pyroscope-io
依赖包:
代码引入 pyroscope-io
包:
import os
import pyroscope
import socket
pyroscope.configure(
server_address="http://127.0.0.1:9529",
detect_subprocesses=True,
oncpu=True,
enable_logging=True,
report_pid=True,
report_thread_id=True,
report_thread_name=True,
tags={
"host": socket.gethostname(),
"service": 'python-pyro-demo',
"version": 'v1.2.3',
"env": "testing",
"process_id": os.getpid(),
}
)
启动应用:
添加 pyroscope-go
模块:
引入模块并初启动 pyroscope
:
import (
"log"
"os"
"runtime"
"strconv"
"time"
"github.com/grafana/pyroscope-go"
)
func Must[T any](t T, _ error) T {
return t
}
runtime.SetMutexProfileFraction(5)
runtime.SetBlockProfileRate(5)
profiler, err := pyroscope.Start(pyroscope.Config{
ApplicationName: "go-pyroscope-demo",
// replace this with the address of pyroscope server
ServerAddress: "http://127.0.0.1:9529",
// you can disable logging by setting this to nil
Logger: pyroscope.StandardLogger,
// uploading interval period
UploadRate: time.Minute,
// you can provide static tags via a map:
Tags: map[string]string{
"service": "go-pyroscope-demo",
"env": "demo",
"version": "1.2.3",
"host": Must(os.Hostname()),
"process_id": strconv.Itoa(os.Getpid()),
"runtime_id": UUID,
},
ProfileTypes: []pyroscope.ProfileType{
// these profile types are enabled by default:
pyroscope.ProfileCPU,
pyroscope.ProfileAllocObjects,
pyroscope.ProfileAllocSpace,
pyroscope.ProfileInuseObjects,
pyroscope.ProfileInuseSpace,
// these profile types are optional:
pyroscope.ProfileGoroutines,
pyroscope.ProfileMutexCount,
pyroscope.ProfileMutexDuration,
pyroscope.ProfileBlockCount,
pyroscope.ProfileBlockDuration,
},
})
if err != nil {
log.Fatal("unable to bootstrap pyroscope profiler: ", err)
}
defer profiler.Stop()
自定义 Tag¶
以下所有数据采集,默认会追加名为 host
的全局 tag(tag 值为 DataKit 所在主机名),也可以在配置中通过 [inputs.pyroscope.tags]
指定其它标签: