@@ -16,7 +16,7 @@ index a96fa5e3f9..df5bcec438 100644
1616+ && ParentContextExtractor.AWS_TRACE_HEADER_PROPAGATOR_KEY.equalsIgnoreCase(
1717+ fields.iterator().next());
1818 }
19-
19+
2020 public static ApiGatewayProxyRequest forStream(InputStream source) {
2121diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsLambdaFunctionInstrumenter.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsLambdaFunctionInstrumenter.java
2222index 4136e7bed9..dbbcb1c99d 100644
@@ -29,17 +29,17 @@ index 4136e7bed9..dbbcb1c99d 100644
2929- import java.util.Locale;
3030 import java.util.Map;
3131 import javax.annotation.Nullable;
32-
32+
3333@@ -47,25 +46,15 @@ public class AwsLambdaFunctionInstrumenter {
3434 }
35-
35+
3636 public Context extract(AwsLambdaRequest input) {
3737+ return ParentContextExtractor.extract(input.getHeaders(), this);
3838+ }
3939+
4040+ public Context extract(Map<String, String> headers, TextMapGetter<Map<String, String>> getter) {
4141 ContextPropagationDebug.debugContextLeakIfEnabled();
42-
42+
4343 return openTelemetry
4444 .getPropagators()
4545 .getTextMapPropagator()
@@ -74,10 +74,9 @@ index aeb828b8e7..277c358ca8 100644
7474 .buildInstrumenter(SpanKindExtractor.alwaysServer()));
7575 }
7676diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java
77- deleted file mode 100644
78- index c88cf20c91..0000000000
77+ index c88cf20c91..e69de29bb2 100644
7978--- a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java
80- +++ /dev/null
79+ +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java
8180@@ -1,84 +0,0 @@
8281- /*
8382- * Copyright The OpenTelemetry Authors
@@ -163,108 +162,10 @@ index c88cf20c91..0000000000
163162- }
164163- }
165164- }
166- 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
167- new file mode 100644
168- index 0000000000..72d4f9253b
169- --- /dev/null
170- +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractor.java
171- @@ -0,0 +1,91 @@
172- + /*
173- + * Copyright The OpenTelemetry Authors
174- + * SPDX-License-Identifier: Apache-2.0
175- + */
176- +
177- + package io.opentelemetry.instrumentation.awslambdacore.v1_0.internal;
178- +
179- + import static io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.MapUtils.lowercaseMap;
180- +
181- + import io.opentelemetry.api.trace.Span;
182- + import io.opentelemetry.api.trace.SpanContext;
183- + import io.opentelemetry.context.Context;
184- + import io.opentelemetry.context.propagation.TextMapGetter;
185- + import io.opentelemetry.contrib.awsxray.propagator.AwsXrayPropagator;
186- + import java.util.Collections;
187- + import java.util.Locale;
188- + import java.util.Map;
189- +
190- + /**
191- + * This class is internal and is hence not for public use. Its APIs are unstable and can change at
192- + * any time.
193- + */
194- + public final class ParentContextExtractor {
195- +
196- + private static final String AWS_TRACE_HEADER_ENV_KEY = "_X_AMZN_TRACE_ID";
197- + private static final String AWS_TRACE_HEADER_PROP = "com.amazonaws.xray.traceHeader";
198- +
199- + static Context extract(Map<String, String> headers, AwsLambdaFunctionInstrumenter instrumenter) {
200- + Context parentContext = null;
201- + String parentTraceHeader = getTraceHeader();
202- + if (parentTraceHeader != null) {
203- + parentContext = fromXrayHeader(parentTraceHeader);
204- + }
205- + if (!isValidAndSampled(parentContext)) {
206- + // try http
207- + parentContext = fromHttpHeaders(headers, instrumenter);
208- + }
209- + return parentContext;
210- + }
211- +
212- + private static String getTraceHeader() {
213- + // Lambda propagates trace header by system property instead of environment variable from java17
214- + String traceHeader = System.getProperty(AWS_TRACE_HEADER_PROP);
215- + if (traceHeader == null || traceHeader.isEmpty()) {
216- + return System.getenv(AWS_TRACE_HEADER_ENV_KEY);
217- + }
218- + return traceHeader;
219- + }
220- +
221- + private static boolean isValidAndSampled(Context context) {
222- + if (context == null) {
223- + return false;
224- + }
225- + Span parentSpan = Span.fromContext(context);
226- + SpanContext parentSpanContext = parentSpan.getSpanContext();
227- + return (parentSpanContext.isValid() && parentSpanContext.isSampled());
228- + }
229- +
230- + private static Context fromHttpHeaders(
231- + Map<String, String> headers, AwsLambdaFunctionInstrumenter instrumenter) {
232- + return instrumenter.extract(lowercaseMap(headers), MapGetter.INSTANCE);
233- + }
234- +
235- + // lower-case map getter used for extraction
236- + static final String AWS_TRACE_HEADER_PROPAGATOR_KEY = "x-amzn-trace-id";
237- +
238- + public static Context fromXrayHeader(String parentHeader) {
239- + return AwsXrayPropagator.getInstance()
240- + .extract(
241- + // see BaseTracer#extract() on why we're using root() here
242- + Context.root(),
243- + Collections.singletonMap(AWS_TRACE_HEADER_PROPAGATOR_KEY, parentHeader),
244- + MapGetter.INSTANCE);
245- + }
246- +
247- + private enum MapGetter implements TextMapGetter<Map<String, String>> {
248- + INSTANCE;
249- +
250- + @Override
251- + public Iterable<String> keys(Map<String, String> map) {
252- + return map.keySet();
253- + }
254- +
255- + @Override
256- + public String get(Map<String, String> map, String s) {
257- + return map.get(s.toLowerCase(Locale.ROOT));
258- + }
259- + }
260- +
261- + private ParentContextExtractor() {}
262- + }
263165diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java
264- deleted file mode 100644
265- index 509bfbd05e..0000000000
166+ index 509bfbd05e..e69de29bb2 100644
266167--- a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java
267- +++ /dev/null
168+ +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java
268169@@ -1,128 +0,0 @@
269170- /*
270171- * Copyright The OpenTelemetry Authors
@@ -394,153 +295,12 @@ index 509bfbd05e..0000000000
394295- assertThat(spanContext.getTraceId()).isEqualTo("8a3c60f7d188f8fa79d48a391a778fa6");
395296- }
396297- }
397- 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
398- new file mode 100644
399- index 0000000000..1fa0b6e536
400- --- /dev/null
401- +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/ParentContextExtractorTest.java
402- @@ -0,0 +1,135 @@
403- + /*
404- + * Copyright The OpenTelemetry Authors
405- + * SPDX-License-Identifier: Apache-2.0
406- + */
407- +
408- + package io.opentelemetry.instrumentation.awslambdacore.v1_0.internal;
409- +
410- + import static org.assertj.core.api.Assertions.assertThat;
411- +
412- + import com.google.common.collect.ImmutableMap;
413- + import io.opentelemetry.api.OpenTelemetry;
414- + import io.opentelemetry.api.trace.Span;
415- + import io.opentelemetry.api.trace.SpanContext;
416- + import io.opentelemetry.context.Context;
417- + import io.opentelemetry.context.propagation.ContextPropagators;
418- + import io.opentelemetry.extension.trace.propagation.B3Propagator;
419- + import java.util.Map;
420- + import org.junit.jupiter.api.Test;
421- + import org.junit.jupiter.api.extension.ExtendWith;
422- + import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
423- + import uk.org.webcompere.systemstubs.jupiter.SystemStub;
424- + import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension;
425- + import uk.org.webcompere.systemstubs.properties.SystemProperties;
426- +
427- + /**
428- + * This class is internal and is hence not for public use. Its APIs are unstable and can change at
429- + * any time.
430- + */
431- + @ExtendWith(SystemStubsExtension.class)
432- + class ParentContextExtractorTest {
433- +
434- + @SystemStub final EnvironmentVariables environmentVariables = new EnvironmentVariables();
435- +
436- + private static final OpenTelemetry OTEL =
437- + OpenTelemetry.propagating(ContextPropagators.create(B3Propagator.injectingSingleHeader()));
438- +
439- + private static final AwsLambdaFunctionInstrumenter INSTRUMENTER =
440- + AwsLambdaFunctionInstrumenterFactory.createInstrumenter(OTEL);
441- +
442- + @Test
443- + void shouldUseHttpIfAwsParentNotSampled() {
444- + // given
445- + Map<String, String> headers =
446- + ImmutableMap.of(
447- + "X-b3-traceId",
448- + "4fd0b6131f19f39af59518d127b0cafe",
449- + "x-b3-spanid",
450- + "0000000000000123",
451- + "X-B3-Sampled",
452- + "true");
453- + environmentVariables.set(
454- + "_X_AMZN_TRACE_ID",
455- + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=0");
456- +
457- + // when
458- + Context context = ParentContextExtractor.extract(headers, INSTRUMENTER);
459- + // then
460- + Span span = Span.fromContext(context);
461- + SpanContext spanContext = span.getSpanContext();
462- + assertThat(spanContext.isValid()).isTrue();
463- + assertThat(spanContext.isValid()).isTrue();
464- + assertThat(spanContext.getSpanId()).isEqualTo("0000000000000123");
465- + assertThat(spanContext.getTraceId()).isEqualTo("4fd0b6131f19f39af59518d127b0cafe");
466- + }
467- +
468- + @Test
469- + void shouldPreferAwsParentHeaderIfValidAndSampled() {
470- + // given
471- + Map<String, String> headers =
472- + ImmutableMap.of(
473- + "X-b3-traceId",
474- + "4fd0b6131f19f39af59518d127b0cafe",
475- + "x-b3-spanid",
476- + "0000000000000456",
477- + "X-B3-Sampled",
478- + "true");
479- + environmentVariables.set(
480- + "_X_AMZN_TRACE_ID",
481- + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=1");
482- +
483- + // when
484- + Context context = ParentContextExtractor.extract(headers, INSTRUMENTER);
485- + // then
486- + Span span = Span.fromContext(context);
487- + SpanContext spanContext = span.getSpanContext();
488- + assertThat(spanContext.isValid()).isTrue();
489- + assertThat(spanContext.isValid()).isTrue();
490- + assertThat(spanContext.getSpanId()).isEqualTo("0000000000000456");
491- + assertThat(spanContext.getTraceId()).isEqualTo("8a3c60f7d188f8fa79d48a391a778fa6");
492- + }
493- +
494- + @Test
495- + void shouldExtractCaseInsensitiveHeaders() {
496- + // given
497- + Map<String, String> headers =
498- + ImmutableMap.of(
499- + "X-b3-traceId",
500- + "4fd0b6131f19f39af59518d127b0cafe",
501- + "x-b3-spanid",
502- + "0000000000000456",
503- + "X-B3-Sampled",
504- + "true");
505- +
506- + // when
507- + Context context = ParentContextExtractor.extract(headers, INSTRUMENTER);
508- + // then
509- + Span span = Span.fromContext(context);
510- + SpanContext spanContext = span.getSpanContext();
511- + assertThat(spanContext.isValid()).isTrue();
512- + assertThat(spanContext.isValid()).isTrue();
513- + assertThat(spanContext.getSpanId()).isEqualTo("0000000000000456");
514- + assertThat(spanContext.getTraceId()).isEqualTo("4fd0b6131f19f39af59518d127b0cafe");
515- + }
516- +
517- + @Test
518- + void shouldPreferSystemPropertyOverEnvVariable() {
519- + // given
520- + systemProperties.set(
521- + "com.amazonaws.xray.traceHeader",
522- + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa7;Parent=0000000000000789;Sampled=0");
523- + environmentVariables.set(
524- + "_X_AMZN_TRACE_ID",
525- + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=1");
526- +
527- + // when
528- + Context context = ParentContextExtractor.extract(headers, INSTRUMENTER);
529- + // then
530- + Span span = Span.fromContext(context);
531- + SpanContext spanContext = span.getSpanContext();
532- + assertThat(spanContext.isValid()).isTrue();
533- + assertThat(spanContext.isValid()).isTrue();
534- + assertThat(spanContext.getSpanId()).isEqualTo("0000000000000789");
535- + assertThat(spanContext.getTraceId()).isEqualTo("d188f8fa79d48a391a778fa7");
536- + }
537- + }
538298diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java
539- index e088efa906..544da9b1bb 100644
299+ index 94a85244e2..936917d0a8 100644
540300--- a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java
541301+++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/AbstractAwsLambdaTest.java
542302@@ -12,8 +12,6 @@ import static org.mockito.Mockito.when;
543-
303+
544304 import com.amazonaws.services.lambda.runtime.Context;
545305 import com.amazonaws.services.lambda.runtime.RequestHandler;
546306- import io.opentelemetry.api.common.AttributeKey;
@@ -589,10 +349,10 @@ index 305e3e62a0..844ee31899 100644
589349- import java.util.Locale;
590350- import java.util.Map;
591351+ import io.opentelemetry.instrumentation.awslambdacore.v1_0.internal.ParentContextExtractor;
592-
352+
593353 class SqsMessageSpanLinksExtractor implements SpanLinksExtractor<SQSMessage> {
594354 private static final String AWS_TRACE_HEADER_SQS_ATTRIBUTE_KEY = "AWSTraceHeader";
595-
355+
596356- // lower-case map getter used for extraction
597357- static final String AWS_TRACE_HEADER_PROPAGATOR_KEY = "x-amzn-trace-id";
598358-
@@ -632,14 +392,14 @@ index 305e3e62a0..844ee31899 100644
632392- }
633393 }
634394diff --git a/version.gradle.kts b/version.gradle.kts
635- index cc1414c0bf..db8a59b046 100644
395+ index 5217d396e2..25efa91252 100644
636396--- a/version.gradle.kts
637397+++ b/version.gradle.kts
638398@@ -1,5 +1,5 @@
639- - val stableVersion = "1.32.1 "
640- - val alphaVersion = "1.32.1 -alpha"
641- + val stableVersion = "1.32.1 -adot-lambda1"
642- + val alphaVersion = "1.32.1 -adot-lambda1-alpha"
643-
399+ - val stableVersion = "1.33.6 "
400+ - val alphaVersion = "1.33.6 -alpha"
401+ + val stableVersion = "1.33.6 -adot-lambda1"
402+ + val alphaVersion = "1.33.6 -adot-lambda1-alpha"
403+
644404 allprojects {
645- if (findProperty("otel.stable") != "true") {
405+ if (findProperty("otel.stable") != "true") {
0 commit comments