Jaeger 客户端集成 - Java篇
介绍
Jaeger是一个开源的分布式追踪系统,用于监控和排查微服务架构中的复杂事务流。Java客户端集成是通过Jaeger提供的Java库将追踪功能嵌入到你的应用程序中。本文将带你从零开始完成集成过程。
分布式追踪是什么?
就像快递物流跟踪系统可以显示包裹的运输路径一样,分布式追踪能记录请求在微服务间的流转过程。
前置条件
- JDK 8+
- Maven/Gradle项目
- 基础Java知识
第一步:添加依赖
对于Maven项目,在pom.xml
中添加:
xml
<dependency>
<groupId>io.jaegertracing</groupId>
<artifactId>jaeger-client</artifactId>
<version>1.8.1</version>
</dependency>
对于Gradle项目:
groovy
implementation 'io.jaegertracing:jaeger-client:1.8.1'
第二步:基础配置
创建JaegerTracer
实例的典型方式:
java
import io.jaegertracing.Configuration;
import io.opentracing.Tracer;
public class TracingInit {
public static Tracer initTracer(String serviceName) {
Configuration.SamplerConfiguration samplerConfig =
Configuration.SamplerConfiguration.fromEnv()
.withType("const")
.withParam(1); // 采样率100%
Configuration.ReporterConfiguration reporterConfig =
Configuration.ReporterConfiguration.fromEnv()
.withLogSpans(true);
Configuration config = new Configuration(serviceName)
.withSampler(samplerConfig)
.withReporter(reporterConfig);
return config.getTracer();
}
}
配置说明
withType("const")
:恒定采样策略withParam(1)
:采样所有请求withLogSpans(true)
:输出span日志到控制台
第三步:创建追踪Span
基本使用示例:
java
Tracer tracer = TracingInit.initTracer("order-service");
try (Scope scope = tracer.buildSpan("process-order").startActive(true)) {
// 业务逻辑
processOrder();
// 添加标签
scope.span().setTag("order.value", 150.00);
// 记录日志
scope.span().log("Order processed successfully");
} catch (Exception e) {
scope.span().setTag("error", true);
scope.span().log(e.getMessage());
}
实际应用场景
电商订单处理流程
对应代码实现:
java
public class OrderService {
private final Tracer tracer;
public OrderService(Tracer tracer) {
this.tracer = tracer;
}
public void processOrder(Order order) {
try (Scope scope = tracer.buildSpan("process-order").startActive(true)) {
// 记录订单信息
scope.span().setTag("order.id", order.getId());
// 调用支付服务
try (Scope paymentScope = tracer.buildSpan("process-payment").startActive(true)) {
paymentService.charge(order);
}
// 调用库存服务
try (Scope inventoryScope = tracer.buildSpan("update-inventory").startActive(true)) {
inventoryService.update(order);
}
}
}
}
高级配置
上报到Jaeger Collector
java
Configuration.ReporterConfiguration reporterConfig =
Configuration.ReporterConfiguration.fromEnv()
.withSender(
new Configuration.SenderConfiguration()
.withEndpoint("http://jaeger-collector:14268/api/traces")
);
自定义采样策略
java
Configuration.SamplerConfiguration samplerConfig =
new Configuration.SamplerConfiguration()
.withType("probabilistic")
.withParam(0.5); // 50%采样率
常见问题
注意事项
- 生产环境不应使用100%采样(
withParam(1)
) - 确保不会在循环中创建大量span
- 跨线程时需要手动传播span上下文
总结
通过本文你学会了:
- 添加Jaeger Java客户端依赖
- 配置和初始化Tracer
- 创建基本的span和scope
- 在实际业务场景中的应用
- 常见的高级配置选项
扩展练习
- 尝试在Spring Boot项目中集成Jaeger
- 创建一个跨三个微服务的完整追踪示例
- 实现自定义的采样策略(如只采样特定用户的请求)