AWS XRAY SDK 问题:无法开始名为 'Amazon S3' 的子分段:找不到分段
AWS XRAY SDK issue: Failed to begin subsegment named 'Amazon S3': segment cannot be found
我们正在将 XRAY 添加到我们的 Spring 引导应用程序中,但我无法解决以下错误:
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>
SpringApplication.java
@Bean
public Filter TracingFilter() {
return new AWSXRayServletFilter("myService");
}
Class 调用 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 导入,按照 this question and this documentation.
中的说明添加 TracingHandler 配置
.withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder()))
2) 我发现 this thread 似乎建议使用 AWSXRAY.createSegment(),但我不确定 lambda 中会包含什么或者它是否与我的场景相关
其他 documentation/code 我已阅读并发现相关内容:
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
P.S。我简化了代码并省略了一些错误处理,以便查看此问题的人更容易阅读
X-Ray servlet 过滤器将在收到请求时打开一个片段,并在返回响应之前将其关闭。它创建的片段代表了完整的 request/response 生命周期。作为服务此请求的一部分捕获的任何内容(在本例中可能是某些 AWS 服务调用)称为子分段。如您所见,子段需要跟踪上下文(这是针对哪个段)。
问题是在服务器启动时,instrumentor 尝试捕获 S3 调用,但它找不到上下文,因为还没有请求传入。一种选择是将环境变量 AWS_XRAY_CONTEXT_MISSING
设置为 LOG_ERROR
,这样就没有异常,只有一个日志条目。在 https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-configuration.html#xray-sdk-java-configuration-envvars.
查看更多详细信息
对于 运行 在 lambda 上,lambda 容器将为每次调用创建一个段。它将跟踪上下文设置为环境变量。因此,只要被捕获的代码在处理程序中 class,上下文就应该始终存在。
替换后现在可以使用了
AWSXRay.getGlobalRecorder()
和
Entity mySegment = AWSXRay.beginSegment("do-startup-operation");
AWSXRay.getGlobalRecorder().setTraceEntity(mySegment);
S3Object s3Object = amazonS3Client.getObject(bucketName, fileName);
AWSXRay.endSegment();
我们正在将 XRAY 添加到我们的 Spring 引导应用程序中,但我无法解决以下错误:
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>
SpringApplication.java
@Bean
public Filter TracingFilter() {
return new AWSXRayServletFilter("myService");
}
Class 调用 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 导入,按照 this question and this documentation.
中的说明添加 TracingHandler 配置.withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder()))
2) 我发现 this thread 似乎建议使用 AWSXRAY.createSegment(),但我不确定 lambda 中会包含什么或者它是否与我的场景相关
其他 documentation/code 我已阅读并发现相关内容: 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
P.S。我简化了代码并省略了一些错误处理,以便查看此问题的人更容易阅读
X-Ray servlet 过滤器将在收到请求时打开一个片段,并在返回响应之前将其关闭。它创建的片段代表了完整的 request/response 生命周期。作为服务此请求的一部分捕获的任何内容(在本例中可能是某些 AWS 服务调用)称为子分段。如您所见,子段需要跟踪上下文(这是针对哪个段)。
问题是在服务器启动时,instrumentor 尝试捕获 S3 调用,但它找不到上下文,因为还没有请求传入。一种选择是将环境变量 AWS_XRAY_CONTEXT_MISSING
设置为 LOG_ERROR
,这样就没有异常,只有一个日志条目。在 https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-configuration.html#xray-sdk-java-configuration-envvars.
对于 运行 在 lambda 上,lambda 容器将为每次调用创建一个段。它将跟踪上下文设置为环境变量。因此,只要被捕获的代码在处理程序中 class,上下文就应该始终存在。
替换后现在可以使用了
AWSXRay.getGlobalRecorder()
和
Entity mySegment = AWSXRay.beginSegment("do-startup-operation");
AWSXRay.getGlobalRecorder().setTraceEntity(mySegment);
S3Object s3Object = amazonS3Client.getObject(bucketName, fileName);
AWSXRay.endSegment();