概述

Jaeger 是一个用于 Trace 管理的后端服务,是 OpenTelemetry 的 Trace 管理的一个流行的选择方案。甚至很多项目之前是使用的 OpenTracing + Jaeger 的分布式 Trace 管理方案。
那么,对于一个需要接入 OpenTelemetry 的项目而言,如果想要使用 Jaeger 作为后端存储方案,应该如何配置呢?
虽然 Otel 推荐的方案是通过部署 Collector 来进行原始 Otel 的数据接收并处理后传递给 Jaeger 服务,但是考虑到很多业务方目前已经通过 Jaeger Agent 进行了数据采集,因此,在我们本文的演示中,会演示如何通过 Jaeger Agent 来进行相关数据收集。
此外,在跨进程通信时,需要对 Span 上下文信息进行序列化传输,而目前序列化的规范有多种,其中 Jaeger 也有自己的 propagators 的规则,在本文中,我们还将会演示如何配置对应的规则为 Jaeger 规范。

输出 Trace 数据到 Jaeger Agent

首先,我们来看一下如何将全局的 TraceProvider 中的 Exporter 设置为 Jaeger Agent,从而能够将 Trace 数据传递给 Jaeger Agent。

  1. import (
  2. "context"
  3. logger "github.com/sirupsen/logrus"
  4. "go.opentelemetry.io/otel"
  5. "go.opentelemetry.io/otel/attribute"
  6. "go.opentelemetry.io/otel/exporters/jaeger"
  7. "go.opentelemetry.io/otel/sdk/resource"
  8. sdktrace "go.opentelemetry.io/otel/sdk/trace"
  9. semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
  10. )
  11. func InitTracerProvider() {
  12. // 初始化 traceProvider
  13. var traceProvider *sdktrace.TracerProvider
  14. // 创建 Jaeger Exporter
  15. exporter, err := jaeger.New(jaeger.WithAgentEndpoint(jaeger.WithAgentHost("127.0.0.1")))
  16. if err != nil {
  17. logger.Errorf("create jaeger client failed: %s", err)
  18. return
  19. }
  20. traceProvider = sdktrace.NewTracerProvider(
  21. sdktrace.WithSampler(sdktrace.AlwaysSample()),
  22. // 设置 Jaeger Export 为对应 traceProvider 的 Exporter
  23. sdktrace.WithBatcher(exporter),
  24. sdktrace.WithResource(resource.NewWithAttributes(
  25. semconv.SchemaURL,
  26. semconv.ServiceNameKey.String("demo"),
  27. )),
  28. )
  29. // 将设置的 traceProvider 设置为全局 traceProvider
  30. otel.SetTracerProvider(traceProvider)
  31. }

可以看到,将要将 Trace 数据输出到 Jaeger Agent 的核心其实就是需要设置 exporter 为 Jaeger Agent 的 Exporter 即可。

设置 Propagator 模式为 Jaeger

相比配置 Exporter 而言,设置 Propagator 模式就更加简单了,示例代码如下:

  1. import (
  2. "go.opentelemetry.io/otel"
  3. jaegerProp "go.opentelemetry.io/contrib/propagators/jaeger"
  4. )
  5. func main() {
  6. otel.SetTextMapPropagator(jaegerProp.Jaeger{})
  7. }

可以看到,我们只需要调用 SetTextMapPropagator 函数来设置对应的全局 Propagator 模式即可。