首页 > 解决方案 > 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();
        }
    })

标签: amazon-web-servicesinstrumentationaws-xray

解决方案


感谢您的深入研究,这个错误日志让用户感到困惑,Xray SDK 最好在开始子段时提醒用户段丢失,但不要在结束时抛出丢失子段异常。

您的猜测是正确的,子段可以晚于父段结束是合乎逻辑的,但子段必须早于其父段结束。否则将不会成功创建其他子段,当然也不能在最后结束。请尝试调整您的代码以在段关闭之前启动此异步线程。


推荐阅读