2

Is there any way how to use XRay instrumentation for AWS NodeJS SDK v3? In SDK v2, AWSXray was able to capture any client and instrument it for tracing into XRay. 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 XRay instrumentation with AWS SDK v3 for NodeJS?

MenyT
  • 1,653
  • 1
  • 8
  • 19
Martin Macak
  • 3,507
  • 2
  • 30
  • 54

1 Answers1

6

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:

Policies:
  - AWSXrayWriteOnlyAccess
MenyT
  • 1,653
  • 1
  • 8
  • 19
  • I am facing this issue with sdk 2.13 and xray-sdk-core 2.5. Is this a wrong combination? I checked the documentation and these should be compatible. – rahul sharma Apr 18 '23 at 07:41
  • If you are using aws sdk 2.13xx.x you should use `captureAWSClient` instead of `captureAWSv3Client` – MenyT Apr 18 '23 at 14:48