@@ -147,10 +147,10 @@ index 9341bf6f79..f719c1ea93 100644
147147 }
148148diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractor.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractor.java
149149new file mode 100644
150- index 0000000000..e711558e05
150+ index 0000000000..9bea9808a5
151151--- /dev/null
152152+++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractor.java
153- @@ -0,0 +1,68 @@
153+ @@ -0,0 +1,76 @@
154154+ /*
155155+ * Copyright The OpenTelemetry Authors
156156+ * SPDX-License-Identifier: Apache-2.0
@@ -164,13 +164,15 @@ index 0000000000..e711558e05
164164+ import io.opentelemetry.context.propagation.TextMapGetter;
165165+ import java.util.Locale;
166166+ import java.util.Map;
167+ + import java.util.logging.Logger;
167168+
168169+ /**
169170+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
170171+ * any time.
171172+ */
172173+ public final class ParentContextExtractor {
173174+
175+ + private static final Logger logger = Logger.getLogger(ParentContextExtractor.class.getName());
174176+ private static final String AWS_TRACE_HEADER_ENV_KEY = "_X_AMZN_TRACE_ID";
175177+ private static final String AWS_TRACE_HEADER_PROP = "com.amazonaws.xray.traceHeader";
176178+ // lower-case map getter used for extraction
@@ -190,7 +192,13 @@ index 0000000000..e711558e05
190192+
191193+ private static String getTraceHeader(
192194+ com.amazonaws.services.lambda.runtime.Context lambdaContext) {
193- + String traceHeader = lambdaContext.getXrayTraceId();
195+ + String traceHeader = null;
196+ + try {
197+ + // Use reflection to avoid muzzle issues with getXrayTraceId method
198+ + traceHeader = (String) lambdaContext.getClass().getMethod("getXrayTraceId").invoke(lambdaContext);
199+ + } catch (Exception e) {
200+ + logger.fine("Failed to get X-Ray trace ID via reflection: " + e.getMessage());
201+ + }
194202+ if (traceHeader != null && !traceHeader.isEmpty()) {
195203+ return traceHeader;
196204+ }
@@ -234,10 +242,10 @@ index cb19d1e568..12ed174bb2 100644
234242 assertThat(spanContext.getSpanId()).isEqualTo("00f067aa0ba902b7");
235243diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractorTest.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractorTest.java
236244new file mode 100644
237- index 0000000000..76fc823a65
245+ index 0000000000..edca3ce68c
238246--- /dev/null
239247+++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractorTest.java
240- @@ -0,0 +1,337 @@
248+ @@ -0,0 +1,359 @@
241249+ /*
242250+ * Copyright The OpenTelemetry Authors
243251+ * SPDX-License-Identifier: Apache-2.0
@@ -574,6 +582,28 @@ index 0000000000..76fc823a65
574582+ assertThat(spanContext.getSpanId()).isEqualTo("0000000000000789");
575583+ assertThat(spanContext.getTraceId()).isEqualTo("8a3c60f7d188f8fa79d48a391a778fa7");
576584+ }
585+ +
586+ + @Test
587+ + void shouldFallbackToSystemPropertyWhenReflectionFails() {
588+ + // given
589+ + Map<String, String> headers = ImmutableMap.of();
590+ + // Create a mock context that doesn't have getXrayTraceId method (simulates older Lambda runtime)
591+ + Context mockLambdaContextWithoutXrayMethod = mock(Context.class);
592+ + systemProperties.set(
593+ + "com.amazonaws.xray.traceHeader",
594+ + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa7;Parent=0000000000000789;Sampled=1");
595+ +
596+ + // when
597+ + io.opentelemetry.context.Context context =
598+ + ParentContextExtractor.extract(
599+ + headers, INSTRUMENTER_WITH_B3_XRAY_PROPAGATORS, mockLambdaContextWithoutXrayMethod);
600+ + // then
601+ + Span span = Span.fromContext(context);
602+ + SpanContext spanContext = span.getSpanContext();
603+ + assertThat(spanContext.isValid()).isTrue();
604+ + assertThat(spanContext.getSpanId()).isEqualTo("0000000000000789");
605+ + assertThat(spanContext.getTraceId()).isEqualTo("8a3c60f7d188f8fa79d48a391a778fa7");
606+ + }
577607+ }
578608diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaRequestHandlerInstrumentation.java b/instrumentation/aws-lambda/aws-lambda-events-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambdaevents/v2_2/AwsLambdaRequestHandlerInstrumentation.java
579609index e059250807..1fa80c3735 100644
@@ -614,7 +644,7 @@ index 4cd11fc0c4..7b7d62755c 100644
614644 }
615645
616646diff --git a/version.gradle.kts b/version.gradle.kts
617- index 023d04703c ..b267166804 100644
647+ index ec9690086c ..b267166804 100644
618648--- a/version.gradle.kts
619649+++ b/version.gradle.kts
620650@@ -1,5 +1,5 @@
0 commit comments