Skip to content

Commit 59dbaa2

Browse files
committed
use reflection to access xray trace id from lambda context
1 parent fbeaff8 commit 59dbaa2

File tree

1 file changed

+36
-6
lines changed

1 file changed

+36
-6
lines changed

lambda-layer/patches/opentelemetry-java-instrumentation.patch

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,10 @@ index 9341bf6f79..f719c1ea93 100644
147147
}
148148
diff --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
149149
new 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");
235243
diff --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
236244
new 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
+}
578608
diff --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
579609
index e059250807..1fa80c3735 100644
@@ -614,7 +644,7 @@ index 4cd11fc0c4..7b7d62755c 100644
614644
}
615645

616646
diff --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

Comments
 (0)