本文目录导读:

Java 有成熟的分布式追踪 API,并且已经实现了标准化,最核心的规范是 OpenTelemetry。
简单直接的答案:有,而且现在是 OpenTelemetry 的时代。
核心标准:OpenTelemetry (推荐)
OpenTelemetry 是目前业界公认的分布式追踪和可观测性标准,它提供了统一的 API、SDK 和工具,让你可以轻松地为 Java 应用添加追踪、指标和日志功能。
关键点:
- 标准化 API:
io.opentelemetry:opentelemetry-api定义了 Span、Tracer、Context 等核心接口。 - 无厂商锁定:你使用统一的 API 编写代码,底层可以切换到 Jaeger、Zipkin、SkyWalking、Datadog、AWS X-Ray 等任何兼容的后端。
- 自动埋点:对于常见的框架(Spring Boot、gRPC、JDBC、Kafka、Servlet 等),OpenTelemetry 提供了自动的 Java Agent,无需修改代码即可实现追踪。
快速示例(手动埋点):
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
public class MyService {
private final Tracer tracer;
public MyService(OpenTelemetry openTelemetry) {
this.tracer = openTelemetry.getTracer("my-service");
}
public void processOrder(String orderId) {
// 1. 创建一个 Span(追踪的基本单元)
Span span = tracer.spanBuilder("processOrder")
.setAttribute("order.id", orderId)
.startSpan();
// 2. 将 Span 放入当前上下文
try (Scope scope = span.makeCurrent()) {
// 3. 执行业务逻辑(这里可能会调用其他服务或数据库)
doWork();
} catch (Exception e) {
span.recordException(e);
span.setStatus(StatusCode.ERROR);
} finally {
// 4. 结束 Span
span.end();
}
}
}
过去的规范(已过时或边缘化)
了解这些有助于理解现状:
- OpenTracing:早期的统一 API 标准(如 Jaeger、Zipkin 的旧客户端)。已被 OpenTelemetry 合并并取代。
- Brave:Zipkin 的 Java 客户端库,虽然在旧项目中很常见,但 OpenTelemetry 现在是更好的选择。
- Apache SkyWalking:有自己的 Java Agent 和 API(
apm-agent-core),虽然功能强大,但属于特定实现,不如 OpenTelemetry 通用。
如何快速集成(推荐方案)
目前最流行的做法是 使用 OpenTelemetry Java Agent,实现零代码侵入的自动追踪。
-
下载 Agent:从 OpenTelemetry 发布页 下载
opentelemetry-javaagent.jar。 -
JVM 启动参数:添加
-javaagent:path/to/opentelemetry-javaagent.jar。 -
配置导出器:通过环境变量或配置文件,设置追踪数据发送到哪里。
- Jaeger:
OTEL_TRACES_EXPORTER=jaeger,OTEL_EXPORTER_JAEGER_ENDPOINT=http://localhost:14250 - Zipkin:
OTEL_TRACES_EXPORTER=zipkin,OTEL_EXPORTER_ZIPKIN_ENDPOINT=http://localhost:9411/api/v2/spans - SkyWalking:
OTEL_TRACES_EXPORTER=otlp,配合 SkyWalking OAP Server。
这是目前最简单、最推荐的方式,它支持 Spring Boot、Tomcat、gRPC 等几乎所有主流框架。
- Jaeger:
总结对比
| 标准/库 | 状态 | 特点 |
|---|---|---|
| OpenTelemetry | 当前标准,强烈推荐 | 统一 API + Agent 自动埋点 + 无厂商锁定 |
| Brave (Zipkin) | 旧标准,有稳定维护 | 仅 Zipkin 生态,手动埋点多 |
| SkyWalking | 特定实现,功能强大 | 性能优秀,但通用性弱于 OpenTelemetry |
| OpenTracing | 已废弃 | 不要在新项目中使用 |
实践建议
- 新项目:直接采用 OpenTelemetry API 进行手动埋点(关键业务),并用 OpenTelemetry Java Agent 实现自动采集。
- 老项目:
- 如果还在用 Brave/Zipkin,建议逐步迁移到 OpenTelemetry Agent。
- 如果已经用了 SkyWalking Agent,可以继续,其功能依然很好。
- 选择后端:Jaeger 适合简单场景,Zipkin 适合社区,SkyWalking 适合中文团队和复杂拓扑分析。
一句话回答: 是的,OpenTelemetry Java 分布式追踪的标准 API,配合 Java Agent 可以实现零代码侵入的追踪。