news 2026/5/12 2:12:22

Pyroscope Java 接入最佳实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 进行融合。
下载依赖
  • pyroscope-otel 下载地址: https://repo1.maven.org/maven2/io/pyroscope/otel/0.11.0/otel-0.11.0.jar,重命名为 pyroscope-otel.jar
  • opentelemetry-java 下载地址: https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases
  • Agent 代码仓库:https://github.com/grafana/otel-profiling-java/releases
启动参数

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

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

Shell UUID=$(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

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

  • opentelemetry-java 相关参数参考 OpenTelemetry 官方文档。
  • pyroscope 相关参数参考 Pyroscope 官方文档,部分参数说明如下:

配置说明

FlagDescription
PYROSCOPE_AGENT_ENABLED启用代理。默认值为true。
PYROSCOPE_SERVER_ADDRESS上报地址
PYROSCOPE_FORMAT设置分析器输出格式。默认值为collapsed,但为了支持多种格式,必须将其设置为jfr。
PYROSCOPE_PROFILER_EVENT设置分析器事件。在启用JFR格式时,此事件指可能的CPU分析事件之一:itimer、cpu、wall。默认值为itimer。
PYROSCOPE_PROFILER_ALLOC设置注册事件的分配阈值(以字节为单位,相当于async-profiler中的--alloc=)。默认值为空字符串(""),表示禁用分配分析。将其设置为0将注册每个事件,导致显著的CPU和网络开销,不适合生产环境。建议的起始值为512k,并根据需要进行调整。
PYROSCOPE_PROFILER_LOCK设置注册事件的锁阈值(以纳秒为单位,相当于async-profiler中的--lock=)。默认值为空字符串(""),表示禁用锁分析。将其设置为0将注册每个事件,导致显著的CPU和网络开销,不适合生产环境。建议的起始值为10ms,并根据需要进行调整。
PYROSCOPE_CONFIGURATION_FILE设置额外的属性配置文件。默认值为pyroscope.properties。
PYROSCOPE_BASIC_AUTH_USERHTTP Basic身份验证用户名。默认值为空字符串(""),表示无身份验证。
PYROSCOPE_BASIC_AUTH_PASSWORDHTTP Basic身份验证密码。默认值为空字符串(""),表示无身份验证。
PYROSCOPE_TENANT_IDpyroscope租户ID,作为X-Scope-OrgID HTTP头传递。默认值为空字符串(""),表示无租户ID。
PYROSCOPE_HTTP_HEADERS额外的HTTP头(以JSON格式),例如:{"X-Header": "Value"}。默认值为{},表示无额外头。
PYROSCOPE_LABELS设置以逗号分隔的key=value对形式的静态标签。默认值为空字符串(""),表示无标签。
PYROSCOPE_LOG_LEVEL确定Pyroscope日志记录器的详细程度。可用选项包括debug、info、warn和error。默认值为info。
PYROSCOPE_PUSH_QUEUE_CAPACITY指定在网络中断期间临时在内存中存储分析数据的摄取队列的大小。默认值为8。
PYROSCOPE_INGEST_MAX_TRIES设置在失败时重试摄取API调用的最大次数。值为-1表示重试将继续进行,直到成功。默认值为8。
PYROSCOPE_EXPORT_COMPRESSION_LEVEL_JFR设置上传到JFR文件的GZIP压缩级别。此选项接受的值包括NO_COMPRESSION、BEST_SPEED、BEST_COMPRESSION和DEFAULT_COMPRESSION。
PYROSCOPE_EXPORT_COMPRESSION_LEVEL_LABELS与PYROSCOPE_EXPORT_COMPRESSION_LEVEL_JFR类似,但适用于动态标签部分。默认值为BEST_SPEED。
PYROSCOPE_GC_BEFORE_DUMP布尔值,当设置为true时,在转储分析文件之前执行System.gc()命令。此选项可能对实时分析有用,但默认情况下是禁用的。

效果演示

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:19:18

低代码PHP组件版本冲突如何破局?3个关键步骤让你无缝升级

第一章:低代码PHP组件的版本兼容在构建现代Web应用时,低代码平台常依赖于可复用的PHP组件来加速开发流程。然而,不同PHP版本之间的语法与函数行为差异可能导致组件运行异常。确保组件在多种PHP环境中稳定运行,是保障系统兼容性的关…

作者头像 李华
网站建设 2026/5/3 1:33:01

旋转矩阵与欧拉角转换数学公式与代码详解

下面分三大部分说明: 数学推导与公式(欧拉角 ↔ 四元数)C 实现代码Python 实现代码 为便于说明,统一采用常用的航空/机器人学约定: 欧拉角顺序:Z-Y-X(yaw-pitch-roll)旋转顺序&#…

作者头像 李华
网站建设 2026/5/9 11:37:46

助力在线教学提质增效,“魔果云课”以核心功能直击教师痛点

随着在线教育的普及,一款稳定、高效、易用的教学工具已成为广大教师的普遍需求。近期,一款名为「魔果云课」的软件因其聚焦核心教学场景的设计,受到了不少教育工作者的关注。本文将从实际应用角度,梳理其如何针对线上教学关键环节…

作者头像 李华
网站建设 2026/5/11 22:55:12

从卡顿到秒级响应,农业传感器PHP数据写入优化全解析

第一章:从卡顿到秒级响应,农业传感器PHP数据写入优化全解析在现代农业物联网系统中,成百上千的传感器实时采集温湿度、土壤pH值、光照强度等关键数据,这些数据通常通过HTTP接口由PHP后端接收并写入数据库。然而,原始实…

作者头像 李华
网站建设 2026/5/9 18:29:45

R量子计算模拟实战(qubit初始化完全指南)

第一章:R量子计算模拟实战概述在现代计算科学中,量子计算因其强大的并行处理能力而备受关注。尽管目前通用量子计算机尚未普及,但利用经典计算平台模拟量子系统已成为研究与教学的重要手段。R语言虽以统计分析见长,但其灵活的矩阵…

作者头像 李华
网站建设 2026/5/2 18:31:04

基于Springboot流浪动物救助系统cqy142wz(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。

一、系统程序文件列表 二、开题报告内容 基于Spring Boot的流浪动物救助系统开题报告 一、研究背景与意义 研究背景 随着城市化进程加速,流浪动物数量呈快速增长趋势。据不完全统计,我国城镇流浪动物数量已超过5000万只,且每年以15%-20%的…

作者头像 李华