amazon-web-services - Xray 多线程 - 无法结束子段:找不到子段
问题描述
我在使用 REST API 的多线程环境中使用 Xray 时遇到问题。我正在使用适用于 Java 的 Xray Auto 检测代理和 Spring 启动。
我尝试按照此处找到的示例 https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-workerthreads.html
但是,在结束我的子段时,我收到“抑制 AWS X-Ray 上下文丢失异常 (SubsegmentNotFoundException):无法结束子段:找不到子段”的日志输出。
我怀疑发生的情况是在 CompletableFuture 完成之前,请求已被完全处理并返回给客户端。我认为这意味着 X 射线段已关闭,这可能解释了我看到此问题的原因。我想知道是否有什么我可以做的来解决这个问题?
Entity segment = AWSXRay.getGlobalRecorder().getTraceEntity();
CompletableFuture.runAsync(() -> {
AWSXRay.getGlobalRecorder().setTraceEntity(segment);
AWSXRay.beginSubsegment("PostTest");
try {
defaultService.createStatus(accessToken, statusRequest);
} finally {
AWSXRay.endSubsegment();
}
})
解决方案
感谢您的深入研究,这个错误日志让用户感到困惑,Xray SDK 最好在开始子段时提醒用户段丢失,但不要在结束时抛出丢失子段异常。
您的猜测是正确的,子段可以晚于父段结束是合乎逻辑的,但子段必须早于其父段结束。否则将不会成功创建其他子段,当然也不能在最后结束。请尝试调整您的代码以在段关闭之前启动此异步线程。
推荐阅读
- python - 从用 hydra.main() 修饰的函数返回配置
- swift - 如何用 PHPickerViewController 中的图像替换 livePhoto?
- python-3.x - Python pre-order to postfix notation reverse Polish notation
- python - 如何使用 BeautifulSoup 获取多个 div 下的 div 元素?
- c# - 从包含数组的对象列表中返回不同的列表
- javascript - 带有 Laravel 8 的 SurveyJs 没有 Larvel-surveyjs 包
- c++ - 如何获取 char 数组 char* 的长度
- next.js - Nextjs Auth0 在 getServerSideProps 中获取数据
- lambda-calculus - 减少这个 lambda 表达式
- javascript - 为什么我的搜索栏功能不正常