NodeJS Lambda X-Ray Instrumentation

Fabio Gollinucci
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.

--

--

Fabio Gollinucci
Fabio Gollinucci

Written by Fabio Gollinucci

Backend Developer & Cloud Architect @ Bitbull

No responses yet