gpt4 book ai didi

amazon-web-services - AWS XRAY SDK 问题 : Failed to begin subsegment named 'Amazon S3' : segment cannot be found

转载 作者:行者123 更新时间:2023-12-01 01:43:31 26 4
gpt4 key购买 nike

我们正在将 XRAY 添加到我们的 Spring Boot 应用程序中,但我无法解决以下错误:

Failed to begin subsegment named 'Amazon S3': segment cannot be found.

这是我们代码的相关部分:

pom.xml:
<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>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-xray-recorder-sdk-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-xray-recorder-sdk-sql-postgres</artifactId>
<version>1.2.1</version>
</dependency>

Spring 应用程序
@Bean
public Filter TracingFilter() {
return new AWSXRayServletFilter("myService");
}

类调用 S3
@PostConstruct
public void runOnStartup(){
String fileName = "myFileName";
String bucketName = "myBucketName";

amazonS3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider("MyCredentials"))
.withClientConfiguration(getClientConfiguration())
.withRegion(region)
.build();

Segment segment = AWSXRay.beginSegment("do-startup-operation");
S3Object s3Object = amazonS3Client.getObject(bucketName, fileName);
AWSXRay.endSegment();

//Do stuff with S3Object
}

到目前为止我尝试过的:

1) 我试过使用和不使用 sdk-aws-sdk-instrumentor 导入,在这样做时添加 TracingHandler 配置,如 this question 中所述和 this documentation.
.withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder()))

2) 我找到了 this thread这似乎建议使用 AWSXRAY.createSegment(),但我不确定 lambda 中会发生什么,或者它是否与我的场景相关

我已阅读并发现相关的其他文档/代码:
https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-startup.html

https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-sdkclients.html

https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-multithreading.html

https://docs.aws.amazon.com/xray/latest/devguide/scorekeep-workerthreads.html

https://github.com/aws/aws-xray-sdk-java/blob/master/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/ThreadLocalSegmentContext.java#L23

附言我简化了我的代码并省略了一些错误处理,以使查看此问题的人更容易阅读

最佳答案

X-Ray servlet 过滤器将在收到请求时打开一个段,并在返回响应之前关闭它。它创建的段代表完整的请求/响应生命周期。作为服务此请求的一部分捕获的任何内容(在本例中可能是一些 AWS 服务调用)称为子分段。如您所见,子段需要跟踪上下文(这是用于哪个段的)。

问题在于,在服务器启动时,检测器 try catch S3 调用,但由于还没有请求传入,因此无法找到上下文。一种选择是设置环境变量 AWS_XRAY_CONTEXT_MISSINGLOG_ERROR所以没有异常(exception),只有一个日志条目。更多详情请见 https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-configuration.html#xray-sdk-java-configuration-envvars .

为了在 lambda 上运行,lambda 容器将为每次调用创建一个段。它将跟踪上下文设置为环境变量。因此,只要被捕获的代码在处理程序类中,上下文就应该始终存在。

关于amazon-web-services - AWS XRAY SDK 问题 : Failed to begin subsegment named 'Amazon S3' : segment cannot be found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53841672/

26 4 0