首页 > 解决方案 > OpenTelemetry:Java 上下文传播似乎不起作用?

问题描述

我编写了一个简单的 HTTP 服务器/客户端,启用了 OTEL Java 代理(v 1.5.3),并且正在使用 @WithSpan 注释。

这是我的客户端处理程序方法:

@WithSpan
    private static void handleResponse(HttpResponse<String> r, @SpanAttribute("idx.service.id") String serviceId, @SpanAttribute("idx.service.name") String serviceName) {
        
        Span span = Span.current();
        HttpHeaders headers = r.headers();

        Attributes eventAttributes = Attributes.of(AttributeKey.stringKey("response"), r.body(), AttributeKey.stringKey("content-type"), headers.firstValue("content-type").orElse("not present"));
        span.addEvent("idx.events.response", eventAttributes);

        try {
            TimeUnit.SECONDS.sleep(1);
        }
        catch(InterruptedException e) {
            System.out.println("...caught sleeping!...");
        }
    }

我的服务器方法:

@WithSpan
  private static void processRequest(@SpanAttribute("idx.service.id") String serviceId, @SpanAttribute("idx.service.name") String serviceName, HttpExchange exchange) throws IOException {

    Span span = Span.current();

    Attributes eventAttributes = Attributes.of(AttributeKey.stringKey("method"), exchange.getRequestMethod(), AttributeKey.stringKey("ipaddress"), exchange.getRemoteAddress().getAddress().getHostAddress());
    span.addEvent("idx.events.request", eventAttributes);

    // Show headers which are present to highlight context propagation.
    Headers headers = exchange.getRequestHeaders();
    for(String key: headers.keySet()) {
        System.out.println(key + ":" +  headers.getFirst(key));
    }

    String response = "Hi there!";
    exchange.sendResponseHeaders(200, response.getBytes().length);
    OutputStream os = exchange.getResponseBody();
    os.write(response.getBytes());
    os.close();

    try {
        TimeUnit.SECONDS.sleep(1);
    }
    catch(InterruptedException e) {
        System.out.println("...caught sleeping!...");
    }

  }

当我运行服务器并使用客户端调用请求时,我可以看到:

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
[otel.javaagent 2021-09-06 16:44:17:475 +0100] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 1.5.3
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
Connection:Upgrade, HTTP2-Settings
Http2-settings:AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
Host:localhost:16000
Upgrade:h2c
User-agent:Java-http-client/14.0.1
Traceparent:00-2cf056efcf306b3154193f50106c2e66-91331cd2b373a913-01
Uber-trace-id:2cf056efcf306b3154193f50106c2e66:91331cd2b373a913:0:1
Content-length:0

客户端和服务器上的代理都设置为向 Jaeger 发送跟踪:

# Export traces to Jaeger
otel.traces.exporter=jaeger
otel.exporter.jaeger.endpoint=http://localhost:14250
otel.service.name=idx.platform

# Export frequency (milliseconds)
otel.imr.export.interval=10000

# Set propagator methods
otel.propagators=jaeger,tracecontext,baggage

但是我看不到实际发生的相关性,我只能看到客户端和服务器的两条不同的跟踪。

不应该以某种方式在这里发生相关性吗?道歉,如果这应该以某种方式显而易见,但我错过了一些东西......

标签: javajaegeropen-telemetry

解决方案


推荐阅读