前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Jaeger和OpenTelemetry SDK混合环境中使用W3C Trace-Context

在Jaeger和OpenTelemetry SDK混合环境中使用W3C Trace-Context

作者头像
CNCF
发布2020-05-29 16:09:19
2.2K0
发布2020-05-29 16:09:19
举报
文章被收录于专栏:CNCFCNCF

作者:Pavol Loffay

在本文中,我们将了解如何使用带有W3C Trace-Context传播格式的Jaeger客户端。标准化的上下文传播格式,确保了不同跟踪系统和工具库之间的互操作性。在这方面,我们将探讨两个用例。首先,如何在Jaeger测仪环境中使用OpenTelemetry SDK。这个场景模拟了不同跟踪系统之间的互操作性,也模拟了从Jaeger客户端到OpenTelemetry SDK的迁移路径。在第二个用例中,我们将配置Jaeger原生客户端以使用W3C Trace-Context。

W3C Trace-Context

在深入讨论主要主题之前,让我们先了解一下W3C Trace-Context。W3C Trace-Context是用于跟踪标识符和元数据的标准化传播格式。它包含两个标题:

  • traceparent——描述传入请求在其跟踪图中的位置。它对跟踪ID、parent跨度ID和标志集进行编码。
  • tracestate——使用一组名称/值对表示的特定于供应商的数据来扩展traceparent。这个头是可选的,例如,可以对租户名进行编码。

标准化的进程间上下文传播格式解决了这些问题:

  • 在不同供应商之间交换跟踪上下文
  • 不同跟踪供应商收集的跟踪的相关性(correlation)
  • 如果没有标准可遵循,中介体、云提供商和服务提供商可能会丢弃特定于供应商的元数据。

现在,让我们看看在与Jaeger原生客户端混合的环境中OpenTelemetry Java SDK的配置。

使用Jaeger上下文传播格式配置OpenTelemetry SDK

在本节中,我们将了解在使用Jaeger原生客户端检测的环境中OpenTelemetry Java SDK的配置。当我们希望引入使用OpenTelemetry工具的新服务时,这个用例非常重要,它还展示了不同跟踪工具之间的互操作性。在混合环境中,我们必须确保所有检测库都理解相同的传播协议。

由于无法重新编译和重新部署现有服务以使用新的上下文传播格式,因此必须配置新服务以同时理解新的和旧的传播格式。下面是一个简单的图,其中显示了三个微服务A、B和X。只有服务X同时使用传播协议——Jaeger和W3C Trace-Context。这确保“遗留的”Jaeger服务能够继续由服务X启动的跟踪,反之亦然。

图中显示了使用OpenTelemetry工具的服务X,以及使用Jaeger工具的服务A和B。

现在让我们看一下代码。我们将配置OpenTelemetry Java SDK,以同时使用默认的W3C Trace-Context和Jaeger格式。首先,让我们为SDK和Jaeger上下文传播格式添加OpenTelemetry maven工件:

代码语言:javascript
复制
<dependency>
 <groupId>io.opentelemetry</groupId>
 <artifactId>opentelemetry-sdk</artifactId>
 <version>0.4.1</version>
</dependency>
<dependency>
 <groupId>io.opentelemetry</groupId>
 <artifactId>opentelemetry-contrib-trace-propagators</artifactId>
 <version>0.4.1</version>
</dependency>

跟踪器配置:

代码语言:javascript
复制
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.trace.Span;
import io.opentelemetry.trace.Tracer;
import io.opentelemetry.contrib.trace.propagation.JaegerPropagator; import io.opentelemetry.trace.propagation.HttpTraceContext;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation
         .DefaultContextPropagators;
ContextPropagators contextPropagators = DefaultContextPropagators.builder()
    .addHttpTextFormat(new JaegerPropagator())
    .addHttpTextFormat(new HttpTraceContext())
    .build();
OpenTelemetry.setPropagators(contextPropagators);


Tracer tracer = OpenTelemetry.getTracerProvider().get("io.example");
Span span = tracer.spanBuilder("operation").startSpan();
...

现在,将跟踪程序配置为同时使用W3C Trace-Context和Jaeger传播格式进行上下文注入和提取。遗留的Jaeger工具将识别Jaeger传播格式并删除W3C Trace-Context。

使用W3C Trace-Context配置Jaeger客户端

Jaeger原生客户端可以配置为使用定制的上下文传播格式。对W3C Trace-Context的支持通常直接在核心工件中提供。它可以通过编程方式配置,也可以通过环境变量JAEGER_PROPAGATION=w3c配置。

下面的代码片段显示了同时配置Jaeger和W3C Trace-Context格式的编程配置。

代码语言:javascript
复制
import io.jaegertracing.Configuration;
import io.jaegertracing.Configuration.Propagation;
Configuration configuration = Configuration.fromEnv("io.example");
configuration.getCodec()
    .withPropagation(Propagation.W3C)
    .withPropagation(Propagation.JAEGER);
JaegerTracer jaegerTracerWith = configuration.getTracer();

总结

在本文中,我们展示了如何在Jaeger原生客户端的异构环境中使用OpenTelemetry SDK,以及如何在Jaeger客户端中配置W3C Trace-Context。

参考

  • W3C Trace-Context: https://www.w3.org/TR/trace-context/
  • Jaeger客户端文档: https://www.jaegertracing.io/docs/latest/clientfeatures/
  • OpenTelemetry文档: https://opentelemetry.io/

感谢Yuri Shkuro和Gary Brown。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档