Skip to content

Commit d25059a

Browse files
committed
formatting
1 parent 2153fe5 commit d25059a

File tree

8 files changed

+326
-0
lines changed

8 files changed

+326
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
muzzle {
3+
pass {
4+
group = "jakarta.jws"
5+
module = "jakarta.jws-api"
6+
versions = "[3.0.0,]"
7+
}
8+
}
9+
10+
apply from: "$rootDir/gradle/java.gradle"
11+
12+
addTestSuiteForDir('latestDepTest', 'test')
13+
14+
dependencies {
15+
// todo correct version non rs
16+
compileOnly group: 'jakarta.jws', name: 'jakarta.jws-api', version: '3.0.0'
17+
18+
//todo also make jakarta
19+
testImplementation group: 'jakarta.jws', name: 'jakarta.jws-api', version: '3.0.0'
20+
latestDepTestImplementation group: 'jakarta.jws', name: 'jakarta.jws-api', version: '+'
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package datadog.trace.instrumentation.jakartaws;
2+
3+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
4+
import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes;
5+
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
6+
import datadog.trace.bootstrap.instrumentation.decorator.BaseDecorator;
7+
8+
public class WebServiceDecorator extends BaseDecorator {
9+
public static final WebServiceDecorator DECORATE = new WebServiceDecorator();
10+
11+
public static final CharSequence JAKARTA_WS_REQUEST =
12+
UTF8BytesString.create("jakarta-ws.request");
13+
public static final CharSequence JAKARTA_WS_ENDPOINT =
14+
UTF8BytesString.create("jakarta-ws-endpoint");
15+
16+
private WebServiceDecorator() {}
17+
18+
@Override
19+
protected String[] instrumentationNames() {
20+
return new String[] {"jakarta-ws"};
21+
}
22+
23+
@Override
24+
protected CharSequence spanType() {
25+
return InternalSpanTypes.SOAP;
26+
}
27+
28+
@Override
29+
protected CharSequence component() {
30+
return JAKARTA_WS_ENDPOINT;
31+
}
32+
33+
public void onJaxWsSpan(final AgentSpan span, final Class<?> target, final String method) {
34+
span.setResourceName(spanNameForMethod(target, method));
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package datadog.trace.instrumentation.jakartaws;
2+
3+
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.declaresAnnotation;
4+
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.hasSuperMethod;
5+
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.hasSuperType;
6+
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
7+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
8+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
9+
import static datadog.trace.instrumentation.jakartaws.WebServiceDecorator.DECORATE;
10+
import static datadog.trace.instrumentation.jakartaws.WebServiceDecorator.JAKARTA_WS_REQUEST;
11+
import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy;
12+
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
13+
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
14+
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
15+
import static net.bytebuddy.matcher.ElementMatchers.not;
16+
17+
import com.google.auto.service.AutoService;
18+
import datadog.trace.agent.tooling.Instrumenter;
19+
import datadog.trace.agent.tooling.InstrumenterModule;
20+
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
21+
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
22+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
23+
import jakarta.jws.WebService;
24+
import net.bytebuddy.asm.Advice;
25+
import net.bytebuddy.description.type.TypeDescription;
26+
import net.bytebuddy.matcher.ElementMatcher;
27+
28+
@AutoService(InstrumenterModule.class)
29+
public final class WebServiceInstrumentation extends InstrumenterModule.Tracing
30+
implements Instrumenter.ForBootstrap, Instrumenter.ForTypeHierarchy {
31+
private static final String WEB_SERVICE_ANNOTATION_NAME = "jakarta.jws.WebService";
32+
33+
public WebServiceInstrumentation() {
34+
super("jakarta-ws");
35+
}
36+
37+
@Override
38+
protected boolean defaultEnabled() {
39+
return true;
40+
}
41+
42+
@Override
43+
public String hierarchyMarkerType() {
44+
return null; // bootstrap type
45+
}
46+
47+
@Override
48+
public ElementMatcher<TypeDescription> hierarchyMatcher() {
49+
return hasSuperType(declaresAnnotation(named(WEB_SERVICE_ANNOTATION_NAME)));
50+
}
51+
52+
@Override
53+
public String[] helperClassNames() {
54+
return new String[] {
55+
packageName + ".WebServiceDecorator",
56+
};
57+
}
58+
59+
@Override
60+
public void methodAdvice(MethodTransformer transformer) {
61+
transformer.applyAdvice(
62+
isMethod()
63+
.and(isPublic())
64+
.and(not(isStatic()))
65+
.and(
66+
hasSuperMethod(
67+
isDeclaredBy(declaresAnnotation(named(WEB_SERVICE_ANNOTATION_NAME))))),
68+
getClass().getName() + "$InvokeAdvice");
69+
}
70+
71+
public static final class InvokeAdvice {
72+
73+
@Advice.OnMethodEnter(suppress = Throwable.class)
74+
public static AgentScope beginRequest(
75+
@Advice.This Object thiz, @Advice.Origin("#m") String method) {
76+
final int callDepth = CallDepthThreadLocalMap.incrementCallDepth(WebService.class);
77+
if (callDepth > 0) {
78+
return null;
79+
}
80+
81+
AgentSpan span = startSpan(JAKARTA_WS_REQUEST);
82+
span.setMeasured(true);
83+
DECORATE.onJaxWsSpan(span, thiz.getClass(), method);
84+
DECORATE.afterStart(span);
85+
return activateSpan(span);
86+
}
87+
88+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
89+
public static void finishRequest(
90+
@Advice.Enter final AgentScope scope, @Advice.Thrown final Throwable error) {
91+
if (null == scope) {
92+
return;
93+
}
94+
95+
CallDepthThreadLocalMap.reset(WebService.class);
96+
97+
AgentSpan span = scope.span();
98+
if (null != error) {
99+
DECORATE.onError(span, error);
100+
}
101+
DECORATE.beforeFinish(span);
102+
scope.close();
103+
span.finish();
104+
}
105+
}
106+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import datadog.trace.agent.test.AgentTestRunner
2+
import datadog.trace.api.DDSpanTypes
3+
4+
import static org.junit.Assert.fail
5+
6+
class WebServiceTest extends AgentTestRunner {
7+
8+
@Override
9+
void configurePreAgent() {
10+
super.configurePreAgent()
11+
// todo figure out sysconfig
12+
// injectSysConfig("dd.integration.jax-ws.enabled", "true")
13+
injectSysConfig("dd.integration.jakarta-ws.enabled", "true")
14+
}
15+
16+
def "test successful interface request is traced"() {
17+
when:
18+
new TestService1Impl().send("success")
19+
20+
then:
21+
assertTraces(1) {
22+
trace(1) {
23+
span {
24+
operationName "jakarta-ws.request"
25+
resourceName "TestService1Impl.send"
26+
spanType DDSpanTypes.SOAP
27+
errored false
28+
parent()
29+
tags {
30+
"component" "jakarta-ws-endpoint"
31+
defaultTags()
32+
}
33+
}
34+
}
35+
}
36+
}
37+
38+
def "test successful class request is traced"() {
39+
when:
40+
new TestService2().send("success")
41+
42+
then:
43+
assertTraces(1) {
44+
trace(1) {
45+
span {
46+
operationName "jakarta-ws.request"
47+
resourceName "TestService2.send"
48+
spanType DDSpanTypes.SOAP
49+
errored false
50+
parent()
51+
tags {
52+
"component" "jakarta-ws-endpoint"
53+
defaultTags()
54+
}
55+
}
56+
}
57+
}
58+
}
59+
60+
def "test failing interface request is traced"() {
61+
when:
62+
try {
63+
new TestService1Impl().send("fail")
64+
fail("expected exception")
65+
} catch (IllegalArgumentException e) {
66+
// expected
67+
}
68+
69+
then:
70+
assertTraces(1) {
71+
trace(1) {
72+
span {
73+
operationName "jakarta-ws.request"
74+
resourceName "TestService1Impl.send"
75+
spanType DDSpanTypes.SOAP
76+
errored true
77+
parent()
78+
tags {
79+
"component" "jakarta-ws-endpoint"
80+
"error.message" "bad request"
81+
"error.type" IllegalArgumentException.name
82+
"error.stack" String
83+
defaultTags()
84+
}
85+
}
86+
}
87+
}
88+
}
89+
90+
def "test failing class request is traced"() {
91+
when:
92+
try {
93+
new TestService2().send("fail")
94+
fail("expected exception")
95+
} catch (IllegalArgumentException e) {
96+
// expected
97+
}
98+
99+
then:
100+
assertTraces(1) {
101+
trace(1) {
102+
span {
103+
operationName "jakarta-ws.request"
104+
resourceName "TestService2.send"
105+
spanType DDSpanTypes.SOAP
106+
errored true
107+
parent()
108+
tags {
109+
"component" "jakarta-ws-endpoint"
110+
"error.message" "bad request"
111+
"error.type" IllegalArgumentException.name
112+
"error.stack" String
113+
defaultTags()
114+
}
115+
}
116+
}
117+
}
118+
}
119+
120+
def "test other methods are not traced"() {
121+
when:
122+
new TestService1Impl().random()
123+
new TestService2().random()
124+
125+
then:
126+
assertTraces(0) {}
127+
}
128+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import jakarta.jws.WebService;
2+
3+
@WebService
4+
public interface TestService1 {
5+
String send(String message);
6+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
public class TestService1Impl implements TestService1 {
2+
@Override
3+
public String send(final String request) {
4+
if ("fail".equals(request)) {
5+
throw new IllegalArgumentException("bad request");
6+
}
7+
return random();
8+
}
9+
10+
public String random() {
11+
return Double.toHexString(Math.random());
12+
}
13+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import jakarta.jws.WebService;
2+
3+
@WebService
4+
public class TestService2 {
5+
public String send(final String request) {
6+
if ("fail".equals(request)) {
7+
throw new IllegalArgumentException("bad request");
8+
}
9+
return random();
10+
}
11+
12+
protected String random() {
13+
return Double.toHexString(Math.random());
14+
}
15+
}

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ include ':dd-java-agent:instrumentation:jackson-core:jackson-core-2.16'
269269
include ':dd-java-agent:instrumentation:jacoco'
270270
include ':dd-java-agent:instrumentation:jakarta-jms'
271271
include ':dd-java-agent:instrumentation:jakarta-rs-annotations-3'
272+
include ':dd-java-agent:instrumentation:jakarta-ws-annotations'
272273
include ':dd-java-agent:instrumentation:java-concurrent'
273274
include ':dd-java-agent:instrumentation:java-concurrent:java-completablefuture'
274275
include ':dd-java-agent:instrumentation:java-concurrent:java-concurrent-21'

0 commit comments

Comments
 (0)