首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用远程父级的跟踪id和span id创建Opentelem遥测上下文

使用远程父级的跟踪id和span id创建Opentelem遥测上下文
EN

Stack Overflow用户
提问于 2022-04-20 06:27:54
回答 2查看 2.6K关注 0票数 2

我有微服务,支持开放跟踪,并将跟踪id和span id注入到标头.其他微业务支持开放遥测。如何在第二个微服务中使用跟踪id和span-id创建父span?

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2022-05-07 02:27:13

您可以使用W3C跟踪上下文规范来实现这一点。我们需要通过HTTP从生产者发送示踪亲本(Ex:示踪亲本)(或者您可以使用使用者中的跟踪id和span-id创建它)。然后,我们可以提取远程上下文并使用traceparent创建span。

这是消费者控制器。TextMapGetter用于将跟踪父数据映射到上下文。ExtractModel只是一个自定义类。

代码语言:javascript
运行
复制
  @GetMapping(value = "/second")
  public String sencondTest(@RequestHeader(value = "traceparent") String traceparent){
    try {
      Tracer tracer = openTelemetry.getTracer("cloud.events.second");

      TextMapGetter<ExtractModel> getter = new TextMapGetter<>() {
        @Override
        public String get(ExtractModel carrier, String key) {
          if (carrier.getHeaders().containsKey(key)) {
            return carrier.getHeaders().get(key);
          }
          return null;
        }

        @Override
        public Iterable<String> keys(ExtractModel carrier) {
          return carrier.getHeaders().keySet();
        }
      };

      ExtractModel model = new ExtractModel();
      model.addHeader("traceparent", traceparent);
      Context extractedContext = openTelemetry.getPropagators().getTextMapPropagator()
              .extract(Context.current(), model, getter);

      try (Scope scope = extractedContext.makeCurrent()) {
        // Automatically use the extracted SpanContext as parent.
        Span serverSpan = tracer.spanBuilder("CloudEvents Server")
                .setSpanKind(SpanKind.SERVER)
                .startSpan();
        try {

          Thread.sleep(150);
        } finally {
          serverSpan.end();
        }
      }

    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }

    return "Server Received!";
  }

然后,当我们配置OpenTelemetrySdk时,需要在上下文传播程序中设置W3CTraceContextPropagator。

代码语言:javascript
运行
复制
// Use W3C Propagator(to extract span from HTTP headers) since we use the W3C specifications
TextMapPropagator textMapPropagator = W3CTraceContextPropagator.getInstance();

OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
        .setTracerProvider(tracerProvider)
        .setPropagators(ContextPropagators.create(textMapPropagator))
        .buildAndRegisterGlobal();

这是我的客户ExtractModel课程

代码语言:javascript
运行
复制
public class ExtractModel {

  private Map<String, String> headers;

  public void addHeader(String key, String value) {
    if (this.headers == null){
      headers = new HashMap<>();
    }
    headers.put(key, value);
  }

  public Map<String, String> getHeaders() {
    return headers;
  }

  public void setHeaders(Map<String, String> headers) {
    this.headers = headers;
  }
}

您可以在手工仪表的正式文件中找到更多细节。

票数 1
EN

Stack Overflow用户

发布于 2022-04-20 06:32:53

通常,如果在标头中可用,则必须将span-id和跟踪id传递。在您的微服务中获得的任何请求,检查标头中是否包含span-id和跟踪id。如果是,请提取它们并在您的服务中使用它们。如果它不存在,那么您将创建一个新的,并在您的服务中使用它,并将它添加到您的微服务之外的请求中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71935070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档