NodeJS Lambda X-Ray Instrumentation
1 min readJan 11, 2022
Activate X-Ray for all Lambda Functions described in the template:
Globals:
Api:
TracingEnabled: true
Function:
Tracing: Active
# [...]
Enable API logs so as to view request log inside the trace:
Resources:
AccessLogs:
Type: AWS::Logs::LogGroup
Properties:
RetentionInDays: 30
LogGroupName: !Sub "/aws/apigateway/${AWS::StackName}"
HttpApi:
Type: AWS::Serverless::HttpApi
Properties:
Name: !Ref AWS::StackName
AccessLogSettings:
DestinationArn: !GetAtt AccessLogs.Arn
Format: '$context.identity.sourceIp $context.identity.caller $context.identity.user [$context.requestTime] "$context.httpMethod $context.resourcePath $context.protocol" $context.status $context.responseLength $context.requestId $context.extendedRequestId'
Wrap the AWS SDK with X-Ray capture method in order to trace all AWS API called by the code:
const AWSXRay = require('aws-xray-sdk-core');
const AWS = process.env.AWS_SAM_LOCAL ? require('aws-sdk') : AWSXRay.captureAWS(require('aws-sdk'));
const dynamo = new AWS.DynamoDB.DocumentClient();
// [...]
Instrumenting the http
agent in order to trace external HTTP requests:
const http = process.env.AWS_SAM_LOCAL ? require('http') : AWSXRay.captureHTTPs(require('http'));
// pass "http" to Axios
Activate X-Ray instrumentation globally for all http
agent:
if (!process.env.AWS_SAM_LOCAL) {
AWSXRay.captureHTTPsGlobal(require('http'));
}
Create a custom segment programmatically:
const segment = AWSXRay.getSegment();
const subsegment = segment.addNewSubsegment('subseg');
// [...]
subsegment.addAnnotation("mykey", "my value");
subsegment.addMetadata("my key", "my value");
subsegment.addMetadata("my key", "my value", "my namespace");
// [...]
subsegment.setUser('john123');
// [...]
subsegment.close();
Originally written on Jan 11, 2022.