diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts index 43d9aab933b3..2e1aac948038 100644 --- a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/build.gradle.kts @@ -12,17 +12,13 @@ muzzle { } dependencies { - // current latest release 3.3.0-M1 has parent that is from central because of that we can't use - // library here and have to use compileOnly + testImplementation to avoid resolving the broken - // version - compileOnly("io.awspring.cloud:spring-cloud-aws-starter-sqs:3.0.0") + library("io.awspring.cloud:spring-cloud-aws-starter-sqs:3.0.0") implementation(project(":instrumentation:aws-sdk:aws-sdk-2.2:library")) testInstrumentation(project(":instrumentation:aws-sdk:aws-sdk-2.2:javaagent")) testImplementation("org.elasticmq:elasticmq-rest-sqs_2.13") - testImplementation("io.awspring.cloud:spring-cloud-aws-starter-sqs:3.0.0") testLibrary("org.springframework.boot:spring-boot-starter-test:3.0.0") testLibrary("org.springframework.boot:spring-boot-starter-web:3.0.0") } diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/MessageHeaderUtilsInstrumentation.java b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/MessageHeaderUtilsInstrumentation.java new file mode 100644 index 000000000000..0154da50096a --- /dev/null +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/MessageHeaderUtilsInstrumentation.java @@ -0,0 +1,45 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.aws; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.springframework.messaging.Message; + +public class MessageHeaderUtilsInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("io.awspring.cloud.sqs.MessageHeaderUtils"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + namedOneOf("addHeaderIfAbsent", "addHeadersIfAbsent", "removeHeaderIfPresent") + .and(returns(named("org.springframework.messaging.Message"))) + .and(takesArgument(0, named("org.springframework.messaging.Message"))), + this.getClass().getName() + "$PreserveContextAdvice"); + } + + @SuppressWarnings("unused") + public static class PreserveContextAdvice { + + @Advice.OnMethodExit(suppress = Throwable.class) + public static void methodExit( + @Advice.Argument(0) Message original, @Advice.Return Message result) { + SpringAwsUtil.copyTracingState(original, result); + } + } +} diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsSqsInstrumentationModule.java b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsSqsInstrumentationModule.java index df773c5057d5..77eaa8d55505 100644 --- a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsSqsInstrumentationModule.java +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsSqsInstrumentationModule.java @@ -37,6 +37,7 @@ public List typeInstrumentations() { new AbstractMessageConvertingMessageSourceInstrumentation(), new MessagingMessageListenerAdapterInstrumentation(), new SqsTemplateInstrumentation(), - new AcknowledgementExecutionContextInstrumentation()); + new AcknowledgementExecutionContextInstrumentation(), + new MessageHeaderUtilsInstrumentation()); } } diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsUtil.java b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsUtil.java index 10428c016dab..b95f165298bb 100644 --- a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsUtil.java +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/aws/SpringAwsUtil.java @@ -53,6 +53,14 @@ public static void attachTracingState(Object originalMessage, Message convert tracingContextField.set(convertedMessage, new TracingContext(tracingList, message)); } + public static void copyTracingState(Message original, Message transformed) { + if (original == transformed) { + return; + } + + tracingContextField.set(transformed, tracingContextField.get(original)); + } + public static MessageScope handleMessage(Message message) { TracingContext tracingContext = tracingContextField.get(message); if (tracingContext == null) {