Go back you your Cloud9 environment and open your app workspace at serverless-observability-workshop/code/sample-app-tracing.
Lambda doesn’t allow us to add custom annotations and metadata to its root segment, so we first need to create our custom subsegment by updating our handler.
Edit the serverless-observability-workshop/code/sample-app-tracing/src/handlers/put-item.js file to add an initial subsegment called ## Handler
using the AWSXRay.captureAsyncFunc()
method on the entire handler method and closing the subsegment
inside a new finally
clause in our try/catch
.
exports.putItemHandler = async (event, context) => {
return AWSXRay.captureAsyncFunc('## Handler', async (subsegment) => {
// Initialization
try{
// Happy Path
} catch(err) {
// Exception Handling
} finally {
subsegment.close()
}
return response
}, AWSXRay.getSegment());
}
Next, we are ready to add our annotations in case of successful and failed executions to our given Item ID. Inside your handler
, find and add in the end of your try
and beginning of your catch
statements the annotations for ItemID
and Status
:
// Initialization
try{
// Happy Path
//Tracing
subsegment.addAnnotation('ItemID', JSON.parse(event.body).id)
subsegment.addAnnotation('Status', 'SUCCESS')
} catch(err) {
// Exception Handling
//Tracing
subsegment.addAnnotation('ItemID', JSON.parse(event.body).id)
subsegment.addAnnotation('Status', 'FAILED')
}
Next, let’s modify the putItem()
method to receive the subsegment
as a parameter and create an additional subsegment to capture any business logic inside this method. We will be also adding the item payload as metadata.
const putItem = async (event, segment) => {
return AWSXRay.captureAsyncFunc('## putItemData', async (subsegment) => {
// Initialization
try {
// Happy Path
//Tracing
subsegment.addMetadata('Item Payload', params)
} catch (err) {
// Exception Handling
} finally {
subsegment.close()
}
return response
}, segment);
}
Now, let’s modify the publishSns()
method to also receive the subsegment
as a parameter and create an additional subsegment to capture any business logic inside this method. We will be also adding the message payload as metadata.
const publishSns = async (data, segment) => {
return AWSXRay.captureAsyncFunc('## publishNewItemSNS', async (subsegment) => {
// Initialization
try {
// Happy Path
//Tracing
subsegment.addMetadata('Message Payload', msg)
} catch (err) {
// Exception Handling
} finally {
subsegment.close()
}
return response
}, segment);
}
Finally, modify the handler
method to pass the subsegment to both putItem()
and publishSns()
methods.
const item = await putItem(event, subsegment)
await publishSns(item, subsegment)
Save your changes to the serverless-observability-workshop/code/sample-app-tracing/src/handlers/put-item.js file.
Your entire file should look like the code below: