
Pyroscope Java 持续剖析快速上手基于 javaagent 的 simple 示例从零跑通【免费下载链接】pyroscopeContinuous Profiling Platform. Debug performance issues down to a single line of code项目地址: https://gitcode.com/GitHub_Trending/py/pyroscope导读本文以仓库 examples/language-sdk-instrumentation/java/simple 示例为主线完整讲解如何在 Linux 上通过 Docker Compose 一键拉起 Pyroscope 服务端、一个使用-javaagent接入 Pyroscope Java Agent 的 Java 应用以及预置了 Pyroscope 数据源的 Grafana并在数分钟内于浏览器中看到实时火焰图。读完本文你将掌握 Pyroscope Java 集成的最小可运行闭环、agent 关键环境变量的含义以及如何在此基础上扩展标签Tagging与多维度对比分析。示例概览一个最小可运行的 Java 持续剖析闭环simple示例是整个 Java SDK 接入系列中结构最精简的一支它只包含四类文件文件作用Main.java被剖析的 Java 应用本体一个死循环中交替执行fastFunction与slowFunctionDockerfile构建应用镜像下载 pyroscope-java agent 并以 javaagent 方式注入docker-compose.yml编排 pyroscope、app、grafana 三个服务grafana-provisioning/datasources/pyroscope.ymlGrafana 自动预置 Pyroscope 数据源它的价值在于用极少的代码和配置就能直观地验证Java 应用 → Pyroscope 服务端 → Grafana 火焰图这条完整链路。而同一目录下的 fibJava 锁竞争剖析与 rideshare多区域多标签对比示例则是在此基础上的进阶玩法。运行前提为什么只能运行在 Linux 上原文档特别强调由于权限问题该 docker-compose 示例只能在 Linux 上运行。这一限制源于 docker-compose.yml 中app服务声明了privileged: true。特权模式允许容器内访问宿主机更多内核能力这在 macOS/Windows 的 Docker Desktop 上并不总是可用因此示例明确将运行环境限定为 Linux。三步运行示例原文档给出的运行流程非常简洁共三条命令# 1. 拉取最新的 pyroscope 与 grafana 镜像 docker pull grafana/pyroscope:latest docker pull grafana/grafana:latest # 2. 构建并启动示例项目 docker-compose up --build # 3. 需要时重置数据库 # docker-compose down三条命令的作用分别对应三个阶段预拉取镜像确保grafana/pyroscope:latest与grafana/grafana:latest已就绪避免up阶段因网络下载耗时过长。构建并启动--build会先按 Dockerfile 构建应用镜像再一并启动三个容器。启动后Pyroscope 服务端监听宿主机4040端口Grafana 监听宿主机3000端口Java 应用持续向http://pyroscope:4040上报剖析数据。重置数据库docker-compose down默认不删除命名卷时用于停止容器并清理运行状态方便重新演示。启动完成后可以打开http://localhost:3000Grafana已匿名开启且预置数据源或http://localhost:4040Pyroscope 自带界面查看实时火焰图。剖析对象Main.java 中刻意构造的快慢函数为了让火焰图一眼可见Main.java 故意构造了两档耗时不同的函数class Main { public static int work(int n) { int i 0; for (i 0; i n; i) {} return i; } public static void fastFunction() { work(20000); } public static void slowFunction() { work(80000); } public static void main(String[] args) { int i 0; while (true) { fastFunction(); slowFunction(); i; } } }从代码结构可以推断其设计意图fastFunction每轮循环执行 2 万次空循环slowFunction执行 8 万次因此slowFunction的 CPU 占用理论上约为fastFunction的 4 倍。在火焰图中slowFunction对应矩形的宽度将明显大于fastFunction从而直观展示CPU 时间与代码热区的对应关系。main中的while (true)保证应用持续运行、持续产生剖析数据便于实时观察。接入方式javaagent 与环境变量全解simple/Dockerfile 是整个接入的核心它展示了 Pyroscope Java 集成最典型的两种操作下载 agent 与通过环境变量配置。FROM eclipse-temurin:11.0.31_11-jdk-jammy WORKDIR /opt/app ADD https://github.com/grafana/pyroscope-java/releases/download/v2.9.1/pyroscope.jar /opt/app/pyroscope.jar COPY Main.java ./Main.java RUN javac Main.java ENV PYROSCOPE_APPLICATION_NAMEsimple.java.app ENV PYROSCOPE_PROFILING_INTERVAL10ms ENV PYROSCOPE_PROFILER_EVENTcpu ENV PYROSCOPE_PROFILER_LOCK10ms ENV PYROSCOPE_PROFILER_ALLOC512k ENV PYROSCOPE_UPLOAD_INTERVAL15s ENV PYROSCOPE_LOG_LEVELdebug ENV PYROSCOPE_SERVER_ADDRESShttp://pyroscope:4040 CMD [java, -XX:-Inline, -javaagent:pyroscope.jar, Main]1. agent 获取与注入基础镜像使用eclipse-temurin:11.0.31_11-jdk-jammyJava 11 JDK并直接编译运行Main.java无需构建工具链通过ADD从 pyroscope-java 的 v2.9.1 发布包下载pyroscope.jar到/opt/app启动命令以-javaagent:pyroscope.jar注入 agent实现零侵入式剖析——应用代码本身不需要任何 Pyroscope 依赖同时使用-XX:-Inline关闭 JIT 内联保证fastFunction/slowFunction等函数在火焰图中以独立栈帧呈现便于观察这也是本示例刻意为之的演示手段。2. 核心环境变量含义环境变量示例值作用PYROSCOPE_APPLICATION_NAMEsimple.java.app应用名在 UI 中用于区分不同被剖析服务也作为标签维度出现PYROSCOPE_SERVER_ADDRESShttp://pyroscope:4040Pyroscope 服务端地址此处使用 Compose 服务名pyroscope做容器间通信PYROSCOPE_PROFILING_INTERVAL10msCPU 剖析采样间隔10ms 即每秒约 100 次采样PYROSCOPE_PROFILER_EVENTcpu剖析事件类型示例选用 CPU 剖析PYROSCOPE_PROFILER_LOCK10ms锁lock剖析相关阈值/间隔参数PYROSCOPE_PROFILER_ALLOC512k内存分配剖析相关参数分配采样阈值PYROSCOPE_UPLOAD_INTERVAL15s每 15 秒向服务端上传一次剖析数据PYROSCOPE_LOG_LEVELdebugagent 日志级别调试接入问题时非常有帮助需要说明的是同一目录下 fib/Dockerfile 还额外使用了PYROSCOPE_FORMATjfr说明 agent 底层支持基于 JFRJava Flight Recorder的数据格式可作为扩展配置项参考而 rideshare 示例 则通过PYROSCOPE_SERVER_ADDRESS环境变量分别指向 Pyroscope 服务端展示了多实例部署的写法。部署架构Compose 三服务如何协同docker-compose.yml 由模板 examples/_templates/pyroscope/docker-compose.yml 与 Grafana 模板生成包含三个服务服务镜像/构建端口职责pyroscopegrafana/pyroscope:latest宿主机4040→ 容器4040Pyroscope 服务端接收剖析数据并提供查询 APIappbuild: .本地 Dockerfile无对外端口被剖析的 Java 应用privileged: true提权运行grafanagrafana/grafana:latest宿主机3000→ 容器3000可视化前端预装 pyroscope 插件并自动配置数据源Grafana 服务的环境变量承担了插件与免登录配置GF_PLUGINS_PREINSTALL_SYNCgrafana-pyroscope-app启动时自动同步安装 Pyroscope 应用插件GF_AUTH_ANONYMOUS_ENABLEDtrue、GF_AUTH_ANONYMOUS_ORG_ROLEAdmin、GF_AUTH_DISABLE_LOGIN_FORMtrue开启匿名访问并授予 Admin 角色免登录直达仪表盘GF_FEATURE_TOGGLES_ENABLEtraceToProfiles tracesEmbeddedFlameGraph启用 trace 关联 profile 与内嵌火焰图等实验特性。数据源自动配置Grafana 免手动接入pyroscope.yml 通过 Grafana Provisioning 机制在容器启动时自动注册数据源省去了手动配置步骤apiVersion: 1 datasources: - uid: pyroscope type: grafana-pyroscope-datasource name: Pyroscope url: http://pyroscope:4040 jsonData: keepCookies: [pyroscope_git_session]type: grafana-pyroscope-datasource指定插件类型url指向 Compose 网络内的 Pyroscope 服务jsonData.keepCookies保留了 Pyroscope 会话 Cookie便于从 Grafana 内嵌打开 Pyroscope 界面时保持登录态文件中注释给出了对接 Grafana Cloud 的写法basicAuthbasicAuthUserbasicAuthPassword可满足云端场景该文件同样由模板生成注释明确提示编辑模板后运行make examples/sync-templates再同步直接修改生成文件会被覆盖。验证结果在火焰图中看到快慢分明docker-compose up --build成功后等待约 15 秒对应PYROSCOPE_UPLOAD_INTERVAL15s即可在 Grafana 的 Pyroscope 数据源或http://localhost:4040中选择应用simple.java.app。由于slowFunction的空循环次数是fastFunction的 4 倍火焰图底部会呈现两条宽度差异明显的栈帧这正对应 Main.java 中构造的 CPU 热点分布——这也是验证剖析链路是否打通的最快方式。从 simple 起步进阶能力与仓库内相关示例跑通 simple 示例后可以继续在仓库内探索同一目录下的进阶示例rideshare 多区域对比模拟us-east、eu-north、ap-south三个区域的服务通过Pyroscope.setStaticLabels打静态标签如REGION用Pyroscope.LabelsWrapper.run(new LabelsSet(vehicle, vehicle), ...)打动态标签如vehicle再借助 FlameQL如REGION eu-north/REGION ! eu-north做对比与 diff 火焰图分析。具体实现可参考 OrderService.java。fib 锁竞争剖析两个线程围绕ReentrantLock竞争配合PYROSCOPE_PROFILER_LOCK10ms演示锁等待事件的剖析应用名在 Compose 中通过PYROSCOPE_APPLICATION_NAME覆盖为fibonacci-java-lock-push。这些示例与 simple 共享同一套镜像与数据源模板改动成本极低适合作为掌握 javaagent 接入后的下一步实验。结语simple示例虽然只有不足十行文档与四个小文件却完整覆盖了Linux 环境 → javaagent 注入 → 环境变量配置 → Compose 编排 → Grafana 数据源自动预置 → 火焰图验证的 Pyroscope Java 集成全流程。将其作为起点配合 rideshare 的标签体系与 fib 的锁剖析即可系统掌握 Pyroscope 在 Java 服务性能诊断中的实战用法。【免费下载链接】pyroscopeContinuous Profiling Platform. Debug performance issues down to a single line of code项目地址: https://gitcode.com/GitHub_Trending/py/pyroscope创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考