在 Java 中使用 trace-id 和 span-id 创建一个 open-telemetry 跨度

Create an open-telemetry span using trace-id and span-id in Java

我正在使用 open-telemetry 来跟踪我的应用程序,并且在我的分布式系统中有一些微服务和 Kafka 代理。我正在使用 Java/spring-boot 并在 HTTP Headers 中发送跟踪 parent(例如:00-8652a752089f33e2659dff28d683a18f-7359b90f4355cfd9-01)。

我在服务器(Kafka 消费者)中尝试了以下代码,但这总是会创建一个具有不同跟踪 ID 的跨度。但我需要嵌套到 parent 跟踪的跨度。

@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!";
  }

我读了 documentation 但没有帮助。有什么办法可以做到这一点?任何建议都会有所帮助。

找到解决方案。当我们配置 OpenTelemetrySdk 时需要在 Context Propagators 中设置 W3CTraceContextPropagator。

// 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();

为未来的用户发布了解决方案。;-)