OpenTelemetry笔记(1)-基础概念

概念

追踪(Tracing)

表示一次分布式链路跟踪

如下图,一整个流程表示一次 Tracing

Tracer

Tracer 负责创建 spans 和并与上下文交互

TracerProvider

Tracer 的提供者,用于创建 Tracer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface TracerProvider {

/**
* Gets or creates a named tracer instance.
*
*/
Tracer get(String instrumentationName);

/**
* Gets or creates a named and versioned tracer instance.
*
*/
Tracer get(String instrumentationName, String instrumentationVersion);
}

默认实现 SdkTracerProvider

SdkTracerProvider 是 TracerProvider 的默认实现

1
2
3
4
5
6
7
SdkTracerProvider tracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(grpcSpanExporter))
.setResource(Resource.create(Attributes.builder()
.put(ResourceAttributes.SERVICE_NAME, "TestService")
.put(ResourceAttributes.SERVICE_VERSION, "1.0.0")
.build()))
.build();

Span

表示分布式链路跟踪中的一条数据

如下图,每个树节点的数据表示一个 Span

SpanExporter

负责将产生的 Span 数据发送到特定的后端,比如 SLS 的 Trace 服务,就是一个 Exporter

SpanExporter 接口定义

SpanExporter 接口实现

其中 OtlpGrpcSpanExporter 实现了远程数据的传输

OtlpGrpcSpanExporter 实例定义

1
2
3
4
5
6
7
OtlpGrpcSpanExporter grpcSpanExporter = OtlpGrpcSpanExporter.builder()
.setEndpoint("https://${endpoint}") //配置.setEndpoint参数时,必须添加https://,例如https://test-project.cn-hangzhou.log.aliyuncs.com:10010。
.addHeader("x-sls-otel-project", "${project}")
.addHeader("x-sls-otel-instance-id", "${instance}")
.addHeader("x-sls-otel-ak-id", "${access-key-id}")
.addHeader("x-sls-otel-ak-secret", "${access-key-secret}")
.build();

参考:https://help.aliyun.com/document_detail/208901.html

Span 处理器(SpanProcessor)

SpanProcessor 定义

SpanProcessor 用于定义如何将产生的 Span 数据,通过 SpanExporter 进行传输

SpanProcessor 接口实现

  • SimpleSpanProcessor 将结束的 Span 立即转发到 SpanExporter
  • BatchSpanProcessor 对它们进行批处理并批量发送它们
  • MultiSpanProcessor 将多个 Span 处理器配置为同时处于活动状态

示例

1
2
3
4
private void spanProcessorTest() {
SimpleSpanProcessor.newBuilder(grpcSpanExporter).build();
BatchSpanProcessor.builder(grpcSpanExporter).setMaxExportBatchSize(10).build();
}

OpenTelemetry 接口

OpenTelemetry 接口是 Telemetry 对外的终端接口

如下定义

这里暂时先忽略 ContextPropagators

1
2
3
4
5
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.setPropagators(ContextPropagators.create
(W3CTraceContextPropagator.getInstance()))
.build();

示例

以下示例,会生成一条 Span 数据

1
2
3
4
5
6
public static void main(String[] args) {
OpenTelemetry openTelemetry = OpenTelemetryFactory.create();
Tracer tracer = openTelemetry.getTracer("demo-instrumentation","1.0.0");
Span span = tracer.spanBuilder("basicSpan").startSpan();
span.end();
}

效果如下

参考文档