Add supported way to add additional helper classes to instrumentation without interfering with muzzle (#4302)
* Add supported way to add additional helper classes to instrumentation without interfering with muzzle * Better javadoc
This commit is contained in:
parent
fda4779127
commit
0683371110
|
@ -24,7 +24,8 @@ public class LambdaInstrumentationModule extends InstrumentationModule {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getMuzzleHelperClassNames() {
|
@Override
|
||||||
|
public List<String> getAdditionalHelperClassNames() {
|
||||||
// this instrumentation uses ASM not ByteBuddy so muzzle doesn't automatically add helper
|
// this instrumentation uses ASM not ByteBuddy so muzzle doesn't automatically add helper
|
||||||
// classes
|
// classes
|
||||||
return singletonList(
|
return singletonList(
|
||||||
|
|
|
@ -49,7 +49,8 @@ public class MethodInstrumentationModule extends InstrumentationModule {
|
||||||
|
|
||||||
// the default configuration has empty "otel.instrumentation.methods.include", and so doesn't
|
// the default configuration has empty "otel.instrumentation.methods.include", and so doesn't
|
||||||
// generate any TypeInstrumentation for muzzle to analyze
|
// generate any TypeInstrumentation for muzzle to analyze
|
||||||
public List<String> getMuzzleHelperClassNames() {
|
@Override
|
||||||
|
public List<String> getAdditionalHelperClassNames() {
|
||||||
return typeInstrumentations.isEmpty()
|
return typeInstrumentations.isEmpty()
|
||||||
? emptyList()
|
? emptyList()
|
||||||
: singletonList("io.opentelemetry.javaagent.instrumentation.methods.MethodSingletons");
|
: singletonList("io.opentelemetry.javaagent.instrumentation.methods.MethodSingletons");
|
||||||
|
|
|
@ -11,6 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.any;
|
||||||
import io.opentelemetry.instrumentation.api.config.Config;
|
import io.opentelemetry.instrumentation.api.config.Config;
|
||||||
import io.opentelemetry.javaagent.extension.Ordered;
|
import io.opentelemetry.javaagent.extension.Ordered;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -134,4 +135,19 @@ public abstract class InstrumentationModule implements Ordered {
|
||||||
|
|
||||||
/** Returns a list of all individual type instrumentation in this module. */
|
/** Returns a list of all individual type instrumentation in this module. */
|
||||||
public abstract List<TypeInstrumentation> typeInstrumentations();
|
public abstract List<TypeInstrumentation> typeInstrumentations();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of additional instrumentation helper classes, which are not automatically
|
||||||
|
* detected during compile time.
|
||||||
|
*
|
||||||
|
* <p>If your instrumentation module does not apply and you see warnings about missing classes in
|
||||||
|
* the logs, you may need to override this method and provide fully qualified classes names of
|
||||||
|
* helper classes that your instrumentation uses.
|
||||||
|
*
|
||||||
|
* <p>These helper classes will be injected into the application classloader after automatically
|
||||||
|
* detected ones.
|
||||||
|
*/
|
||||||
|
public List<String> getAdditionalHelperClassNames() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ public final class InstrumentationModuleInstaller {
|
||||||
return parentAgentBuilder;
|
return parentAgentBuilder;
|
||||||
}
|
}
|
||||||
List<String> helperClassNames =
|
List<String> helperClassNames =
|
||||||
InstrumentationModuleMuzzle.getMuzzleHelperClassNames(instrumentationModule);
|
InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule);
|
||||||
HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl();
|
HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl();
|
||||||
instrumentationModule.registerHelperResources(helperResourceBuilder);
|
instrumentationModule.registerHelperResources(helperResourceBuilder);
|
||||||
List<TypeInstrumentation> typeInstrumentations = instrumentationModule.typeInstrumentations();
|
List<TypeInstrumentation> typeInstrumentations = instrumentationModule.typeInstrumentations();
|
||||||
|
|
|
@ -78,7 +78,7 @@ public class ClassLoaderMatcher {
|
||||||
try {
|
try {
|
||||||
// verify helper injector works
|
// verify helper injector works
|
||||||
List<String> allHelperClasses =
|
List<String> allHelperClasses =
|
||||||
InstrumentationModuleMuzzle.getMuzzleHelperClassNames(instrumentationModule);
|
InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule);
|
||||||
HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl();
|
HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl();
|
||||||
instrumentationModule.registerHelperResources(helperResourceBuilder);
|
instrumentationModule.registerHelperResources(helperResourceBuilder);
|
||||||
if (!allHelperClasses.isEmpty()) {
|
if (!allHelperClasses.isEmpty()) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.tooling.muzzle;
|
||||||
|
|
||||||
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
|
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
|
||||||
import io.opentelemetry.javaagent.tooling.muzzle.references.ClassRef;
|
import io.opentelemetry.javaagent.tooling.muzzle.references.ClassRef;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -46,12 +47,27 @@ public interface InstrumentationModuleMuzzle {
|
||||||
*/
|
*/
|
||||||
List<String> getMuzzleHelperClassNames();
|
List<String> getMuzzleHelperClassNames();
|
||||||
|
|
||||||
/** See {@link #getMuzzleHelperClassNames()}. */
|
/**
|
||||||
static List<String> getMuzzleHelperClassNames(InstrumentationModule module) {
|
* Returns a concatenation of {@link #getMuzzleHelperClassNames()} and {@link
|
||||||
if (module instanceof InstrumentationModuleMuzzle) {
|
* InstrumentationModule#getAdditionalHelperClassNames()}.
|
||||||
return ((InstrumentationModuleMuzzle) module).getMuzzleHelperClassNames();
|
*/
|
||||||
} else {
|
static List<String> getHelperClassNames(InstrumentationModule module) {
|
||||||
return Collections.emptyList();
|
List<String> muzzleHelperClassNames =
|
||||||
}
|
module instanceof InstrumentationModuleMuzzle
|
||||||
|
? ((InstrumentationModuleMuzzle) module).getMuzzleHelperClassNames()
|
||||||
|
: Collections.emptyList();
|
||||||
|
|
||||||
|
List<String> additionalHelperClassNames = module.getAdditionalHelperClassNames();
|
||||||
|
|
||||||
|
if (additionalHelperClassNames.isEmpty()) {
|
||||||
|
return muzzleHelperClassNames;
|
||||||
|
}
|
||||||
|
if (muzzleHelperClassNames.isEmpty()) {
|
||||||
|
return additionalHelperClassNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> result = new ArrayList<>(muzzleHelperClassNames);
|
||||||
|
result.addAll(additionalHelperClassNames);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ public final class ReferenceMatcher {
|
||||||
|
|
||||||
public static ReferenceMatcher of(InstrumentationModule instrumentationModule) {
|
public static ReferenceMatcher of(InstrumentationModule instrumentationModule) {
|
||||||
return new ReferenceMatcher(
|
return new ReferenceMatcher(
|
||||||
InstrumentationModuleMuzzle.getMuzzleHelperClassNames(instrumentationModule),
|
InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule),
|
||||||
InstrumentationModuleMuzzle.getMuzzleReferences(instrumentationModule),
|
InstrumentationModuleMuzzle.getMuzzleReferences(instrumentationModule),
|
||||||
instrumentationModule::isHelperClass);
|
instrumentationModule::isHelperClass);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue