Java 应用通过 OpenTelemetry API 实现手动埋点("Java应用使用OpenTelemetry API手动实现埋点详解")
原创
一、OpenTelemetry 简介
OpenTelemetry 是一个开源的分布式追踪系统,它允许您收集应用程序的跟踪信息,以便更好地领会应用程序的行为和性能。OpenTelemetry 提供了一个标准的 API 和 SDK,用于收集、处理和导出跟踪数据。
二、OpenTelemetry 核心组件
OpenTelemetry 关键包括以下核心组件:
- Tracer:负责创建和管理跟踪信息的接口。
- Span:描述跟踪中的一个操作。
- SpanContext:包含跟踪上下文信息,如跟踪 ID、跨度 ID 等。
- Propagators:用于在进程间传播跟踪上下文。
- Exporters:负责将跟踪数据发送到后端。
三、Java 应用手动埋点实现步骤
下面将详细介绍怎样使用 OpenTelemetry API 在 Java 应用中手动实现埋点。
1. 添加依存
首先,在项目的 pom.xml 文件中添加 OpenTelemetry 的依存。
io.opentelemetry
opentelemetry-api
1.10.1
io.opentelemetry
opentelemetry-sdk
1.10.1
io.opentelemetry
opentelemetry-exporter-jaeger
1.10.1
2. 初始化 OpenTelemetry
在应用启动时,初始化 OpenTelemetry 的 Tracer。
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
public class OpenTelemetryInitializer {
private static final OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder().build();
private static final Tracer tracer = openTelemetry.getTracer("java-tracer");
private static final TextMapPropagator propagator = openTelemetry.getPropagators().getTextMapPropagator();
static {
// 初始化 Jaeger 导出器
JaegerGrpcSpanExporter jaegerExporter = JaegerGrpcSpanExporter.builder()
.setEndpoint("http://localhost:14250")
.build();
// 将导出器添加到批处理处理器
SpanProcessor spanProcessor = BatchSpanProcessor.builder(jaegerExporter).build();
openTelemetry.getTracerProvider().addSpanProcessor(spanProcessor);
}
public static Tracer getTracer() {
return tracer;
}
public static TextMapPropagator getPropagator() {
return propagator;
}
}
3. 创建 Span
在需要埋点的代码位置,创建并起初一个新的 Span。
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
public class MyService {
public void doSomething() {
// 获取 Tracer
Tracer tracer = OpenTelemetryInitializer.getTracer();
// 创建 Span
Span span = tracer.spanBuilder("doSomething")
.startSpan();
try {
// 执行业务逻辑
// ...
// 设置 Span 的属性
span.setAttribute("key", "value");
// 终止 Span
span.end();
} catch (Exception e) {
// 处理异常
span.recordException(e);
span.end();
}
}
}