写点什么

Pyroscope Java 接入最佳实践

作者:观测云
  • 2025-12-15
    上海
  • 本文字数:1674 字

    阅读完需:约 5 分钟

Pyroscope Java 接入最佳实践

Pyroscope

Pyroscope 是 Grafana 开源的持续性能分析平台,旨在帮助用户从应用程序中获取性能洞察,以优化资源使用,如 CPU、内存和 I/O 操作。将 Pyroscope 数据上报到观测云,使用户能够全面了解应用程序的行为,并能够深入到特定服务中进行更精确的根源分析。Pyroscope 为 OpenTelemetry 补全了 Profiling 能力,同时,可以实现 Profiling 与 Tracing 的关联。

核心功能

  • 持续性能分析:通过持续分析应用程序的性能,帮助团队快速识别性能瓶颈并优化应用程序。

  • 低开销和高效压缩:确保在生产环境中进行性能分析时对应用程序的性能影响最小。

  • 多语言支持:客户端 SDK 支持多种编程语言,包括 Go、Java、Python、Ruby、PHP 和 .NET。

  • 灵活的部署方式:支持在多种环境中部署,包括 Kubernetes 等。

使用场景

  • 主动优化:通过持续监控减少资源消耗,提高应用程序性能,预防延迟问题。

  • 快速响应:在发生性能问题时,能够快速定位并解决,例如调试 CPU、内存或 I/O 瓶颈。

支持类型

Pyroscope 支持采集以下数据类型:

  • CPU 使用情况

  • 内存使用情况

  • I/O 操作

  • 调用栈(Call Stacks)

  • 分配的内存(Heap & Allocation)

  • 协程或线程的使用情况

  • 函数级性能数据

接入观测云

实现说明

OpenTelemtry 链路与 pyroscope profiling 数据关联实现原理,主要是通过给 profiling 和 tracing 注入 runtime_id 标签。

主机部署

  • 开启 opentelemetry 及 pyroscope 采集器

进入 DataKit 安装目录下,执行以下命令:

# 开启opentelemetry  cd /usr/local/datakit/conf.d/cp samples/opentelemetry.conf.sample opentelemetry.conf
# 开启pyroscope cd /usr/local/datakit/conf.d/cp samples/pyroscope.conf.sample pyroscope.conf
复制代码
  • 重启 DataKit

datakit service -R
复制代码

接入 JAVA 应用

  • pyroscope-java 是基于 async-profiler 的增强版本。

  • pyroscope-otel 是基于 pyroscope-java 封装的 OpenTelemetry 版本,意在与 OpenTelemetry APM 进行融合。

下载依赖

启动参数

java 应用启动命令如下,供参考。

注意: UUID 为注入的随机 id ,用于关联 trace 与 profile 的关联 id 赋值,需要确保 UUID 能正常被应用。

ShellUUID=$(uuidgen) \ # 实例维度的uuid,保证实例的唯一性OTEL_SERVICE_NAME="springboot-server" \OTEL_RESOURCE_ATTRIBUTES="runtime_id=$UUID,service.name=springboot-server,service.version=1.3.55,service.env=dev" \OTEL_JAVAAGENT_EXTENSIONS=./pyroscope-otel.jar \OTEL_TRACES_EXPORTER=otlp \OTEL_EXPORTER_OTLP_PROTOCOL="grpc" \OTEL_EXPORTER_OTLP_ENDPOINT="http://datakit-service.datakit:4317" \
# PYROSCOPE 配置PYROSCOPE_APPLICATION_NAME="springboot-server" \OTEL_PYROSCOPE_START_PROFILING=true \PYROSCOPE_FORMAT="jfr" \PYROSCOPE_PROFILER_EVENT="cpu" \PYROSCOPE_LABELS="runtime_id=$UUID,service=springboot-server,version=1.3.55,env=dev" \PYROSCOPE_UPLOAD_INTERVAL="10s" \PYROSCOPE_JAVA_STACK_DEPTH_MAX=512 \PYROSCOPE_PROFILING_INTERVAL="10ms" \PYROSCOPE_PROFILER_ALLOC=512k \PYROSCOPE_ALLOC_LIVE=true \PYROSCOPE_SERVER_ADDRESS="http://datakit-service.datakit:9529" \java -javaagent:opentelemetry-javaagent.jar -jar springboot-server.jar
复制代码

按照实际业务需求选择合适的参数:

配置说明


效果演示




观测云在采集 profiling 数据时可以通过一些配置实现 profiling 与 tracing 数据的关联,其原理主要是通过给 profiling 和 tracing 注入 runtime_id 标签实现关联,在链路中可以点击代码热点,可以看到关联的 profiling 信息。



用户头像

观测云

关注

还未添加个人签名 2021-02-08 加入

云时代的系统可观测平台

评论

发布
暂无评论
Pyroscope Java 接入最佳实践_链路跟踪_观测云_InfoQ写作社区