From bb887465f3193593a479a6dcae10572f1e30c79f Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 26 Feb 2024 17:56:27 +0200 Subject: [PATCH] Fix shading aws propagator (#10669) --- ...rumentation.javaagent-shadowing.gradle.kts | 2 +- examples/distro/gradle/shadow.gradle | 2 +- ...ry.instrumentation.muzzle-check.gradle.kts | 2 +- .../aws-sdk-2.2/javaagent/build.gradle.kts | 2 + .../awssdk/v2_2}/S3PresignerTest.java | 2 + .../v2_2}/Aws2ClientRecordHttpErrorTest.java | 2 + .../awssdk/v2_2/AwsXrayPropagatorTest.java | 55 +++++++++++++++++++ .../awssdk/v2_2}/QueryProtocolModelTest.java | 2 + .../tooling/RemappingUrlConnection.java | 10 +++- 9 files changed, 74 insertions(+), 5 deletions(-) rename instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/s3PresignerTest/java/{ => io/opentelemetry/javaagent/instrumentation/awssdk/v2_2}/S3PresignerTest.java (97%) rename instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/{ => io/opentelemetry/javaagent/instrumentation/awssdk/v2_2}/Aws2ClientRecordHttpErrorTest.java (93%) create mode 100644 instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsXrayPropagatorTest.java rename instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/{ => io/opentelemetry/javaagent/instrumentation/awssdk/v2_2}/QueryProtocolModelTest.java (93%) diff --git a/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts b/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts index 66fc10d03d..b5b99a0493 100644 --- a/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts +++ b/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts @@ -35,7 +35,7 @@ tasks.withType().configureEach { // relocate(the OpenTelemetry extensions that are used by instrumentation modules) // these extensions live in the AgentClassLoader, and are injected into the user's class loader // by the instrumentation modules that use them - relocate("io.opentelemetry.extension.aws", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + relocate("io.opentelemetry.contrib.awsxray", "io.opentelemetry.javaagent.shaded.io.opentelemetry.contrib.awsxray") relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") // this is for instrumentation of opentelemetry-api and opentelemetry-instrumentation-api diff --git a/examples/distro/gradle/shadow.gradle b/examples/distro/gradle/shadow.gradle index 46c19a75c9..fa3815cacb 100644 --- a/examples/distro/gradle/shadow.gradle +++ b/examples/distro/gradle/shadow.gradle @@ -18,6 +18,6 @@ ext.relocatePackages = { shadowJar -> // relocate the OpenTelemetry extensions that are used by instrumentation modules // these extensions live in the AgentClassLoader, and are injected into the user's class loader // by the instrumentation modules that use them - shadowJar.relocate("io.opentelemetry.extension.aws", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + shadowJar.relocate("io.opentelemetry.contrib.awsxray", "io.opentelemetry.javaagent.shaded.io.opentelemetry.contrib.awsxray") shadowJar.relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") } diff --git a/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts b/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts index 9c5a772c4c..0c3eb9e3ae 100644 --- a/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts +++ b/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts @@ -103,7 +103,7 @@ tasks.withType().configureEach { // relocate(the OpenTelemetry extensions that are used by instrumentation modules) // these extensions live in the AgentClassLoader, and are injected into the user's class loader // by the instrumentation modules that use them - relocate("io.opentelemetry.extension.aws", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws") + relocate("io.opentelemetry.contrib.awsxray", "io.opentelemetry.javaagent.shaded.io.opentelemetry.contrib.awsxray") relocate("io.opentelemetry.extension.kotlin", "io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin") // this is for instrumentation of opentelemetry-api and opentelemetry-instrumentation-api diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts index 3b6efbd696..4cfaae6135 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts @@ -71,6 +71,8 @@ dependencies { library("software.amazon.awssdk:sqs:2.2.0") testImplementation(project(":instrumentation:aws-sdk:aws-sdk-2.2:testing")) + testImplementation("io.opentelemetry.contrib:opentelemetry-aws-xray-propagator") + // Make sure these don't add HTTP headers testInstrumentation(project(":instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent")) testInstrumentation(project(":instrumentation:apache-httpclient:apache-httpclient-5.0:javaagent")) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/s3PresignerTest/java/S3PresignerTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/s3PresignerTest/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/S3PresignerTest.java similarity index 97% rename from instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/s3PresignerTest/java/S3PresignerTest.java rename to instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/s3PresignerTest/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/S3PresignerTest.java index 5d4f6f0442..1cbe4e4696 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/s3PresignerTest/java/S3PresignerTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/s3PresignerTest/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/S3PresignerTest.java @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; + import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.Span; diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/Aws2ClientRecordHttpErrorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/Aws2ClientRecordHttpErrorTest.java similarity index 93% rename from instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/Aws2ClientRecordHttpErrorTest.java rename to instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/Aws2ClientRecordHttpErrorTest.java index b9bb670a94..1d7f36ed37 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/Aws2ClientRecordHttpErrorTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/Aws2ClientRecordHttpErrorTest.java @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; + import io.opentelemetry.instrumentation.awssdk.v2_2.AbstractAws2ClientRecordHttpErrorTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsXrayPropagatorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsXrayPropagatorTest.java new file mode 100644 index 0000000000..1659f49968 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsXrayPropagatorTest.java @@ -0,0 +1,55 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.contrib.awsxray.propagator.AwsXrayPropagator; +import java.util.Collections; +import java.util.Map; +import org.junit.jupiter.api.Test; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.sqs.SqsClient; + +class AwsXrayPropagatorTest { + private static final StaticCredentialsProvider CREDENTIALS_PROVIDER = + StaticCredentialsProvider.create( + AwsBasicCredentials.create("my-access-key", "my-secret-key")); + + @Test + void testAgentShadesAwsXrayPropagator() { + // first build a SqsClient to trigger instrumentation + SqsClient.builder() + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build(); + // verify that AwsXrayPropagator is usable, if agent has not shaded AwsXrayPropagator this will + // fail with NoSuchMethodError + AwsXrayPropagator.getInstance() + .extract( + Context.root(), + Collections.singletonMap( + "X-Amzn-Trace-Id", + "Root=1-35a77be2-beae321878f706079d392ac3;Parent=df79f9d51134dc0b;Sampled=1"), + StringMapGetter.INSTANCE); + } + + private enum StringMapGetter implements TextMapGetter> { + INSTANCE; + + @Override + public Iterable keys(Map map) { + return map.keySet(); + } + + @Override + public String get(Map map, String s) { + return map.get(s); + } + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/QueryProtocolModelTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/QueryProtocolModelTest.java similarity index 93% rename from instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/QueryProtocolModelTest.java rename to instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/QueryProtocolModelTest.java index d86c1a49d4..96fcaf20cb 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/QueryProtocolModelTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/QueryProtocolModelTest.java @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; + import io.opentelemetry.instrumentation.awssdk.v2_2.AbstractQueryProtocolModelTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/RemappingUrlConnection.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/RemappingUrlConnection.java index 8d298b86a0..b8b22f4fa3 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/RemappingUrlConnection.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/RemappingUrlConnection.java @@ -36,8 +36,14 @@ public class RemappingUrlConnection extends URLConnection { "#io.opentelemetry.semconv", "#io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv"), rule( - "#io.opentelemetry.extension.aws", - "#io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws"), + "#io.opentelemetry.extension.incubator", + "#io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.incubator"), + rule( + "#io.opentelemetry.contrib.awsxray", + "#io.opentelemetry.javaagent.shaded.io.opentelemetry.contrib.awsxray"), + rule( + "#io.opentelemetry.extension.kotlin", + "#io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin"), rule("#application.io.opentelemetry", "#io.opentelemetry"), rule("#java.util.logging.Logger", "#io.opentelemetry.javaagent.bootstrap.PatchLogger"));