微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 Spring 启动应用程序配置 XRay

如何解决无法使用 Spring 启动应用程序配置 XRay

我有一个 springboot 应用程序,它在 AWS Lambda 中部署为 docker 映像。 该应用程序运行良好,但我想在我的应用程序中引入 X-Ray Traces 以进行调试。 我尝试遵循 AWS 官方文档 - https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-aop-spring.html。但没有帮助。

POM.XML:-

<dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-xray-recorder-sdk-spring</artifactId>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-xray-recorder-sdk-core</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-xray-recorder-sdk-aws-sdk</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-xray-recorder-sdk-aws-sdk-instrumentor</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-xray-recorder-sdk-apache-http</artifactId>
            <version>1.2.1</version>
        </dependency>

WebConfig.java

@Configuration
public class WebConfig {
    @Bean
    public Filter TracingFilter(){
        return new AWSXRayServletFilter ("add-participant");
    }
}

XRayInspector.java

@Aspect
@Component
public class XRayInspector extends AbstractXRayInterceptor {

    @Override
    protected Map<String,Map<String,Object>> generateMetadata(ProceedingJoinPoint proceedingJoinPoint,Subsegment subsegment) {
        return super.generateMetadata(proceedingJoinPoint,subsegment);
    }

    @Override
    @pointcut("@within(com.amazonaws.xray.spring.aop.XRayEnabled) && bean(*)")
    public void xrayEnabledClasses() {
        System.out.println ("I am inside the class");
    }
}

ParticipantService.java

@Service
@XRayEnabled
public class ParticipantService {
public void save (ParticipantRequest participantRequest) {
        Entity mySegment = AWSXRay.beginSegment("save-participant");
        AWSXRay.getGlobalRecorder().setTraceEntity(mySegment);
        ParticipantCreatedEvent participantCreatedEvent = new ParticipantCreatedEvent
                (participantRequest.getEventId (),participantRequest.getTeamId (),participantRequest.getFirstName (),participantRequest.getLastName (),participantRequest.getEmail (),participantRequest.getContactNumber (),participantRequest.getorganization (),participantJpaRepository.findMaxdisplayOrder (participantRequest.getEventId ()) + 1);
        participant.setEventId (participantRequest.getEventId ());
        participant.save(createParticipantCommand,participantCreatedEvent);
        AWSXRay.endSegment();
    }
}

我收到以下错误:-

 Caused by: com.amazonaws.xray.exceptions.SubsegmentNotFoundException: Failed to end a subsegment: subsegment cannot be found.

at com.amazonaws.xray.contexts.LambdaSegmentContext.endSubsegment(LambdaSegmentContext.java:94) ~[aws-xray-recorder-sdk-core-1.2.1.jar!/:na]

谁能告诉我我做错了什么!

解决方法

该错误意味着在 Spring Boot 应用程序的某个地方缺少 X-Ray SDK 试图关闭的子段。您可以按照异常堆栈查找并确保在关闭之前始终创建一个子段。另外,我注意到您在服务中创建了一个细分市场。在 Lambda 中,检测 X-Ray SDK 与检测其他服务上托管的应用程序略有不同,该段将始终由 Lambda 运行时创建,您需要创建的唯一跟踪上下文是子段。

见:https://docs.aws.amazon.com/lambda/latest/dg/java-tracing.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。