Add UserExcludedClassloadersConfigurer (#10134)

This commit is contained in:
Angel 2024-01-11 17:50:46 +02:00 committed by GitHub
parent 3dd0925081
commit 478404539d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 97 additions and 0 deletions

View File

@ -18,6 +18,14 @@ which could have unknown side-effects.
| ------------------------------ | ------------------------------ | -------------------------------------------------------------------------------------------------- |
| otel.javaagent.exclude-classes | OTEL_JAVAAGENT_EXCLUDE_CLASSES | Suppresses all instrumentation for specific classes, format is "my.package.MyClass,my.package2.\*" |
## Excluding specific classes loaders
This option can be used to exclude classes loaded by given class loaders from being instrumented.
| System property | Environment variable | Purpose |
|--------------------------------------|--------------------------------------|---------------------------------------------------------------------------------|
| otel.javaagent.exclude-class-loaders | OTEL_JAVAAGENT_EXCLUDE_CLASS_LOADERS | Ignore the specified class loaders, format is "my.package.MyClass,my.package2." |
## Running application with security manager
This option can be used to let agent run with all privileges without being affected by security policy restricting some operations.

View File

@ -0,0 +1,34 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.tooling.ignore;
import static java.util.Collections.emptyList;
import com.google.auto.service.AutoService;
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder;
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import java.util.List;
@AutoService(IgnoredTypesConfigurer.class)
public class UserExcludedClassLoadersConfigurer implements IgnoredTypesConfigurer {
// visible for tests
static final String EXCLUDED_CLASS_LOADERS_CONFIG = "otel.javaagent.exclude-class-loaders";
@Override
public void configure(IgnoredTypesBuilder builder, ConfigProperties config) {
List<String> excludedClassLoaders = config.getList(EXCLUDED_CLASS_LOADERS_CONFIG, emptyList());
for (String excludedClassLoader : excludedClassLoaders) {
excludedClassLoader = excludedClassLoader.trim();
// remove the trailing *
if (excludedClassLoader.endsWith("*")) {
excludedClassLoader = excludedClassLoader.substring(0, excludedClassLoader.length() - 1);
}
builder.ignoreClassLoader(excludedClassLoader);
}
}
}

View File

@ -0,0 +1,55 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.tooling.ignore;
import static io.opentelemetry.javaagent.tooling.ignore.UserExcludedClassLoadersConfigurer.EXCLUDED_CLASS_LOADERS_CONFIG;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder;
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class UserExcludedClassLoadersConfigurerTest {
@Mock ConfigProperties config;
@Mock IgnoredTypesBuilder builder;
IgnoredTypesConfigurer underTest = new UserExcludedClassLoadersConfigurer();
@Test
void shouldAddNothingToBuilderWhenPropertyIsEmpty() {
// when
underTest.configure(builder, config);
// then
verifyNoInteractions(builder);
}
@Test
void shouldIgnoreClassesAndPackages() {
// given
when(config.getList(EXCLUDED_CLASS_LOADERS_CONFIG, emptyList()))
.thenReturn(
asList("com.example.IgnoredClass", "com.example.ignored.*", "com.another_ignore"));
// when
underTest.configure(builder, config);
// then
verify(builder).ignoreClassLoader("com.example.IgnoredClass");
verify(builder).ignoreClassLoader("com.example.ignored.");
verify(builder).ignoreClassLoader("com.another_ignore");
}
}