AWS X-Ray 未初始化新段

Yay*_*rón 5 amazon-web-services aws-xray open-telemetry

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

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

然后,生成的跟踪将发送到 AWS OTEL Collector,后者将其转发到 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()
Run Code Online (Sandbox Code Playgroud)

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

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

Yay*_*rón 1

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

出现此问题的原因是awsxray exporter仅在 时为 Spans 创建新段kind=SpanKind.SERVER

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

processing_span = self.tracer.start_span(self.service_name, context=current_context, kind=SpanKind.SERVER)
Run Code Online (Sandbox Code Playgroud)

这给了我想要的结果,在服务映射中看到多个消费者 服务地图

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