X射线多线程处理-无法终止子段:找不到子段

问题描述

我在REST API的多线程环境中使用Xray时遇到问题。 我正在使用适用于Java的Xray自动检测代理和Spring Boot。

我尝试遵循此处找到的示例 https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-workerthreads.html

但是,当结束我的细分时,我得到的日志输出为 “禁止AWS X-Ray上下文丢失异常(SubsegmentNotFoundException):无法结束子段:找不到子段。”

我怀疑在CompletableFuture完成之前,已经完全处理了请求并将响应返回给客户端了。我认为这意味着Xray区域已经关闭,这也许可以解释为什么我看到此问题。我想知道是否有什么办法可以解决这个问题?

    Entity segment = AWSXRay.getGlobalRecorder().getTraceEntity();

    CompletableFuture.runAsync(() -> {
        AWSXRay.getGlobalRecorder().setTraceEntity(segment);

        AWSXRay.beginSubsegment("PostTest");
        try {
            defaultService.createStatus(accesstoken,statusRequest);
        } finally {
            AWSXRay.endSubsegment();
        }
    })

解决方法

感谢您的深入研究,该错误日志使用户感到困惑,Xray SDK最好提醒用户在开始细分时缺少细分,但不要在末尾抛出缺失的细分。

您的猜测是正确的,合乎逻辑的是子段可以比父段结束更晚结束,但是子段必须比其父段结束更早开始。其他子段将无法成功创建,并且肯定无法在结尾处结束。在段关闭之前,请尝试调整代码以启动此异步线程。