Pinpoint 是一套面向大规模分布式系统的应用性能管理(APM)工具,由韩国 NAVER 公司开发并以开源方式发布,采用 Apache License 2.0 许可。它受 Google Dapper 论文启发,通过在跨服务调用中传递追踪标识,把分布式事务还原为可分析的调用链,并提供应用拓扑、实时监控与代码级调用栈等视图,主要用于定位性能瓶颈与故障点。
定义
Pinpoint 是一个开源的 APM(应用性能管理)工具,面向以 Java 与 PHP 编写的大规模分布式系统。它的目标是把由众多组件互相调用、对外表现为黑盒的分布式事务还原成可视的调用链,从而分析系统的整体结构以及组件之间的连接关系。
在功能定位上,它常被归入调用链系统或分布式跟踪系统的范畴:前端发起一次请求后,后台可能经由多个服务逐级调用,若某一环节出错,仅凭各服务自身日志难以判断问题来源;此类工具的作用是记录并汇总整条调用路径上的性能数据,帮助维护人员快速定位[1]。
原理
Pinpoint 采用字节码增强实现接入。它的 Agent 在 JVM 类加载阶段对可追踪的类库进行插桩,自动接管发起远程调用处的标记信息读写,因此使用方不需要改动业务代码,只需在启动参数中挂载 Agent。官方仓库说明这种做法对资源的额外占用约为 3%。
其数据模型由 Span、Trace 与 TraceId 三个概念构成。Span 是一次远程过程调用的追踪基本单元,内部还可细分为 SpanEvent 以体现方法级细节;Trace 是同一事务下若干 Span 的集合,按 SpanId 与 ParentSpanId 组织成树形结构;TraceId 则把 TransactionId、SpanId 与 ParentSpanId 组合在一起,其中 TransactionId 需在整个服务器集群内全局唯一,根节点的 ParentSpanId 取 -1 表示它是事务起点[2]。
在部署形态上,Pinpoint 由 Agent、Collector 与 Web 三部分组成:Agent 作为探针与被监控的应用同机部署,Collector 接收上报的性能数据,Web 模块把入库的数据渲染为网页界面,链路数据通常写入 Apache HBase 存储[2]。控制台提供的典型视图包括展示组件互联与调用关系的 ServerMap、按时间分布请求耗时的散点图、可下钻到代码级的调用栈,以及展示 CPU、内存与垃圾回收、TPS 和 JVM 参数的 Inspector。
发展历程
项目于 2012 年 7 月启动开发。其动因来自 NAVER 内部系统:当时已有多种应用性能管理工具,但不足以有效处理 n 层架构系统中的问题,因此团队决定自行构建一套新的追踪平台[3]。
2015 年 1 月 9 日,Pinpoint 作为开源项目对外发布[3]。此后它被用于 NAVER 的主要服务中[4]。
在语言支持上,Pinpoint 早期面向 Java,之后扩展到 PHP,官方仓库中已列出 Java、PHP 与 Python 的支持情况。项目还提供了用于快速体验的 Docker 镜像仓库。
在版本与运行环境方面,官方给出的兼容表显示 Agent、Collector 与 Web 所需的 Java 版本随版本迭代逐步提高。随着版本演进,其存储层也出现按数据类型拆分的变化[5]。
许可方面,Pinpoint 以 Apache License 2.0 发布。
应用
Pinpoint 的典型用途是观测微服务与中间件之间的调用关系。官方说明其 Agent 支持的模块涵盖 Tomcat、Jetty、WebLogic、Undertow 等应用服务器,Spring 与 Spring Boot 等框架,Apache HttpClient、OkHttpClient、Netty 等 HTTP 客户端,以及 Thrift、Dubbo、gRPC 等远程调用框架。
在数据存储与消息组件方面,受支持的模块还包括 MySQL、Oracle、PostgreSQL、MariaDB 等关系型数据库,Redis、Memcached、MongoDB、Elasticsearch 等存储服务,以及 Kafka、RabbitMQ、ActiveMQ、RocketMQ 等消息队列,另有 MyBatis、HikariCP、Logback 等常用库。
使用方式上,接入方在应用启动时通过 javaagent 参数指定探针包路径,并用参数声明应用名与实例标识,随后即可在控制台看到对应的应用与调用数据[6]。项目的快速入门文档提供了配套的示例应用以便试用。
局限
作为基于字节码增强的方案,Pinpoint 的语言覆盖范围有限。官方资料明确其面向 Java 与 PHP 编写的大型分布式系统,这意味着采用其他语言栈的服务难以获得同等程度的代码级追踪。
字节码增强本身属于实现难度较高的技术路线。相关技术资料在比较手动埋点与自动埋点时指出,自动方式虽然免去业务改码,但在工具开发阶段需要投入更多资源,并对开发者识别类库跟踪点的能力要求更高[7]。
此外,它的运行依赖较重的后端组件,需要部署 Collector 与用于存储的 HBase 等设施,采集与展示链路的各个环节都需要独立运维;在语言支持面上,也有资料认为其追踪对象以 Java 应用为主[8]。
参见
参考资料
- 介绍两款运维监控系统Pinpoint和Zabbix [引用日期2026-10-14]
- 开源 APM 技术选型与实战 [引用日期2026-10-14]
- History [引用日期2026-10-14]
- PINPOINT 미니 인터뷰 [引用日期2026-10-14]
- pinpoint快速入门指南与AI能力升级指南 [引用日期2026-10-14]
- 字节码的终极应用-GitHub高星开源APM项目之Ponpoint [引用日期2026-10-14]
- 由于Pinpoint Web 被打包为可部署的war文件,可以像部署其他web应用一样部署到web容器 [引用日期2026-10-14]
- oschina.net 上的网页 [引用日期2026-10-14]