|
19 | 19 | import static software.amazon.lambda.powertools.common.internal.SystemWrapper.getProperty; |
20 | 20 | import static software.amazon.lambda.powertools.common.internal.SystemWrapper.getenv; |
21 | 21 |
|
22 | | -import com.amazonaws.services.lambda.runtime.Context; |
23 | | -import com.amazonaws.services.lambda.runtime.RequestHandler; |
24 | | -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; |
25 | 22 | import java.io.InputStream; |
26 | 23 | import java.io.OutputStream; |
27 | 24 | import java.util.Optional; |
| 25 | + |
28 | 26 | import org.aspectj.lang.ProceedingJoinPoint; |
29 | 27 |
|
| 28 | +import com.amazonaws.services.lambda.runtime.Context; |
| 29 | +import com.amazonaws.services.lambda.runtime.RequestHandler; |
| 30 | +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; |
| 31 | + |
| 32 | +import software.amazon.awssdk.utilslite.SdkInternalThreadLocal; |
| 33 | + |
30 | 34 | public final class LambdaHandlerProcessor { |
31 | 35 |
|
32 | | - // SERVICE_NAME cannot be final for testing purposes |
33 | | - private static String SERVICE_NAME = calculateServiceName(); |
| 36 | + // serviceName cannot be final for testing purposes |
| 37 | + private static String serviceName = calculateServiceName(); |
34 | 38 |
|
35 | | - private static Boolean IS_COLD_START = null; |
| 39 | + private static Boolean isColdStart = null; |
36 | 40 |
|
37 | 41 | private LambdaHandlerProcessor() { |
38 | 42 | // Hide default constructor |
39 | 43 | } |
40 | 44 |
|
41 | 45 | private static String calculateServiceName() { |
42 | 46 | return null != getenv(LambdaConstants.POWERTOOLS_SERVICE_NAME) |
43 | | - ? getenv(LambdaConstants.POWERTOOLS_SERVICE_NAME) : LambdaConstants.SERVICE_UNDEFINED; |
| 47 | + ? getenv(LambdaConstants.POWERTOOLS_SERVICE_NAME) |
| 48 | + : LambdaConstants.SERVICE_UNDEFINED; |
44 | 49 | } |
45 | 50 |
|
46 | 51 | public static boolean isHandlerMethod(final ProceedingJoinPoint pjp) { |
@@ -79,35 +84,41 @@ public static Context extractContext(final ProceedingJoinPoint pjp) { |
79 | 84 | } |
80 | 85 |
|
81 | 86 | public static String serviceName() { |
82 | | - return SERVICE_NAME; |
| 87 | + return serviceName; |
83 | 88 | } |
84 | 89 |
|
85 | 90 | // Method used for testing purposes |
86 | 91 | protected static void resetServiceName() { |
87 | | - SERVICE_NAME = calculateServiceName(); |
| 92 | + serviceName = calculateServiceName(); |
88 | 93 | } |
89 | 94 |
|
90 | 95 | public static boolean isColdStart() { |
91 | | - return IS_COLD_START == null; |
| 96 | + return isColdStart == null; |
92 | 97 | } |
93 | 98 |
|
94 | 99 | public static void coldStartDone() { |
95 | | - IS_COLD_START = false; |
| 100 | + isColdStart = false; |
96 | 101 | } |
97 | 102 |
|
98 | 103 | public static boolean isSamLocal() { |
99 | 104 | return "true".equals(getenv(LambdaConstants.AWS_SAM_LOCAL)); |
100 | 105 | } |
101 | 106 |
|
102 | 107 | public static Optional<String> getXrayTraceId() { |
103 | | - String X_AMZN_TRACE_ID = getenv(LambdaConstants.X_AMZN_TRACE_ID); |
| 108 | + // Try SdkInternalThreadLocal first |
| 109 | + String traceId = SdkInternalThreadLocal.get(LambdaConstants.AWS_LAMBDA_X_TRACE_ID); |
| 110 | + |
| 111 | + // Fallback to environment based approach |
| 112 | + if (traceId == null) { |
| 113 | + traceId = getenv(LambdaConstants.X_AMZN_TRACE_ID); |
| 114 | + } |
104 | 115 | // For the Java Lambda 17+ runtime, the Trace ID is set as a System Property |
105 | | - if (X_AMZN_TRACE_ID == null) { |
106 | | - X_AMZN_TRACE_ID = getProperty(LambdaConstants.XRAY_TRACE_HEADER); |
| 116 | + if (traceId == null) { |
| 117 | + traceId = getProperty(LambdaConstants.XRAY_TRACE_HEADER); |
107 | 118 | } |
108 | 119 |
|
109 | | - if (X_AMZN_TRACE_ID != null) { |
110 | | - return of(X_AMZN_TRACE_ID.split(";")[0].replace(LambdaConstants.ROOT_EQUALS, "")); |
| 120 | + if (traceId != null) { |
| 121 | + return of(traceId.split(";")[0].replace(LambdaConstants.ROOT_EQUALS, "")); |
111 | 122 | } |
112 | 123 | return empty(); |
113 | 124 | } |
|
0 commit comments