javascriptnode.jsaws-lambdaaws-sdk-jsaws-xray

AWS X-Ray with AWS SDK v3 for Node.sj


Is there any way how to use X-Ray instrumentation for AWS Node.js SDK v3? In SDK v2, AWSXray was able to capture any client and instrument it for tracing into X-Ray. I have been trying the same thing with v3 with following snippet

const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb");
const AWSXRay = require("aws-xray-sdk");
// if uncommented, this throws an exception
// AWSXRay.captureAWSClient(DynamoDBClient); 

const client = new DynamoDBClient({region: process.env.AWS_REGION});
// if uncommented, this throws an exception
// AWSXRay.captureAWSClient(client);

const scan = new ScanCommand({
    TableName: 'xxx',
});
await client.send(scan) // ?

But both commented lines throw service.customizeRequests is not a function. This seems like AWS SDK s3 is not backward-compatible with original AWSXRay library.

I found that SDK v3 contains XRay client, but this is just a client that can send spans and traces into AWS, not an instrumentation agent.

What's recommended pattern of using X-Ray instrumentation with AWS SDK v3 for Node.js?


Solution

  • You need to use v3 compatible x-ray-sdk capture function captureAWSv3Client

    Here is working snippet:

    const {DynamoDBClient, ScanCommand} = require("@aws-sdk/client-dynamodb");
    const AWSXRay = require("aws-xray-sdk-core");
    
    const dynamoClient = AWSXRay.captureAWSv3Client(
        new DynamoDBClient({})
    )
    
    const scan = new ScanCommand({
        TableName: 'xxx',
    });
    
    const response = await dynamoClient.send(scan)
    

    It is also important to have permissions to write into X-Ray eg using SAM:

    Policies:
      - AWSXrayWriteOnlyAccess