AWS X-Ray 未初始化新段

AWS X-Ray not initializing a new segment

我将 OpenTelemetry 与 AWS X-Ray 结合使用来跟踪以下之间的端到端消息传递:

生产者 (JVM) -> Kafka Broker -> 消费者(多个,Python-based)

生成的跟踪随后被发送到 AWS OTEL 收集器,后者将它们转发到 AWS X-Ray。

然而,当我从 X-Ray 中看到它们时,消费者跟踪显示为生产者的子段:

我希望将消费者视为一个单独的细分市场。

我还尝试在消费者端使用 AWS X-Ray SDK 来显式初始化一个新段,如下所示:

val traceId = TraceIdData(String(record.headers().headers("X-Amzn-Trace-Id").first().value()))
logger.debug("Trace Id {}, Parent Id {}", traceId.root, traceId.parent)
AWSXRay.beginSegment("Simple Kafka Consumer", traceId.root, traceId.parent)
... some processing ...
AWSXRay.endSegment()

然而,这在 AWS X-Ray 中仍显示为子分段,即使我开始一个新分段并指定:trace_idparent_id。我已确认这两个属性均不为空且有效。

如何在 AWS X-Ray 中为此持续跟踪生成新的 ?我最好使用 OpenTelemetry (agent/sdk/collector) 来执行此操作,但也可以使用 AWS X-Ray SDK。

我与 AWS X-Ray 团队进行了交谈,他们帮助我解决了问题。

出现此问题的原因是 awsxray exporter 仅在 kind=SpanKind.SERVER.

时为 Span 创建新段

我已经使用 OpenTelemetry SDK 实现了这个(在 Python 中)并在创建新跨度时明确声明 kind=SpanKind.SERVER

processing_span = self.tracer.start_span(self.service_name, context=current_context, kind=SpanKind.SERVER)

这给了我在服务地图中看到多个消费者的期望结果

不幸的是,OpenTelemetry java instrumentation for Kafka on consumer side 正在自动创建一个新的跨度,其中 kind=CONSUMER 无法修改(作为自动检测的一部分),因此获得我想要的结果的唯一方法是通过手动检测。