Skip to content

Commit dd02e9e

Browse files
authored
Adding oversampling mitigation example to core package ReadMe (#545)
* added oversampling mitigation example to core package ReadMe * update logged message * added code snippet to wrap downstream SDK calls with unsampled subsegment * updated code snippet * nit: style improvements * changed wording for oversampling mitigation APIs * nit: style improvements
1 parent c831933 commit dd02e9e

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

packages/core/README.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,70 @@ subsegment.addSubsegment(newSubseg);
401401
newSubseg.close();
402402
```
403403

404+
### Oversampling Mitigation
405+
To modify the sampling decision at the subsegment level, subsegments that inherit the decision of their direct parent (segment or subsegment) can be created using the `addNewSubsegment` and `addSubsegment` APIs, and unsampled subsegments can be created using the `addNewSubsegmentWithoutSampling` and `addSubsegmentWithoutSampling` APIs.
406+
407+
The code snippet below demonstrates creating a sampled or unsampled subsegment based on the sampling decision of each SQS message processed by Lambda.
408+
409+
```js
410+
exports.handler = async function(event, context) {
411+
event.Records.forEach(message => {
412+
413+
const { attributes } = message;
414+
let facade = xrayContext.getSegment();
415+
416+
if(SqsMessageHelper.isSampled(message)){
417+
418+
let sampledSubsegment = facade.addNewSubsegment('sqs-subsegment-sampled');
419+
xrayContext.setSegment(sampledSubsegment);
420+
console.log("processing SQS message - sampled");
421+
sampledSubsegment.close();
422+
423+
} else {
424+
let unsampledSubsegment = facade.addNewSubsegmentWithoutSampling('sqs-subsegment-unsampled');
425+
xrayContext.setSegment(unsampledSubsegment);
426+
console.log("processing SQS message - unsampled");
427+
unsampledSubsegment.close();
428+
}
429+
430+
xrayContext.setSegment(facade);
431+
});
432+
433+
return 'Success';
434+
}
435+
```
436+
437+
The code snippet below demonstrates wrapping a downstream AWS SDK request with an unsampled subsegment.
438+
```js
439+
const { Segment } = require('aws-xray-sdk');
440+
const xray = require('aws-xray-sdk');
441+
442+
// Instrument AWS SDK Clients
443+
const AWS = xray.captureAWS(require('aws-sdk'));
444+
445+
exports.handler = async (event, context) => {
446+
const facade = xray.getSegment();
447+
448+
// Create a not-sampled subsegment, which will coerce the downstream request to be unsampled
449+
const unsampled = facade.addNewSubsegmentWithoutSampling('sqs-subsegment-unsampled');
450+
451+
// Set unsampled subsegment in context
452+
xray.setSegment(unsampled);
453+
454+
try {
455+
const sqs = new AWS.SQS();
456+
const data = await sqs.listQueues().promise();
457+
console.log(data);
458+
} catch (error) {
459+
console.log("retrieveFromSqs error:", error);
460+
throw error;
461+
}
462+
unsampled.close();
463+
return 'Success';
464+
}
465+
466+
```
467+
404468
## Automatic Mode Examples
405469

406470
### Capture through function calls

0 commit comments

Comments
 (0)