Skip to content

Commit 7d22597

Browse files
authored
Transform inline advice to delegating advice and test indy modules (#9508)
1 parent a347454 commit 7d22597

File tree

80 files changed

+1290
-49
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1290
-49
lines changed

.github/workflows/build-pull-request.yml

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ jobs:
2121
with:
2222
cache-read-only: true
2323

24+
test-indy:
25+
uses: ./.github/workflows/reusable-test-indy.yml
26+
with:
27+
cache-read-only: true
28+
2429
muzzle:
2530
uses: ./.github/workflows/reusable-muzzle.yml
2631
with:
+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
name: Reusable - Test latest deps
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
cache-read-only:
7+
type: boolean
8+
required: false
9+
no-build-cache:
10+
type: boolean
11+
required: false
12+
secrets:
13+
GRADLE_ENTERPRISE_ACCESS_KEY:
14+
required: false
15+
GE_CACHE_USERNAME:
16+
required: false
17+
GE_CACHE_PASSWORD:
18+
required: false
19+
20+
jobs:
21+
test-indy:
22+
name: testIndy${{ matrix.test-partition }}
23+
if: ${{ contains(github.event.pull_request.labels.*.name, 'test indy') }}
24+
runs-on: ubuntu-latest
25+
strategy:
26+
matrix:
27+
test-partition:
28+
- 0
29+
- 1
30+
- 2
31+
- 3
32+
fail-fast: false
33+
steps:
34+
- uses: actions/checkout@v4
35+
36+
- name: Free disk space
37+
run: .github/scripts/gha-free-disk-space.sh
38+
39+
- name: Set up JDK for running Gradle
40+
uses: actions/setup-java@v3
41+
with:
42+
distribution: temurin
43+
java-version: 17.0.6
44+
45+
- name: Increase gradle daemon heap size
46+
run: |
47+
sed -i "s/org.gradle.jvmargs=/org.gradle.jvmargs=-Xmx3g /" gradle.properties
48+
49+
# vaadin 14 tests fail with node 18
50+
- name: Set up Node
51+
uses: actions/setup-node@v3
52+
with:
53+
node-version: 16
54+
55+
# vaadin tests use pnpm
56+
- name: Cache pnpm modules
57+
uses: actions/cache@v3
58+
with:
59+
path: ~/.pnpm-store
60+
key: ${{ runner.os }}-test-latest-cache-pnpm-modules
61+
62+
- name: List tests
63+
env:
64+
GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
65+
GE_CACHE_USERNAME: ${{ secrets.GE_CACHE_USERNAME }}
66+
GE_CACHE_PASSWORD: ${{ secrets.GE_CACHE_PASSWORD }}
67+
uses: gradle/gradle-build-action@v2
68+
with:
69+
arguments: >
70+
check -x spotlessCheck
71+
listTestsInPartition
72+
-PtestPartition=${{ matrix.test-partition }}
73+
cache-read-only: true
74+
75+
- name: Set test tasks
76+
run: |
77+
echo "test-tasks=$(cat test-tasks.txt | xargs echo | sed 's/\n/ /g')" >> $GITHUB_ENV
78+
79+
- name: Test
80+
uses: gradle/gradle-build-action@v2
81+
env:
82+
GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}
83+
GE_CACHE_USERNAME: ${{ secrets.GE_CACHE_USERNAME }}
84+
GE_CACHE_PASSWORD: ${{ secrets.GE_CACHE_PASSWORD }}
85+
with:
86+
arguments: >
87+
${{ env.test-tasks }}
88+
-PtestIndy=true
89+
${{ inputs.no-build-cache && ' --no-build-cache' || '' }}
90+
cache-read-only: ${{ inputs.cache-read-only }}
91+
# gradle enterprise is used for the build cache
92+
gradle-home-cache-excludes: caches/build-cache-1

conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-testing.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class JavaagentTestArgumentsProvider(
8686
// in smoke tests instead.
8787
"-Dotel.javaagent.add-thread-details=false",
8888
"-Dotel.metrics.exporter=otlp",
89+
"-Dotel.javaagent.experimental.indy=${findProperty("testIndy") == "true"}",
8990
// suppress repeated logging of "No metric data to export - skipping export."
9091
// since PeriodicMetricReader is configured with a short interval
9192
"-Dio.opentelemetry.javaagent.slf4j.simpleLogger.log.io.opentelemetry.sdk.metrics.export.PeriodicMetricReader=INFO",

instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinPoolInstrumentation.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ public void transform(TypeTransformer transformer) {
4848
public static class SetAkkaForkJoinStateAdvice {
4949

5050
@Advice.OnMethodEnter(suppress = Throwable.class)
51-
public static PropagatedContext enterJobSubmit(
52-
@Advice.Argument(value = 0, readOnly = false) ForkJoinTask<?> task) {
51+
public static PropagatedContext enterJobSubmit(@Advice.Argument(0) ForkJoinTask<?> task) {
5352
Context context = Java8BytecodeBridge.currentContext();
5453
if (ExecutorAdviceHelper.shouldPropagateContext(context, task)) {
5554
VirtualField<ForkJoinTask<?>, PropagatedContext> virtualField =

instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AbstractAwsSdkInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public boolean isHelperClass(String className) {
2828
return className.startsWith("io.opentelemetry.contrib.awsxray.");
2929
}
3030

31+
@Override
32+
public boolean isIndyModule() {
33+
return false;
34+
}
35+
3136
@Override
3237
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3338
// We don't actually transform it but want to make sure we only apply the instrumentation when

instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ public boolean isHelperClass(String className) {
2323
return className.startsWith("io.opentelemetry.contrib.awsxray.");
2424
}
2525

26+
@Override
27+
public boolean isIndyModule() {
28+
return false;
29+
}
30+
2631
@Override
2732
public List<TypeInstrumentation> typeInstrumentations() {
2833
return asList(

instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AbstractAwsSdkInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public boolean isHelperClass(String className) {
2727
return className.startsWith("io.opentelemetry.contrib.awsxray.");
2828
}
2929

30+
@Override
31+
public boolean isIndyModule() {
32+
return false;
33+
}
34+
3035
@Override
3136
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3237
// We don't actually transform it but want to make sure we only apply the instrumentation when

instrumentation/azure-core/azure-core-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_14/AzureSdkInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public void registerHelperResources(HelperResourceBuilder helperResourceBuilder)
3535
"azure-core-1.14/META-INF/services/com.azure.core.util.tracing.Tracer");
3636
}
3737

38+
@Override
39+
public boolean isIndyModule() {
40+
return false;
41+
}
42+
3843
@Override
3944
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
4045
return hasClassesNamed("com.azure.core.util.tracing.Tracer")

instrumentation/azure-core/azure-core-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_19/AzureSdkInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public void registerHelperResources(HelperResourceBuilder helperResourceBuilder)
3535
"azure-core-1.19/META-INF/services/com.azure.core.util.tracing.Tracer");
3636
}
3737

38+
@Override
39+
public boolean isIndyModule() {
40+
return false;
41+
}
42+
3843
@Override
3944
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
4045
// this class was introduced in azure-core 1.19

instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public void registerHelperResources(HelperResourceBuilder helperResourceBuilder)
3737
"azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer");
3838
}
3939

40+
@Override
41+
public boolean isIndyModule() {
42+
return false;
43+
}
44+
4045
@Override
4146
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
4247
// this class was introduced in azure-core 1.36

instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ public boolean isHelperClass(String className) {
2323
return className.equals("rx.__OpenTelemetryTracingUtil");
2424
}
2525

26+
@Override
27+
public boolean isIndyModule() {
28+
// rx.__OpenTelemetryTracingUtil is used for accessing a package private field
29+
return false;
30+
}
31+
2632
@Override
2733
public List<TypeInstrumentation> typeInstrumentations() {
2834
return asList(new CouchbaseBucketInstrumentation(), new CouchbaseClusterInstrumentation());

instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchApiClientInstrumentationModule.java

+7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3030
return not(hasClassesNamed("co.elastic.clients.transport.instrumentation.Instrumentation"));
3131
}
3232

33+
@Override
34+
public boolean isIndyModule() {
35+
// java.lang.ClassCastException: class
36+
// io.opentelemetry.javaagent.shaded.instrumentation.elasticsearch.rest.internal.ElasticsearchEndpointDefinition cannot be cast to class io.opentelemetry.javaagent.shaded.instrumentation.elasticsearch.rest.internal.ElasticsearchEndpointDefinition (io.opentelemetry.javaagent.shaded.instrumentation.elasticsearch.rest.internal.ElasticsearchEndpointDefinition is in unnamed module of loader io.opentelemetry.javaagent.tooling.instrumentation.indy.InstrumentationModuleClassLoader @6baee63b; io.opentelemetry.javaagent.shaded.instrumentation.elasticsearch.rest.internal.ElasticsearchEndpointDefinition is in unnamed module of loader 'app')
37+
return false;
38+
}
39+
3340
@Override
3441
public List<TypeInstrumentation> typeInstrumentations() {
3542
return asList(

instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7InstrumentationModule.java

+6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3232
.and(not(hasClassesNamed("co.elastic.clients.transport.instrumentation.Instrumentation")));
3333
}
3434

35+
@Override
36+
public boolean isIndyModule() {
37+
// shares a virtual field with elasticsearch-api-client
38+
return false;
39+
}
40+
3541
@Override
3642
public List<TypeInstrumentation> typeInstrumentations() {
3743
return singletonList(new RestClientInstrumentation());

instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/RestClientInstrumentation.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public static void onEnter(
8080

8181
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
8282
public static void stopSpan(
83-
@Advice.Return(readOnly = false) Response response,
83+
@Advice.Return Response response,
8484
@Advice.Thrown Throwable throwable,
8585
@Advice.Local("otelRequest") ElasticsearchRestRequest otelRequest,
8686
@Advice.Local("otelContext") Context context,

instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/ExecutorsInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ public ExecutorsInstrumentationModule() {
1919
super("executors");
2020
}
2121

22+
@Override
23+
public boolean isIndyModule() {
24+
return false;
25+
}
26+
2227
@Override
2328
public List<TypeInstrumentation> typeInstrumentations() {
2429
return asList(

instrumentation/executors/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/executors/JavaExecutorInstrumentation.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ public static void exitJobSubmit(
114114
public static class SetJavaForkJoinStateAdvice {
115115

116116
@Advice.OnMethodEnter(suppress = Throwable.class)
117-
public static PropagatedContext enterJobSubmit(
118-
@Advice.Argument(value = 0, readOnly = false) ForkJoinTask<?> task) {
117+
public static PropagatedContext enterJobSubmit(@Advice.Argument(0) ForkJoinTask<?> task) {
119118
Context context = Java8BytecodeBridge.currentContext();
120119
if (ExecutorAdviceHelper.shouldPropagateContext(context, task)) {
121120
VirtualField<ForkJoinTask<?>, PropagatedContext> virtualField =
@@ -165,8 +164,7 @@ public static void exitJobSubmit(
165164
public static class SetCallableStateAdvice {
166165

167166
@Advice.OnMethodEnter(suppress = Throwable.class)
168-
public static PropagatedContext enterJobSubmit(
169-
@Advice.Argument(value = 0, readOnly = false) Callable<?> task) {
167+
public static PropagatedContext enterJobSubmit(@Advice.Argument(0) Callable<?> task) {
170168
Context context = Java8BytecodeBridge.currentContext();
171169
if (ExecutorAdviceHelper.shouldPropagateContext(context, task)) {
172170
VirtualField<Callable<?>, PropagatedContext> virtualField =
@@ -195,7 +193,7 @@ public static class SetCallableStateForCallableCollectionAdvice {
195193

196194
@Advice.OnMethodEnter(suppress = Throwable.class)
197195
public static Collection<?> submitEnter(
198-
@Advice.Argument(value = 0, readOnly = false) Collection<? extends Callable<?>> tasks) {
196+
@Advice.Argument(0) Collection<? extends Callable<?>> tasks) {
199197
if (tasks == null) {
200198
return Collections.emptyList();
201199
}

instrumentation/guava-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/guava/v10_0/GuavaListenableFutureInstrumentation.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ public static void onConstruction() {
4949
public static class AddListenerAdvice {
5050

5151
@Advice.OnMethodEnter(suppress = Throwable.class)
52-
public static PropagatedContext addListenerEnter(
53-
@Advice.Argument(value = 0, readOnly = false) Runnable task) {
52+
public static PropagatedContext addListenerEnter(@Advice.Argument(0) Runnable task) {
5453
Context context = Java8BytecodeBridge.currentContext();
5554
if (ExecutorAdviceHelper.shouldPropagateContext(context, task)) {
5655
VirtualField<Runnable, PropagatedContext> virtualField =

instrumentation/hibernate/hibernate-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_0/HibernateInstrumentationModule.java

+7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3030
"org.hibernate.Criteria");
3131
}
3232

33+
@Override
34+
public boolean isIndyModule() {
35+
// shares classes with hibernate-procedure-call-4.3, these classes should be in the same class
36+
// loader
37+
return false;
38+
}
39+
3340
@Override
3441
public List<TypeInstrumentation> typeInstrumentations() {
3542
return asList(

instrumentation/hibernate/hibernate-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v6_0/HibernateInstrumentationModule.java

+7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
2828
"org.hibernate.query.spi.SqmQuery");
2929
}
3030

31+
@Override
32+
public boolean isIndyModule() {
33+
// shares classes with hibernate-procedure-call-4.3, these classes should be in the same class
34+
// loader
35+
return false;
36+
}
37+
3138
@Override
3239
public List<TypeInstrumentation> typeInstrumentations() {
3340
return asList(

instrumentation/hibernate/hibernate-procedure-call-4.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/v4_3/HibernateInstrumentationModule.java

+7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
2525
return hasClassesNamed("org.hibernate.procedure.ProcedureCall");
2626
}
2727

28+
@Override
29+
public boolean isIndyModule() {
30+
// uses SessionInfo class from hibernate common which is now in separate class loader for all
31+
// instrumentations
32+
return false;
33+
}
34+
2835
@Override
2936
public List<TypeInstrumentation> typeInstrumentations() {
3037
return asList(new ProcedureCallInstrumentation(), new SessionInstrumentation());

instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixInstrumentationModule.java

+6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ public boolean isHelperClass(String className) {
2424
return className.equals("rx.__OpenTelemetryTracingUtil");
2525
}
2626

27+
@Override
28+
public boolean isIndyModule() {
29+
// rx.__OpenTelemetryTracingUtil is used for accessing a package private field
30+
return false;
31+
}
32+
2733
@Override
2834
public List<TypeInstrumentation> typeInstrumentations() {
2935
return singletonList(new HystrixCommandInstrumentation());

instrumentation/internal/internal-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public void registerHelperResources(HelperResourceBuilder helperResourceBuilder)
3636
"test-resources/test-resource.txt", "test-resources/test-resource-2.txt");
3737
}
3838

39+
@Override
40+
public boolean isIndyModule() {
41+
return false;
42+
}
43+
3944
public static class TestTypeInstrumentation implements TypeInstrumentation {
4045
@Override
4146
public ElementMatcher<ClassLoader> classLoaderOptimization() {

instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public boolean defaultEnabled(ConfigProperties config) {
2525
return true;
2626
}
2727

28+
@Override
29+
public boolean isIndyModule() {
30+
return false;
31+
}
32+
2833
@Override
2934
public boolean isHelperClass(String className) {
3035
return className.equals("io.opentelemetry.javaagent.tooling.Constants");

instrumentation/internal/internal-lambda/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/lambda/LambdaInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public boolean defaultEnabled(ConfigProperties config) {
2727
return true;
2828
}
2929

30+
@Override
31+
public boolean isIndyModule() {
32+
return false;
33+
}
34+
3035
@Override
3136
public List<String> getAdditionalHelperClassNames() {
3237
// this instrumentation uses ASM not ByteBuddy so muzzle doesn't automatically add helper

instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionInstrumentationModule.java

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public boolean defaultEnabled(ConfigProperties config) {
2525
return true;
2626
}
2727

28+
@Override
29+
public boolean isIndyModule() {
30+
return false;
31+
}
32+
2833
@Override
2934
public List<TypeInstrumentation> typeInstrumentations() {
3035
return asList(new ClassInstrumentation(), new ReflectionInstrumentation());

0 commit comments

Comments
 (0)