From 2e500da0bb13b4b666c803e5e6407b34d2c5e9e1 Mon Sep 17 00:00:00 2001 From: Daniel Abib Date: Thu, 4 Sep 2025 20:14:50 -0300 Subject: [PATCH 1/2] fix: Support provisioned concurrency in cold start detection - Add AWS_LAMBDA_INITIALIZATION_TYPE environment variable check - Prevent false cold start reporting when using provisioned concurrency - Fixes issue #2113 across Logging, Metrics, and Tracing utilities Before: cold_start: true (incorrect with provisioned concurrency) After: cold_start: false (correct with provisioned concurrency) --- .../common/internal/LambdaConstants.java | 2 ++ .../common/internal/LambdaHandlerProcessor.java | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaConstants.java b/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaConstants.java index d27ac1aa2..dda22c39b 100644 --- a/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaConstants.java +++ b/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaConstants.java @@ -23,4 +23,6 @@ public class LambdaConstants { public static final String ROOT_EQUALS = "Root="; public static final String POWERTOOLS_SERVICE_NAME = "POWERTOOLS_SERVICE_NAME"; public static final String SERVICE_UNDEFINED = "service_undefined"; + public static final String AWS_LAMBDA_INITIALIZATION_TYPE = "AWS_LAMBDA_INITIALIZATION_TYPE"; + public static final String PROVISIONED_CONCURRENCY = "provisioned-concurrency"; } diff --git a/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java b/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java index bfacd5204..96f74afee 100644 --- a/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java +++ b/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java @@ -88,7 +88,19 @@ protected static void resetServiceName() { } public static boolean isColdStart() { - return IS_COLD_START == null; + // If this is not the first invocation, it's definitely not a cold start + if (IS_COLD_START != null) { + return false; + } + + // Check if this execution environment was pre-warmed via provisioned concurrency + String initType = getenv(LambdaConstants.AWS_LAMBDA_INITIALIZATION_TYPE); + if (LambdaConstants.PROVISIONED_CONCURRENCY.equals(initType)) { + return false; // Pre-warmed environment, not a cold start + } + + // Traditional cold start detection - first invocation without provisioned concurrency + return true; } public static void coldStartDone() { From ddea3cd0234c4c2b49711f01396517c6e8d86df8 Mon Sep 17 00:00:00 2001 From: Daniel Abib Date: Fri, 5 Sep 2025 08:38:02 -0300 Subject: [PATCH 2/2] fix: Simplify isColdStart method to address SonarQube issue - Refactor if-then-else logic to single return statement - Maintains same functionality for provisioned concurrency detection - Addresses SonarQube code smell flagged by @sdangol - All tests passing: 21 tests, 0 failures --- .../common/internal/LambdaHandlerProcessor.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java b/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java index 96f74afee..a560f63cc 100644 --- a/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java +++ b/powertools-common/src/main/java/software/amazon/lambda/powertools/common/internal/LambdaHandlerProcessor.java @@ -89,18 +89,9 @@ protected static void resetServiceName() { public static boolean isColdStart() { // If this is not the first invocation, it's definitely not a cold start - if (IS_COLD_START != null) { - return false; - } - // Check if this execution environment was pre-warmed via provisioned concurrency - String initType = getenv(LambdaConstants.AWS_LAMBDA_INITIALIZATION_TYPE); - if (LambdaConstants.PROVISIONED_CONCURRENCY.equals(initType)) { - return false; // Pre-warmed environment, not a cold start - } - // Traditional cold start detection - first invocation without provisioned concurrency - return true; + return IS_COLD_START == null && !LambdaConstants.PROVISIONED_CONCURRENCY.equals(getenv(LambdaConstants.AWS_LAMBDA_INITIALIZATION_TYPE)); } public static void coldStartDone() {