Skip to content

Commit 85ede52

Browse files
authored
Use instrumentation modules (#123)
* Use instrumentation module Signed-off-by: Pavol Loffay <[email protected]> * add more Signed-off-by: Pavol Loffay <[email protected]> * fix muzzle Signed-off-by: Pavol Loffay <[email protected]> * revert muzzle Signed-off-by: Pavol Loffay <[email protected]>
1 parent 9397c41 commit 85ede52

File tree

10 files changed

+292
-239
lines changed

10 files changed

+292
-239
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright The Hypertrace Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.opentelemetry.instrumentation.hypertrace.grpc.v1_5;
18+
19+
import com.google.auto.service.AutoService;
20+
import io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.client.GrpcClientBodyInstrumentation;
21+
import io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.server.GrpcServerBodyInstrumentation;
22+
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
23+
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
24+
import java.util.Arrays;
25+
import java.util.List;
26+
27+
@AutoService(InstrumentationModule.class)
28+
public class GrpcBodyInstrumentationModule extends InstrumentationModule {
29+
30+
public GrpcBodyInstrumentationModule() {
31+
super("grpc");
32+
}
33+
34+
@Override
35+
public int getOrder() {
36+
return 1;
37+
}
38+
39+
@Override
40+
public String[] helperClassNames() {
41+
return new String[] {
42+
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.GrpcSpanDecorator",
43+
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.InstrumentationName",
44+
packageName + ".client.GrpcClientInterceptor",
45+
packageName + ".client.GrpcClientInterceptor$TracingClientCall",
46+
packageName + ".client.GrpcClientInterceptor$TracingClientCallListener",
47+
packageName + ".server.GrpcServerInterceptor",
48+
packageName + ".server.GrpcServerInterceptor$TracingServerCall",
49+
packageName + ".server.GrpcServerInterceptor$TracingServerCallListener",
50+
packageName + ".server.NoopServerCallListener"
51+
};
52+
}
53+
54+
@Override
55+
public List<TypeInstrumentation> typeInstrumentations() {
56+
return Arrays.asList(new GrpcClientBodyInstrumentation(), new GrpcServerBodyInstrumentation());
57+
}
58+
}

instrumentation/grpc-1.5/src/main/java/io/opentelemetry/instrumentation/hypertrace/grpc/v1_5/client/GrpcClientBodyInstrumentation.java

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,16 @@
2222
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
2323
import static net.bytebuddy.matcher.ElementMatchers.named;
2424

25-
import com.google.auto.service.AutoService;
2625
import io.grpc.ClientInterceptor;
27-
import io.opentelemetry.javaagent.tooling.Instrumenter;
26+
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
2827
import java.util.List;
2928
import java.util.Map;
3029
import net.bytebuddy.asm.Advice;
3130
import net.bytebuddy.description.method.MethodDescription;
3231
import net.bytebuddy.description.type.TypeDescription;
3332
import net.bytebuddy.matcher.ElementMatcher;
3433

35-
@AutoService(Instrumenter.class)
36-
public class GrpcClientBodyInstrumentation extends Instrumenter.Default {
37-
38-
public GrpcClientBodyInstrumentation() {
39-
super("grpc");
40-
}
41-
42-
@Override
43-
public int getOrder() {
44-
return 1;
45-
}
46-
47-
@Override
48-
public String[] helperClassNames() {
49-
return new String[] {
50-
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.GrpcSpanDecorator",
51-
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.InstrumentationName",
52-
packageName + ".GrpcClientInterceptor",
53-
packageName + ".GrpcClientInterceptor$TracingClientCall",
54-
packageName + ".GrpcClientInterceptor$TracingClientCallListener"
55-
};
56-
}
34+
public class GrpcClientBodyInstrumentation implements TypeInstrumentation {
5735

5836
@Override
5937
public ElementMatcher<TypeDescription> typeMatcher() {

instrumentation/grpc-1.5/src/main/java/io/opentelemetry/instrumentation/hypertrace/grpc/v1_5/server/GrpcServerBodyInstrumentation.java

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,39 +20,16 @@
2020
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
2121
import static net.bytebuddy.matcher.ElementMatchers.named;
2222

23-
import com.google.auto.service.AutoService;
2423
import io.grpc.ServerInterceptor;
25-
import io.opentelemetry.javaagent.tooling.Instrumenter;
24+
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
2625
import java.util.List;
2726
import java.util.Map;
2827
import net.bytebuddy.asm.Advice;
2928
import net.bytebuddy.description.method.MethodDescription;
3029
import net.bytebuddy.description.type.TypeDescription;
3130
import net.bytebuddy.matcher.ElementMatcher;
3231

33-
@AutoService(Instrumenter.class)
34-
public class GrpcServerBodyInstrumentation extends Instrumenter.Default {
35-
36-
public GrpcServerBodyInstrumentation() {
37-
super("grpc");
38-
}
39-
40-
@Override
41-
public int getOrder() {
42-
return 1;
43-
}
44-
45-
@Override
46-
public String[] helperClassNames() {
47-
return new String[] {
48-
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.GrpcSpanDecorator",
49-
"io.opentelemetry.instrumentation.hypertrace.grpc.v1_5.InstrumentationName",
50-
packageName + ".GrpcServerInterceptor",
51-
packageName + ".GrpcServerInterceptor$TracingServerCall",
52-
packageName + ".GrpcServerInterceptor$TracingServerCallListener",
53-
packageName + ".NoopServerCallListener"
54-
};
55-
}
32+
public class GrpcServerBodyInstrumentation implements TypeInstrumentation {
5633

5734
@Override
5835
public ElementMatcher<TypeDescription> typeMatcher() {
Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
2323

2424
import com.google.auto.service.AutoService;
25-
import io.opentelemetry.javaagent.tooling.Instrumenter;
25+
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
26+
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
27+
import java.util.Collections;
28+
import java.util.List;
2629
import java.util.Map;
2730
import net.bytebuddy.asm.Advice;
2831
import net.bytebuddy.description.method.MethodDescription;
@@ -31,10 +34,10 @@
3134
import okhttp3.Interceptor;
3235
import okhttp3.OkHttpClient;
3336

34-
@AutoService(Instrumenter.class)
35-
public class OkHttp3BodyInstrumentation extends Instrumenter.Default {
37+
@AutoService(InstrumentationModule.class)
38+
public class OkHttp3BodyInstrumentationModule extends InstrumentationModule {
3639

37-
public OkHttp3BodyInstrumentation() {
40+
public OkHttp3BodyInstrumentationModule() {
3841
super(InstrumentationName.INSTRUMENTATION_NAME[0], InstrumentationName.INSTRUMENTATION_NAME[1]);
3942
}
4043

@@ -44,22 +47,29 @@ public int getOrder() {
4447
}
4548

4649
@Override
47-
public ElementMatcher<TypeDescription> typeMatcher() {
48-
return named("okhttp3.OkHttpClient");
50+
public String[] helperClassNames() {
51+
return new String[] {
52+
packageName + ".InstrumentationName", packageName + ".OkHttpTracingInterceptor",
53+
};
4954
}
5055

5156
@Override
52-
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
53-
return singletonMap(
54-
isConstructor().and(takesArgument(0, named("okhttp3.OkHttpClient$Builder"))),
55-
OkHttp3BodyInstrumentation.class.getName() + "$OkHttp3Advice");
57+
public List<TypeInstrumentation> typeInstrumentations() {
58+
return Collections.singletonList(new OkHttp3BodyInstrumentation());
5659
}
5760

58-
@Override
59-
public String[] helperClassNames() {
60-
return new String[] {
61-
packageName + ".InstrumentationName", packageName + ".OkHttpTracingInterceptor",
62-
};
61+
private static final class OkHttp3BodyInstrumentation implements TypeInstrumentation {
62+
@Override
63+
public ElementMatcher<TypeDescription> typeMatcher() {
64+
return named("okhttp3.OkHttpClient");
65+
}
66+
67+
@Override
68+
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
69+
return singletonMap(
70+
isConstructor().and(takesArgument(0, named("okhttp3.OkHttpClient$Builder"))),
71+
OkHttp3BodyInstrumentationModule.class.getName() + "$OkHttp3Advice");
72+
}
6373
}
6474

6575
public static class OkHttp3Advice {

instrumentation/servlet/servlet-2.3/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ muzzle {
1414
fail {
1515
group = "javax.servlet"
1616
module = "javax.servlet-api"
17-
versions = "(,)"
17+
versions = "(3.0.1,)"
1818
}
1919
}
2020

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
import io.opentelemetry.api.trace.Span;
3030
import io.opentelemetry.instrumentation.hypertrace.servlet.common.ServletSpanDecorator;
3131
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
32-
import io.opentelemetry.javaagent.tooling.Instrumenter;
32+
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
33+
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
34+
import java.util.Collections;
3335
import java.util.Enumeration;
3436
import java.util.HashMap;
3537
import java.util.List;
@@ -52,10 +54,10 @@
5254
* version 2.2, however this implementation uses request and response wrappers that were introduced
5355
* in 2.3.
5456
*/
55-
@AutoService(Instrumenter.class)
56-
public class Servlet2BodyInstrumentation extends Instrumenter.Default {
57+
@AutoService(InstrumentationModule.class)
58+
public class Servlet2BodyInstrumentationModule extends InstrumentationModule {
5759

58-
public Servlet2BodyInstrumentation() {
60+
public Servlet2BodyInstrumentationModule() {
5961
super(InstrumentationName.INSTRUMENTATION_NAME[0], InstrumentationName.INSTRUMENTATION_NAME[1]);
6062
}
6163

@@ -64,21 +66,6 @@ public int getOrder() {
6466
return 1;
6567
}
6668

67-
// this is required to make sure servlet 2 instrumentation won't apply to servlet 3
68-
@Override
69-
public ElementMatcher<ClassLoader> classLoaderMatcher() {
70-
// Request/response wrappers are available since servlet 2.3!
71-
return hasClassesNamed(
72-
"javax.servlet.http.HttpServlet", "javax.servlet.http.HttpServletRequestWrapper")
73-
.and(not(hasClassesNamed("javax.servlet.AsyncEvent", "javax.servlet.AsyncListener")));
74-
}
75-
76-
@Override
77-
public ElementMatcher<TypeDescription> typeMatcher() {
78-
return safeHasSuperType(
79-
namedOneOf("javax.servlet.FilterChain", "javax.servlet.http.HttpServlet"));
80-
}
81-
8269
@Override
8370
public Map<String, String> contextStore() {
8471
return singletonMap("javax.servlet.ServletResponse", Integer.class.getName());
@@ -102,13 +89,36 @@ public String[] helperClassNames() {
10289
}
10390

10491
@Override
105-
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
106-
return singletonMap(
107-
namedOneOf("doFilter", "service")
108-
.and(takesArgument(0, named("javax.servlet.ServletRequest")))
109-
.and(takesArgument(1, named("javax.servlet.ServletResponse")))
110-
.and(isPublic()),
111-
Filter2Advice.class.getName());
92+
public List<TypeInstrumentation> typeInstrumentations() {
93+
return Collections.singletonList(new Servlet2BodyInstrumentation());
94+
}
95+
96+
public static class Servlet2BodyInstrumentation implements TypeInstrumentation {
97+
98+
// this is required to make sure servlet 2 instrumentation won't apply to servlet 3
99+
@Override
100+
public ElementMatcher<ClassLoader> classLoaderMatcher() {
101+
// Request/response wrappers are available since servlet 2.3!
102+
return hasClassesNamed(
103+
"javax.servlet.http.HttpServlet", "javax.servlet.http.HttpServletRequestWrapper")
104+
.and(not(hasClassesNamed("javax.servlet.AsyncEvent", "javax.servlet.AsyncListener")));
105+
}
106+
107+
@Override
108+
public ElementMatcher<TypeDescription> typeMatcher() {
109+
return safeHasSuperType(
110+
namedOneOf("javax.servlet.FilterChain", "javax.servlet.http.HttpServlet"));
111+
}
112+
113+
@Override
114+
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
115+
return singletonMap(
116+
namedOneOf("doFilter", "service")
117+
.and(takesArgument(0, named("javax.servlet.ServletRequest")))
118+
.and(takesArgument(1, named("javax.servlet.ServletResponse")))
119+
.and(isPublic()),
120+
Filter2Advice.class.getName());
121+
}
112122
}
113123

114124
public static class Filter2Advice {

0 commit comments

Comments
 (0)