Search code examples
node.jsamazon-web-servicesaws-lambdaaws-sdk-nodejs

Invoke lambda from code with same trace id?


I have simple lambda A calling lambda B, I need to pass amazon trace id to lambda B. Is it possible while using lambda.invoke? Do you have some simple example to do this in node.js?


Lambda A:

const AWS = require('aws-sdk');
AWS.config.region = process.env.AWS_REGION;
const lambda = new AWS.Lambda();
const params = {
    FunctionName: 'lambda-b',
    InvocationType: 'Event',
    LogType: 'Tail',
    Payload: '{ "name" : "janko" }'
};
const result = await lambda.invoke(params).promise();
console.log(`TraceId: ${process.env._X_AMZN_TRACE_ID}`);

In log of lambda A is 'TraceId: Root=1-5be30a84-31c7700e813851b25fad8b5a;Parent=6bcdc85668f474fb;Sampled=0'


In log of lambda B is: 'TraceId: Root=1-5be30a81-c552e60321963c04d75db028;Parent=30247b5d7680c581;Sampled=0'


Solution

  • I was unable to pass trace-id directly, however aim of passing trace-id was to see complete event flow in x-ray. You can achieve this by wrapping lambda.invoke (similarly send to SQS/SNS can be wrapped).

    const AWSXRay = require('aws-xray-sdk');
    const AWS = require('aws-sdk');
    
    exports.handler = async (event) => {
        const lambda = AWSXRay.captureAWSClient(new AWS.Lambda());
        let params = {
            FunctionName: `lambda-b`,
            InvocationType: 'Event',
            Payload: '{ "name" : "janko" }'
        };            
        result = await lambda.invoke(params).promise();
    };
    

    Then you can see whole chain of calls in AWS X-Ray.