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/notify-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.notifyNewItemHandler = 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('Status', 'SUCCESS')
} catch(err) {
// Exception Handling
//Tracing
subsegment.addAnnotation('Status', 'FAILED')
}
Next, let’s modify the getItem() method to receive the subsegment as a parameter and create an additional subsegment to capture any business logic inside this method.
const getItem = async (record, segment) => {
return AWSXRay.captureAsyncFunc('## subscribeSNSNewItem', async (subsegment) => {
// Initialization
try {
// Happy Path
} catch (err) {
// Exception Handling
} finally {
subsegment.close()
}
return response
}, segment);
}
Finally, modify the handler method to pass the subsegment to the getItem() method.
response = await getItem(record, subsegment)
Save your changes to the serverless-observability-workshop/code/sample-app-tracing/src/handlers/notify-item.js file.
Your entire file should look like the code below:
const AWSXRay = require('aws-xray-sdk-core')
const AWS = AWSXRay.captureAWS(require('aws-sdk'))
exports.notifyNewItemHandler = async (event, context) => {
return AWSXRay.captureAsyncFunc('## Handler', async (subsegment) => {
let response
try {
const record = JSON.parse(event.Records[0].Sns.Message)
response = await getItem(record, subsegment)
//Tracing
//subsegment.addAnnotation('ItemID', id)
subsegment.addAnnotation('Status', 'SUCCESS')
} catch (err) {
//Tracing
//subsegment.addAnnotation('ItemID', id)
subsegment.addAnnotation('Status', 'FAILED')
throw err
} finally {
subsegment.close()
}
return response
}, AWSXRay.getSegment());
}
const getItem = async (record, segment) => {
return AWSXRay.captureAsyncFunc('## subscribeSNSNewItem', async (subsegment) => {
let response
try {
response = JSON.stringify(record)
} catch (err) {
throw err
} finally {
subsegment.close()
}
return response
}, segment);
}