Skip to content

Commit 76ad3bd

Browse files
committed
working capture of SQS context
1 parent e609841 commit 76ad3bd

File tree

6 files changed

+113
-215
lines changed

6 files changed

+113
-215
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ out/
4545
# Visual Studio Code #
4646
######################
4747
.vscode
48+
.cursor
4849

4950
# Others #
5051
##########

dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/AbstractMessageConvertingMessageSourceToMessagingInstrumentation.java

Lines changed: 0 additions & 110 deletions
This file was deleted.

dd-java-agent/instrumentation/spring/spring-messaging-4.0/src/main/java/datadog/trace/instrumentation/springmessaging/SqsToSpringMessageTransferInstrumentation.java

Lines changed: 0 additions & 105 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
muzzle {
2+
pass {
3+
group = 'io.awspring.cloud'
4+
module = 'spring-cloud-aws-sqs'
5+
versions = "[3.0.0,)"
6+
assertInverse = true
7+
}
8+
}
9+
10+
ext {
11+
minJavaVersionForTests = JavaVersion.VERSION_17
12+
}
13+
14+
apply from: "$rootDir/gradle/java.gradle"
15+
16+
addTestSuiteForDir('latestDepTest', 'test')
17+
18+
[compileTestGroovy, compileLatestDepTestGroovy].each {
19+
it.javaLauncher = getJavaLauncherFor(17)
20+
}
21+
22+
dependencies {
23+
compileOnly group: 'software.amazon.awssdk', name: 'sqs', version: '2.20.162'
24+
compileOnly group: 'org.springframework', name: 'spring-messaging', version: '5.3.23'
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package datadog.trace.instrumentation.springsqs;
2+
3+
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.extendsClass;
4+
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
5+
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
6+
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
7+
8+
import com.google.auto.service.AutoService;
9+
import datadog.trace.agent.tooling.Instrumenter;
10+
import datadog.trace.agent.tooling.InstrumenterModule;
11+
import datadog.trace.bootstrap.ContextStore;
12+
import datadog.trace.bootstrap.InstrumentationContext;
13+
import datadog.trace.bootstrap.instrumentation.java.concurrent.State;
14+
import java.util.Map;
15+
import java.util.HashMap;
16+
import net.bytebuddy.asm.Advice;
17+
import net.bytebuddy.description.type.TypeDescription;
18+
import net.bytebuddy.matcher.ElementMatcher;
19+
import org.springframework.messaging.Message;
20+
21+
@AutoService(InstrumenterModule.class)
22+
public class AbstractMessagingMessageConverterToMessagingInstrumentation extends InstrumenterModule.Tracing
23+
implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice {
24+
25+
public AbstractMessagingMessageConverterToMessagingInstrumentation() {
26+
super("spring-sqs");
27+
}
28+
29+
@Override
30+
public String hierarchyMarkerType() {
31+
return "io.awspring.cloud.sqs.support.converter.AbstractMessagingMessageConverter";
32+
}
33+
34+
@Override
35+
public ElementMatcher<TypeDescription> hierarchyMatcher() {
36+
return extendsClass(named(hierarchyMarkerType()));
37+
}
38+
39+
@Override
40+
public void methodAdvice(MethodTransformer transformer) {
41+
// Instrument toMessagingMessage method
42+
transformer.applyAdvice(
43+
named("toMessagingMessage"),
44+
getClass().getName() + "$ToMessagingMessageAdvice");
45+
46+
}
47+
48+
@Override
49+
public Map<String, String> contextStore() {
50+
Map<String, String> contextStore = new HashMap<>(2);
51+
contextStore.put("software.amazon.awssdk.services.sqs.model.Message", State.class.getName());
52+
contextStore.put("org.springframework.messaging.Message", State.class.getName());
53+
return contextStore;
54+
}
55+
56+
public static class ToMessagingMessageAdvice {
57+
@Advice.OnMethodExit(suppress = Throwable.class)
58+
public static void onExit(
59+
@Advice.Argument(0) Object sqsMessage,
60+
@Advice.Return Message springMessage) {
61+
// Transfer state from SQS message to Spring message
62+
if (null != sqsMessage && null != springMessage &&
63+
sqsMessage.getClass().getName().equals("software.amazon.awssdk.services.sqs.model.Message")) {
64+
65+
ContextStore<software.amazon.awssdk.services.sqs.model.Message, State> from =
66+
InstrumentationContext.get(software.amazon.awssdk.services.sqs.model.Message.class, State.class);
67+
State state = from.get((software.amazon.awssdk.services.sqs.model.Message) sqsMessage);
68+
if (null != state) {
69+
from.put((software.amazon.awssdk.services.sqs.model.Message) sqsMessage, null);
70+
// Transfer state from SQS Message to Spring Message
71+
ContextStore<Message, State> to =
72+
InstrumentationContext.get(Message.class, State.class);
73+
to.put(springMessage, state);
74+
System.out.println("[ToMessaging] Transferred state from SQS message to Spring message on thread: " +
75+
Thread.currentThread().getId());
76+
} else {
77+
System.out.println("[ToMessaging] No state found in SQS message during conversion on thread: " +
78+
Thread.currentThread().getId());
79+
}
80+
} else {
81+
System.out.println("[ToMessaging] Skipping transfer - not an SQS message or null message on thread: " +
82+
Thread.currentThread().getId());
83+
}
84+
}
85+
}
86+
}

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,7 @@ include(
541541
":dd-java-agent:instrumentation:spring:spring-jms-3.1",
542542
":dd-java-agent:instrumentation:spring:spring-messaging-4.0",
543543
":dd-java-agent:instrumentation:spring:spring-rabbit-1.5",
544+
":dd-java-agent:instrumentation:spring:spring-sqs",
544545
":dd-java-agent:instrumentation:spring:spring-scheduling-3.1",
545546
":dd-java-agent:instrumentation:spring:spring-security:spring-security-5.0",
546547
":dd-java-agent:instrumentation:spring:spring-security:spring-security-6.0",

0 commit comments

Comments
 (0)