improv(metrics): Add thread-safety to Metrics utility through thread-local Metrics instance management #2294
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.



Summary
This PR makes the Metrics utility thread-safe for scenarios when used as a singleton in a Lambda handler that uses multi-threading while modifying dimensions or other metadata from within threads.
Changes
The main change is the introduction of a
RequestScopedMetricsProxy. This class lazily initializes the corresponding metrics backend on the first invocation of e.g..addMetric(...)using aConcurrentHashMap<String, Metrics>keyed by X-Ray trace ID. This ensures that concurrent usages of Metrics are isolated per Lambda invocation (not per thread), and metrics added in child threads are correctly flushed.This is the same approach we use in log buffering. See for example:
powertools-lambda-java/powertools-logging/powertools-logging-log4j/src/main/java/software/amazon/lambda/powertools/logging/log4j/BufferingAppender.java
Lines 102 to 103 in 4e83d8a
powertools-lambda-java/powertools-logging/powertools-logging-log4j/src/main/java/software/amazon/lambda/powertools/logging/log4j/BufferingAppender.java
Lines 112 to 124 in 4e83d8a
Issue number: #2289
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
Disclaimer: We value your time and bandwidth. As such, any pull requests created on non-triaged issues might not be successful.