Closed
Description
Expected Behaviour
Instructions on how to avoid this segment leak scenario.
Current Behaviour
When middy returns early, the segment is not closed (middy does not run after middleware), eventually this results in a RangeError via the incrementCounter call due to how many open segments exist.
Code snippet
const tracer = new Tracer({ serviceName: 'xxx' })
...
export const handler = middy(lambdaHandler).use(captureLambdaHandler(tracer)).use(cacheMiddleware);
Steps to Reproduce
- Create a lambda with provisioned concurrency
- Hook up the captureLambdaHandler middleware
- Create middleware that runs after the capture mw, that returns early in its before
- Put this lambda under high load (this issue keeps arising 40 mins into our load tests)
Possible Solution
Before returning early in middy, I grab the current segment and close it. That does not seem to solve the problem, surprisingly. Do I have to also close all potential sub segments? Is the handler segment not the issue, is it actually the parent lambda segment?
AWS Lambda Powertools for TypeScript version
latest
AWS Lambda function runtime
16.x
Packaging format used
npm
Execution logs
2023-04-10T14:16:56.326Z d94677bc-a252-4830-a678-2c5ece7e0aff ERROR Invoke Error
{""errorType"":""RangeError"",""errorMessage"":""Maximum call stack size exceeded"",""stack"":[""RangeError: Maximum call stack size exceeded"",""
at Ae.incrementCounter (/var/task/index.js:25:9545)"",""
at Ae.incrementCounter (/var/task/index.js:25:9621)"","" at Ae.incrementCounter (/var/task/index.js:25:9621)"",""
at Ae.incrementCounter (/var/task/index.js:25:9621)"","" at Ae.incrementCounter (/var/task/index.js:25:9621)"",""
at Ae.incrementCounter (/var/task/index.js:25:9621)"","" at Ae.incrementCounter (/var/task/index.js:25:9621)"",""
at Ae.incrementCounter (/var/task/index.js:25:9621)"","" at Ae.incrementCounter (/var/task/index.js:25:9621)"",""
at Ae.incrementCounter (/var/task/index.js:25:9621)""]}