第三章 技术选型:主流APM工具对比

说到APM工具选型,这其实是个挺有意思的话题。我见过不少团队,一上来就追着最火的工具跑,结果用了一段时间发现水土不服。说白了,没有最好的工具,只有最合适的。

今天我就把市面上主流的四个APM工具——SkyWalking、Zipkin、Jaeger、Pinpoint——掰开揉碎讲清楚。每个工具我都实际部署过,踩过的坑也不少,希望能帮你少走弯路。

3.1 四款工具的核心定位

先给个总览。这四个工具虽然都做链路追踪,但侧重点完全不同。

工具 核心定位 语言支持 存储后端
SkyWalking 全栈APM,自带UI和告警 Java、.NET、Go、Node.js等 Elasticsearch、H2、MySQL
Zipkin 轻量级链路追踪 Java为主,社区扩展多 Cassandra、Elasticsearch、内存
Jaeger 云原生链路追踪 Go、Java、Python等 Cassandra、Elasticsearch、Kafka
Pinpoint Java应用深度监控 Java、PHP HBase

嗯,这里要注意。选型的第一步,先看你的技术栈。如果团队全是Java,Pinpoint和SkyWalking都很香。如果微服务用Go写的多,那Jaeger会更顺手。

3.2 SkyWalking:国产APM的扛把子

我个人最常用的是SkyWalking。为什么?因为它开箱即用的体验太好了。

我记得第一次部署SkyWalking,从下载到看到第一个调用链,只花了不到半小时。它支持Java Agent无侵入接入,你只需要在启动参数里加一行:

java -javaagent:/path/to/skywalking-agent.jar -jar your-app.jar

这就完了。不需要改一行代码。

优点:

  • 自带完整的UI界面,拓扑图、调用链、告警全都有
  • 支持多种存储后端,小团队用H2,大团队上ES
  • 社区活跃,中文文档齐全

缺点:

  • 对非Java语言的支持相对弱一些
  • 数据量大时,ES的写入压力不小
我的建议: 如果你的团队以Java为主,又想快速看到效果,SkyWalking是首选。我曾在一次电商大促前三天紧急接入SkyWalking,愣是扛住了百万QPS的监控压力。

3.3 Zipkin:老牌链路追踪工具

Zipkin算是链路追踪的元老了。它由Twitter开源,设计理念很纯粹——只做链路追踪,不做其他。

Zipkin的架构很清晰:Collector接收数据,Storage存数据,UI查数据。它的数据模型是标准的Span模型,很多其他工具都借鉴了它。

// Zipkin的Span结构示例
{
  "traceId": "abc123",
  "id": "def456",
  "parentId": "xyz789",
  "name": "get /api/user",
  "timestamp": 1620000000000,
  "duration": 150000
}

优点:

  • 轻量级,部署简单
  • 社区生态成熟,各种语言的客户端库齐全
  • 与Spring Cloud Sleuth集成非常好

缺点:

  • 功能单一,没有告警和拓扑图
  • 存储层选择有限,Cassandra和ES二选一
避坑指南: 我曾经在一个项目里用Zipkin + Cassandra,结果Cassandra集群挂了,所有链路数据全丢。后来我学乖了,生产环境一定要用ES做存储,至少能保证数据可恢复。

3.4 Jaeger:云原生时代的宠儿

Jaeger是CNCF的毕业项目,跟Kubernetes、Prometheus是亲兄弟。如果你在云原生环境里跑微服务,Jaeger几乎是标配。

Jaeger最大的特点是支持自适应采样。什么意思?就是它可以根据流量自动调整采样率,高流量时少采,低流量时多采。这个功能太实用了。

# Jaeger自适应采样配置示例
sampling:
  strategies:
    type: adaptive
    parameters:
      target_samples_per_second: 10
      min_samples_per_second: 1
      max_samples_per_second: 100

优点:

  • 云原生支持极好,与K8s、Istio无缝集成
  • 支持gRPC和Thrift协议,性能高
  • 自适应采样,节省存储成本

缺点:

  • UI功能相对简陋,不如SkyWalking丰富
  • 对Java的Agent支持不如SkyWalking成熟
我的经验: 如果你在用Istio做服务网格,Jaeger是必选项。因为Istio的Envoy代理原生支持Jaeger的追踪协议,你甚至不需要改应用代码。

3.5 Pinpoint:Java应用的显微镜

Pinpoint是韩国团队开发的,对Java应用的监控粒度极细。细到什么程度?它能看到每个方法的调用耗时、参数值、甚至SQL语句。

我刚开始用Pinpoint时,被它的拓扑图震撼到了。它自动生成的服务依赖图,比人工画的架构图还清晰。

优点:

  • 代码级监控,能看到每个方法的执行情况
  • 自动生成服务拓扑图,非常直观
  • 对Java应用的侵入性极低

缺点:

  • 只支持Java和PHP,语言覆盖面窄
  • 存储依赖HBase,运维成本高
  • 数据量大时,HBase集群压力很大
避坑指南: 我曾经在一个日活千万的Java应用上部署Pinpoint,结果HBase的RegionServer频繁OOM。后来发现是Pinpoint的采样率太高,把HBase打爆了。建议生产环境把采样率调到1%以下。

3.6 选型决策矩阵

说了这么多,到底怎么选?我整理了一个决策矩阵,你对着自己的情况打勾就行。

场景 推荐工具 理由
Java为主,需要快速上线 SkyWalking 开箱即用,功能全面
云原生环境,K8s部署 Jaeger CNCF项目,与K8s集成好
只需要链路追踪,不要其他 Zipkin 轻量,专注,社区成熟
Java应用,需要代码级监控 Pinpoint 监控粒度最细,拓扑图漂亮
多语言混合架构 SkyWalking 或 Jaeger 语言支持广泛,社区活跃

你想想看,选型其实就三个维度:技术栈匹配度、功能需求、运维成本。别被花里胡哨的功能迷了眼,先搞清楚自己最需要什么。

核心结论:

  • 追求全面体验 → SkyWalking
  • 追求云原生 → Jaeger
  • 追求轻量专注 → Zipkin
  • 追求代码级监控 → Pinpoint

好了,这一章的内容就到这里。下一章我会讲APM系统的架构设计,包括数据采集、传输、存储、展示的全链路设计。到时候我会拿SkyWalking的架构做例子,手把手带你拆解。