在多线程应用程序中的线程之间传递分段上下文
注意
终止支持通知:2027 年 2 月 25 日,Amazon X-Ray 将停止对 Amazon X-Ray SDK 和进程守护程序的支持。2027 年 2 月 25 日之后,您将不会再收到更新或发行版本。有关支持时间表的更多信息,请参阅 X-Ray SDK 和进程守护程序终止支持时间表。我们建议迁移到 OpenTelemetry。有关迁移到 OpenTelemetry 的更多信息,请参阅从 X-Ray 检测迁移到 OpenTelemetry 检测。
在您的应用程序中创建新线程时,AWSXRayRecorder 不会维护对当前分段或子分段实体的引用。如果您在新线程中使用检测的客户端,SDK 会尝试写入到不存在的分段,这会导致出现 SegmentNotFoundException。
要避免在开发过程中引发异常,您可以使用 ContextMissingStrategy 配置记录器,改为让它记录错误。您可以在代码中使用 SetContextMissingStrategy 配置策略,或者使用环境变量或系统属性配置等效选项。
解决错误的一种方法是使用新分段:在您启动线程时调用 beginSegment,并在您将其关闭时调用 endSegment。如果您正在检测并非为响应 HTTP 请求而运行的代码,例如在您的应用程序启动时运行的代码,这很适合。
如果您使用多个线程来处理传入请求,您可以将当前分段或子分段传递到新线程,并将其提供给全局记录器。这样可以确保对于新线程中记录的信息,相关联的分段与针对该请求记录的其余信息的关联分段相同。一旦分段在新线程中可用,即可执行任何可使用 segment.run(() -> { ... }) 方法访问该分段的上下文的可运行。
有关示例,请参阅 在工作线程中使用检测的客户端。
使用 X-Ray 进行异步编程
在包含 SegmentContextExecutors 的异步 JAVA 程序中可以使用 X-Ray SDK for Java。SegmentContextExecutor 可实现执行程序接口,这意味着可将其传递到 CompletableFuture
例 示例 App.java:将 SegmentContexecutor 传递给 CompletableFuture
DynamoDbAsyncClient client = DynamoDbAsyncClient.create();
AWSXRay.beginSegment();
// ...
client.getItem(request).thenComposeAsync(response -> {
// If we did not provide the segment context executor, this request would not be traced correctly.
return client.getItem(request2);
}, SegmentContextExecutors.newSegmentContextExecutor());