使用 X-Ray SDK for Java 跟踪 Amazon SDK 调用
应用程序调用 Amazon Web Services 服务来存储数据、写入队列或发送通知时,X-Ray SDK for Java 跟踪在子分段中跟踪下游的调用。所跟踪的 Amazon Web Services 服务以及您在这些服务中访问的资源(例如,Amazon S3 存储桶或 Amazon SQS 队列),在 X-Ray 控制台的跟踪地图上显示为下游节点。
当您在生成中包括 aws-sdk
和 aws-sdk-instrumentor
子模块时,X-Ray SDK for Java 自动检测所有 Amazon SDK 客户端。如果您未包括 Instrumentor 子模块,则可以选择检测一些客户端,同时排除另一些。
要检测单独的客户端,请从生成中删除 aws-sdk-instrumentor
子模块,使用服务的客户端生成器,在您 Amazon SDK 客户端上添加 XRayClient
作为 TracingHandler
。
例如,要检测 AmazonDynamoDB
客户端,请将跟踪处理程序传递到 AmazonDynamoDBClientBuilder
。
例 MyModel.java - DynamoDB 客户端
import com.amazonaws.xray.AWSXRay;
import com.amazonaws.xray.handlers.TracingHandler;
...
public class MyModel {
private AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.fromName(System.getenv("AWS_REGION")))
.withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder()))
.build();
...
对于所有服务,都可以在 X-Ray 控制台中看到调用的 API 的名称。X-Ray SDK 会为一部分服务将信息添加到分段,从而在服务地图中提供更高的粒度。
例如,当使用经过检测的 DynamoDB 客户端发出调用时,对于针对表的调用,SDK 会将表名称添加到分段中。在控制台中,每个表在服务地图中显示为一个独立的节点,以及没有表作为目标的调用的一般 DynamoDB 节点。
例 对 DynamoDB 进行调用以保存项目的子分段
{
"id": "24756640c0d0978a",
"start_time": 1.480305974194E9,
"end_time": 1.4803059742E9,
"name": "DynamoDB",
"namespace": "aws",
"http": {
"response": {
"content_length": 60,
"status": 200
}
},
"aws": {
"table_name": "scorekeep-user",
"operation": "UpdateItem",
"request_id": "UBQNSO5AEM8T4FDA4RQDEB94OVTDRVV4K4HIRGVJF66Q9ASUAAJG",
}
}
在您访问指定的资源时,对以下服务的调用会在服务地图中创建额外的节点。没有定向到特定资源的调用,为服务创建了通用节点。
-
Amazon DynamoDB - 表名称
-
Amazon Simple Storage Service - 存储桶和键名称
-
Amazon Simple Queue Service - 队列名称
要使用 Amazon SDK for Java 2.2 及更高版本对 Amazon Web Services 服务 的下游调用进行检测,可以从构建配置中省略 aws-xray-recorder-sdk-aws-sdk-v2-instrumentor
模块。改为包含 aws-xray-recorder-sdk-aws-sdk-v2 module
,然后通过为它们配置 TracingInterceptor
来检测各个客户端。
例 Amazon SDK for Java 2.2 及更高版本 – 跟踪拦截程序
import com.amazonaws.xray.interceptors.TracingInterceptor; import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration import software.amazon.awssdk.services.dynamodb.DynamoDbClient; //... public class MyModel { private DynamoDbClient client = DynamoDbClient.builder() .region(Region.US_WEST_2) .overrideConfiguration(ClientOverrideConfiguration.builder() .addExecutionInterceptor(new TracingInterceptor()) .build() ) .build(); //...