diff --git a/dd-java-agent/instrumentation/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsJmsMessageInstrumentation.java b/dd-java-agent/instrumentation/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsJmsMessageInstrumentation.java index 03eae7b7d26..5e5532cb16b 100644 --- a/dd-java-agent/instrumentation/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsJmsMessageInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java-sqs-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sqs/SqsJmsMessageInstrumentation.java @@ -7,6 +7,7 @@ import com.amazon.sqs.javamessaging.message.SQSMessage; import com.amazonaws.services.sqs.model.Message; +import com.amazonaws.services.sqs.model.MessageAttributeValue; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; @@ -32,6 +33,20 @@ public void methodAdvice(MethodTransformer transformer) { } public static class CopyTracePropertyAdvice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter(@Advice.Argument(2) Message sqsMessage) { + Map messageAttributes = sqsMessage.getMessageAttributes(); + MessageAttributeValue ddAttribute = messageAttributes.get("_datadog"); + if (ddAttribute != null && "Binary".equals(ddAttribute.getDataType())) { + // binary message attributes are not supported by amazon-sqs-java-messaging-lib, and there + // is a chance we might introduce one, either when the message was sent from SNS or from a + // DD-instrumented Javascript app. + // When we reach this point, the value would already have been used by the aws-sqs + // instrumentation, so we can safely remove it. + messageAttributes.remove("_datadog"); + } + } + @Advice.OnMethodExit(suppress = Throwable.class) public static void onExit( @Advice.Argument(2) Message sqsMessage, @Advice.FieldValue("properties") Map properties)