Skip to content

Commit ca3c685

Browse files
authored
indy instrumentation - leftovers migration (#13074)
1 parent dc8338c commit ca3c685

File tree

22 files changed

+268
-285
lines changed

22 files changed

+268
-285
lines changed

instrumentation/internal/internal-lambda-java9/javaagent/build.gradle.kts

-20
This file was deleted.

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

-30
This file was deleted.

instrumentation/internal/internal-lambda/javaagent/build.gradle.kts

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ plugins {
44

55
dependencies {
66
compileOnly(project(":javaagent-bootstrap"))
7-
implementation(project(":instrumentation:internal:internal-lambda-java9:javaagent"))
87

98
testImplementation(project(":javaagent-bootstrap"))
109
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void visitMethodInsn(
128128
Opcodes.GETFIELD, slashClassName, "targetClass", "Ljava/lang/Class;");
129129
mv.visitMethodInsn(
130130
Opcodes.INVOKESTATIC,
131-
Type.getInternalName(LambdaTransformer.class),
131+
Type.getInternalName(LambdaTransformerHelper.class),
132132
"transform",
133133
"([BLjava/lang/String;Ljava/lang/Class;)[B",
134134
false);

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

+8-12
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
import com.google.auto.service.AutoService;
1111
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
13+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1314
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
14-
import java.util.ArrayList;
15+
import java.util.Collections;
1516
import java.util.List;
16-
import net.bytebuddy.utility.JavaModule;
1717

1818
@AutoService(InstrumentationModule.class)
19-
public class LambdaInstrumentationModule extends InstrumentationModule {
19+
public class LambdaInstrumentationModule extends InstrumentationModule
20+
implements ExperimentalInstrumentationModule {
2021
public LambdaInstrumentationModule() {
2122
super("internal-lambda");
2223
}
@@ -28,21 +29,16 @@ public boolean defaultEnabled(ConfigProperties config) {
2829
}
2930

3031
@Override
31-
public boolean isIndyModule() {
32-
return false;
32+
public List<String> injectedClassNames() {
33+
return Collections.singletonList(
34+
"io.opentelemetry.javaagent.instrumentation.internal.lambda.LambdaTransformerHelper");
3335
}
3436

3537
@Override
3638
public List<String> getAdditionalHelperClassNames() {
3739
// this instrumentation uses ASM not ByteBuddy so muzzle doesn't automatically add helper
3840
// classes
39-
List<String> classNames = new ArrayList<>();
40-
classNames.add("io.opentelemetry.javaagent.instrumentation.internal.lambda.LambdaTransformer");
41-
if (JavaModule.isSupported()) {
42-
classNames.add(
43-
"io.opentelemetry.javaagent.instrumentation.internal.lambda.Java9LambdaTransformer");
44-
}
45-
return classNames;
41+
return injectedClassNames();
4642
}
4743

4844
@Override

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

-62
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.internal.lambda;
7+
8+
import io.opentelemetry.javaagent.bootstrap.InjectedClassHelper;
9+
import io.opentelemetry.javaagent.bootstrap.LambdaTransformer;
10+
import io.opentelemetry.javaagent.bootstrap.LambdaTransformerHolder;
11+
12+
/** Helper class for transforming lambda class bytes. */
13+
public final class LambdaTransformerHelper {
14+
15+
private LambdaTransformerHelper() {}
16+
17+
/**
18+
* Called from {@code java.lang.invoke.InnerClassLambdaMetafactory} to transform lambda class
19+
* bytes.
20+
*/
21+
@SuppressWarnings("unused")
22+
public static byte[] transform(byte[] classBytes, String slashClassName, Class<?> targetClass) {
23+
// Skip transforming lambdas of injected helper classes.
24+
if (InjectedClassHelper.isHelperClass(targetClass)) {
25+
return classBytes;
26+
}
27+
LambdaTransformer transformer = LambdaTransformerHolder.getLambdaTransformer();
28+
if (transformer == null) {
29+
return classBytes;
30+
}
31+
32+
try {
33+
byte[] result = transformer.transform(slashClassName, targetClass, classBytes);
34+
if (result != null) {
35+
classBytes = result;
36+
}
37+
} catch (Throwable throwable) {
38+
// sun.instrument.TransformerManager catches Throwable from ClassFileTransformer and ignores
39+
// it, we do the same.
40+
}
41+
return classBytes;
42+
}
43+
}

instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/AnnotationInstrumentationHelper.java

+14-11
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,20 @@
1515
import kotlin.coroutines.Continuation;
1616
import kotlin.coroutines.intrinsics.IntrinsicsKt;
1717

18+
/**
19+
* Instrumentation helper that is called through bytecode instrumentation. When using invokedynamic
20+
* instrumentation this class is called through an injected proxy, and thus it should not pull any
21+
* other class references than the ones that are already present in the target classloader or the
22+
* bootstrap classloader. This is why the {@link MethodRequest} class is here passed as an {@link
23+
* Object} as it allows to avoid having to inject extra classes in the target classloader
24+
*/
25+
@SuppressWarnings("unused") // methods calls injected through bytecode instrumentation
1826
public final class AnnotationInstrumentationHelper {
1927

2028
private static final VirtualField<Continuation<?>, Context> contextField =
2129
VirtualField.find(Continuation.class, Context.class);
2230

23-
public static MethodRequest createMethodRequest(
31+
public static Object createMethodRequest(
2432
Class<?> declaringClass, String methodName, String withSpanValue, String spanKindString) {
2533
SpanKind spanKind = SpanKind.INTERNAL;
2634
if (spanKindString != null) {
@@ -34,11 +42,10 @@ public static MethodRequest createMethodRequest(
3442
return MethodRequest.create(declaringClass, methodName, withSpanValue, spanKind);
3543
}
3644

37-
public static Context enterCoroutine(
38-
int label, Continuation<?> continuation, MethodRequest request) {
45+
public static Context enterCoroutine(int label, Continuation<?> continuation, Object request) {
3946
// label 0 means that coroutine is started, any other label means that coroutine is resumed
4047
if (label == 0) {
41-
Context context = instrumenter().start(Context.current(), request);
48+
Context context = instrumenter().start(Context.current(), (MethodRequest) request);
4249
// null continuation means that this method is not going to be resumed, and we don't need to
4350
// store the context
4451
if (continuation != null) {
@@ -55,18 +62,14 @@ public static Scope openScope(Context context) {
5562
}
5663

5764
public static void exitCoroutine(
58-
Object result,
59-
MethodRequest request,
60-
Continuation<?> continuation,
61-
Context context,
62-
Scope scope) {
65+
Object result, Object request, Continuation<?> continuation, Context context, Scope scope) {
6366
exitCoroutine(null, result, request, continuation, context, scope);
6467
}
6568

6669
public static void exitCoroutine(
6770
Throwable error,
6871
Object result,
69-
MethodRequest request,
72+
Object request,
7073
Continuation<?> continuation,
7174
Context context,
7275
Scope scope) {
@@ -78,7 +81,7 @@ public static void exitCoroutine(
7881
// end the span when this method can not be resumed (coroutine is null) or if it has reached
7982
// final state (returns anything else besides COROUTINE_SUSPENDED)
8083
if (continuation == null || result != IntrinsicsKt.getCOROUTINE_SUSPENDED()) {
81-
instrumenter().end(context, request, null, error);
84+
instrumenter().end(context, (MethodRequest) request, null, error);
8285
}
8386
}
8487

instrumentation/kotlinx-coroutines/kotlinx-coroutines-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kotlinxcoroutines/instrumentationannotations/AnnotationInstrumentationModule.java

+18-7
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@
1111
import com.google.auto.service.AutoService;
1212
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1313
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
14+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
15+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector;
16+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode;
1417
import java.util.List;
1518
import net.bytebuddy.matcher.ElementMatcher;
1619

1720
/** Instrumentation for methods annotated with {@code WithSpan} annotation. */
1821
@AutoService(InstrumentationModule.class)
19-
public class AnnotationInstrumentationModule extends InstrumentationModule {
22+
public class AnnotationInstrumentationModule extends InstrumentationModule
23+
implements ExperimentalInstrumentationModule {
2024

2125
public AnnotationInstrumentationModule() {
2226
super(
@@ -26,12 +30,6 @@ public AnnotationInstrumentationModule() {
2630
"opentelemetry-instrumentation-annotations");
2731
}
2832

29-
@Override
30-
public boolean isIndyModule() {
31-
// needs helper classes in the same class loader
32-
return false;
33-
}
34-
3533
@Override
3634
public int order() {
3735
// Run first to ensure other automatic instrumentation is added after and therefore is executed
@@ -50,4 +48,17 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
5048
public List<TypeInstrumentation> typeInstrumentations() {
5149
return singletonList(new WithSpanInstrumentation());
5250
}
51+
52+
@Override
53+
public void injectClasses(ClassInjector injector) {
54+
// AnnotationInstrumentationHelper is called directly in the instrumented bytecode.
55+
//
56+
// With invokedynamic instrumentation a proxy class can be used as long as it does not pull
57+
// extra types in the method signatures (which would require those types to also be available
58+
// in the instrumented code).
59+
injector
60+
.proxyBuilder(
61+
"io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.instrumentationannotations.AnnotationInstrumentationHelper")
62+
.inject(InjectionMode.CLASS_ONLY);
63+
}
5364
}

0 commit comments

Comments
 (0)