diff --git a/build.gradle.kts b/build.gradle.kts index 986f5ac58..ca63a9633 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,7 +30,8 @@ subprojects { extra.set("versions", mapOf( "opentelemetry" to "0.15.0", "opentelemetry_java_agent" to "0.15.1", - "byte_buddy" to "1.10.18" + "byte_buddy" to "1.10.18", + "slf4j" to "1.7.30" )) apply() diff --git a/filter-api/build.gradle.kts b/filter-api/build.gradle.kts index d088320ef..488956763 100644 --- a/filter-api/build.gradle.kts +++ b/filter-api/build.gradle.kts @@ -9,5 +9,6 @@ dependencies { api("io.opentelemetry:opentelemetry-api:${versions["opentelemetry"]}") api(project(":javaagent-core")) implementation("com.google.auto.service:auto-service:1.0-rc7") + implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") annotationProcessor("com.google.auto.service:auto-service:1.0-rc7") } diff --git a/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java b/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java index ec2bc7e2c..31e608cb3 100644 --- a/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java +++ b/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java @@ -16,13 +16,19 @@ package org.hypertrace.agent.filter; +import com.google.protobuf.StringValue; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.ServiceLoader; import org.hypertrace.agent.core.config.EnvironmentConfig; +import org.hypertrace.agent.core.config.HypertraceConfig; import org.hypertrace.agent.filter.api.Filter; import org.hypertrace.agent.filter.spi.FilterProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Provides access to the {@link Filter} implementations. The {@link Filter} implementation are @@ -33,6 +39,8 @@ */ public class FilterRegistry { + private static final Logger logger = LoggerFactory.getLogger(FilterRegistry.class); + private FilterRegistry() {} private static Filter filter; @@ -54,11 +62,10 @@ public static Filter getFilter() { } private static Filter load() { - ServiceLoader providers = ServiceLoader.load(FilterProvider.class); + ClassLoader cl = loadJars(); + ServiceLoader providers = ServiceLoader.load(FilterProvider.class, cl); List filters = new ArrayList<>(); - Iterator iterator = providers.iterator(); - while (iterator.hasNext()) { - FilterProvider provider = iterator.next(); + for (FilterProvider provider : providers) { String disabled = EnvironmentConfig.getProperty(getProviderDisabledPropertyName(provider.getClass())); if ("true".equalsIgnoreCase(disabled)) { @@ -70,6 +77,23 @@ private static Filter load() { return new MultiFilter(filters); } + private static ClassLoader loadJars() { + List jarPaths = HypertraceConfig.get().getJavaagent().getFilterJarPathsList(); + URL[] urls = new URL[jarPaths.size()]; + int i = 0; + for (StringValue jarPath : jarPaths) { + try { + URL url = new URL("file", "", -1, jarPath.getValue()); + urls[i] = url; + i++; + } catch (MalformedURLException e) { + logger.warn( + String.format("Malformed URL exception for jar on path: %s", jarPath.getValue()), e); + } + } + return new URLClassLoader(urls, Thread.currentThread().getContextClassLoader()); + } + public static String getProviderDisabledPropertyName(Class clazz) { return String.format("ht.filter.provider.%s.disabled", clazz.getSimpleName()); } diff --git a/filter-custom-opa/build.gradle.kts b/filter-custom-opa/build.gradle.kts index b53e352a1..de45eb5c6 100644 --- a/filter-custom-opa/build.gradle.kts +++ b/filter-custom-opa/build.gradle.kts @@ -2,9 +2,11 @@ plugins { `java-library` } +val versions: Map by extra + dependencies { api(project(":filter-api")) - implementation("org.slf4j:slf4j-api:1.7.30") + implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") implementation("com.squareup.okhttp3:okhttp:3.14.9") implementation("com.fasterxml.jackson.core:jackson-databind:2.11.3") implementation("com.google.auto.service:auto-service:1.0-rc7") diff --git a/javaagent-core/build.gradle.kts b/javaagent-core/build.gradle.kts index 14b3eb544..e85dfc507 100644 --- a/javaagent-core/build.gradle.kts +++ b/javaagent-core/build.gradle.kts @@ -27,7 +27,7 @@ val versions: Map by extra dependencies { api("io.opentelemetry:opentelemetry-api:${versions["opentelemetry"]}") api("io.opentelemetry.javaagent:opentelemetry-javaagent-api:${versions["opentelemetry_java_agent"]}") - implementation("org.slf4j:slf4j-api:1.7.30") + implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") api("com.google.protobuf:protobuf-java:3.11.4") api("com.google.protobuf:protobuf-java-util:3.11.4") diff --git a/javaagent-core/src/main/java/org/hypertrace/agent/core/config/EnvironmentConfig.java b/javaagent-core/src/main/java/org/hypertrace/agent/core/config/EnvironmentConfig.java index bda5497c8..719210a34 100644 --- a/javaagent-core/src/main/java/org/hypertrace/agent/core/config/EnvironmentConfig.java +++ b/javaagent-core/src/main/java/org/hypertrace/agent/core/config/EnvironmentConfig.java @@ -21,6 +21,7 @@ import com.google.protobuf.StringValue; import org.hypertrace.agent.config.Config.AgentConfig; import org.hypertrace.agent.config.Config.DataCapture; +import org.hypertrace.agent.config.Config.JavaAgent; import org.hypertrace.agent.config.Config.Message; import org.hypertrace.agent.config.Config.Opa; import org.hypertrace.agent.config.Config.Opa.Builder; @@ -54,6 +55,9 @@ private EnvironmentConfig() {} public static final String CAPTURE_RPC_METADATA_PREFIX = CAPTURE_PREFIX + "rpc.metadata."; public static final String CAPTURE_RPC_BODY_PREFIX = CAPTURE_PREFIX + "rpc.body."; + private static final String JAVAAGENT_PREFIX = HT_PREFIX + "javaagent."; + public static final String JAVAAGENT_FILTER_JAR_PATHS = JAVAAGENT_PREFIX + "filter.jar.paths"; + public static AgentConfig.Builder applyPropertiesAndEnvVars(AgentConfig.Builder builder) { String serviceName = getProperty(SERVICE_NAME); if (serviceName != null) { @@ -67,6 +71,20 @@ public static AgentConfig.Builder applyPropertiesAndEnvVars(AgentConfig.Builder setDefaultsToDataCapture(builder.getDataCapture().toBuilder()); builder.setDataCapture(dataCaptureBuilder); applyPropagationFormat(builder); + JavaAgent.Builder javaagentBuilder = applyJavaAgent(builder.getJavaagentBuilder()); + builder.setJavaagent(javaagentBuilder); + return builder; + } + + private static JavaAgent.Builder applyJavaAgent(JavaAgent.Builder builder) { + String filterJarPaths = getProperty(JAVAAGENT_FILTER_JAR_PATHS); + if (filterJarPaths != null) { + builder.clearFilterJarPaths(); + String[] jarPaths = filterJarPaths.split(","); + for (String jarPath : jarPaths) { + builder.addFilterJarPaths(StringValue.newBuilder().setValue(jarPath)); + } + } return builder; } diff --git a/javaagent-core/src/main/proto b/javaagent-core/src/main/proto index db8c9cd4f..f950aa554 160000 --- a/javaagent-core/src/main/proto +++ b/javaagent-core/src/main/proto @@ -1 +1 @@ -Subproject commit db8c9cd4f1e99630010d8c3389492d1ee6f0cb69 +Subproject commit f950aa55481d30d860dd61f0cc610caa5555f544 diff --git a/javaagent-core/src/test/java/org/hypertrace/agent/core/config/EnvironmentConfigTest.java b/javaagent-core/src/test/java/org/hypertrace/agent/core/config/EnvironmentConfigTest.java index 60d37cee0..40587a4d5 100644 --- a/javaagent-core/src/test/java/org/hypertrace/agent/core/config/EnvironmentConfigTest.java +++ b/javaagent-core/src/test/java/org/hypertrace/agent/core/config/EnvironmentConfigTest.java @@ -35,6 +35,7 @@ class EnvironmentConfigTest { @ClearSystemProperty(key = EnvironmentConfig.PROPAGATION_FORMATS) @ClearSystemProperty(key = EnvironmentConfig.CAPTURE_HTTP_BODY_PREFIX + "request") @ClearSystemProperty(key = EnvironmentConfig.CAPTURE_BODY_MAX_SIZE_BYTES) + @ClearSystemProperty(key = EnvironmentConfig.JAVAAGENT_FILTER_JAR_PATHS) public void systemProperties() { // when tests are run in parallel the env vars/sys props set it junit-pioneer are visible to // parallel tests @@ -46,6 +47,7 @@ public void systemProperties() { System.setProperty(EnvironmentConfig.OPA_ENABLED, "true"); System.setProperty(EnvironmentConfig.PROPAGATION_FORMATS, "B3,TRACECONTEXT"); System.setProperty(EnvironmentConfig.CAPTURE_BODY_MAX_SIZE_BYTES, "512"); + System.setProperty(EnvironmentConfig.JAVAAGENT_FILTER_JAR_PATHS, "/path1.jar,/path/2/jar.jar"); AgentConfig.Builder configBuilder = AgentConfig.newBuilder(); configBuilder.setServiceName(StringValue.newBuilder().setValue("foo")); @@ -65,5 +67,12 @@ public void systemProperties() { Assertions.assertEquals(true, agentConfig.getReporting().getSecure().getValue()); Assertions.assertEquals( true, agentConfig.getDataCapture().getHttpBody().getRequest().getValue()); + Assertions.assertEquals(2, agentConfig.getJavaagent().getFilterJarPathsCount()); + Assertions.assertEquals( + StringValue.newBuilder().setValue("/path1.jar").build(), + agentConfig.getJavaagent().getFilterJarPaths(0)); + Assertions.assertEquals( + StringValue.newBuilder().setValue("/path/2/jar.jar").build(), + agentConfig.getJavaagent().getFilterJarPaths(1)); } } diff --git a/javaagent-core/src/test/java/org/hypertrace/agent/core/config/HypertraceConfigTest.java b/javaagent-core/src/test/java/org/hypertrace/agent/core/config/HypertraceConfigTest.java index 9eab918b6..d549cf780 100644 --- a/javaagent-core/src/test/java/org/hypertrace/agent/core/config/HypertraceConfigTest.java +++ b/javaagent-core/src/test/java/org/hypertrace/agent/core/config/HypertraceConfigTest.java @@ -16,6 +16,7 @@ package org.hypertrace.agent.core.config; +import com.google.protobuf.StringValue; import com.google.protobuf.util.JsonFormat; import java.io.File; import java.io.FileOutputStream; @@ -67,6 +68,7 @@ public void defaultValues() throws IOException { true, agentConfig.getDataCapture().getRpcBody().getRequest().getValue()); Assertions.assertEquals( true, agentConfig.getDataCapture().getRpcBody().getResponse().getValue()); + Assertions.assertTrue(agentConfig.hasJavaagent()); } @Test @@ -111,6 +113,13 @@ private void assertConfig(AgentConfig agentConfig) { true, agentConfig.getDataCapture().getHttpBody().getRequest().getValue()); Assertions.assertEquals( true, agentConfig.getDataCapture().getRpcBody().getRequest().getValue()); + Assertions.assertEquals(2, agentConfig.getJavaagent().getFilterJarPathsCount()); + Assertions.assertEquals( + StringValue.newBuilder().setValue("/path1.jar").build(), + agentConfig.getJavaagent().getFilterJarPaths(0)); + Assertions.assertEquals( + StringValue.newBuilder().setValue("/path/2/jar.jar").build(), + agentConfig.getJavaagent().getFilterJarPaths(1)); } @Test diff --git a/javaagent-core/src/test/resources/config.yaml b/javaagent-core/src/test/resources/config.yaml index 8e068316a..24962a3ed 100644 --- a/javaagent-core/src/test/resources/config.yaml +++ b/javaagent-core/src/test/resources/config.yaml @@ -14,3 +14,7 @@ dataCapture: request: true response: false httpBody: +javaagent: + filter_jar_paths: + - /path1.jar + - /path/2/jar.jar diff --git a/javaagent-tooling/build.gradle.kts b/javaagent-tooling/build.gradle.kts index 6376f3cff..f817752e5 100644 --- a/javaagent-tooling/build.gradle.kts +++ b/javaagent-tooling/build.gradle.kts @@ -19,5 +19,5 @@ dependencies { instrumentationMuzzle("net.bytebuddy:byte-buddy-agent:1.10.18") instrumentationMuzzle("com.blogspot.mydailyjava:weak-lock-free:0.15") instrumentationMuzzle("com.google.auto.service:auto-service:1.0-rc7") - instrumentationMuzzle("org.slf4j:slf4j-api:1.7.30") + instrumentationMuzzle("org.slf4j:slf4j-api:${versions["slf4j"]}") } diff --git a/otel-extensions/build.gradle.kts b/otel-extensions/build.gradle.kts index bb3e60584..a8acec87c 100644 --- a/otel-extensions/build.gradle.kts +++ b/otel-extensions/build.gradle.kts @@ -11,7 +11,7 @@ dependencies { compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${versions["opentelemetry"]}-alpha") implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-spi:${versions["opentelemetry_java_agent"]}") - implementation("org.slf4j:slf4j-api:1.7.30") + implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") implementation("com.google.auto.service:auto-service:1.0-rc7") implementation("net.bytebuddy:byte-buddy:${versions["byte_buddy"]}") annotationProcessor("com.google.auto.service:auto-service:1.0-rc7") diff --git a/testing-bootstrap/build.gradle.kts b/testing-bootstrap/build.gradle.kts index 28314db94..85be77fd6 100644 --- a/testing-bootstrap/build.gradle.kts +++ b/testing-bootstrap/build.gradle.kts @@ -16,7 +16,7 @@ dependencies { implementation(project(":filter-api")) implementation("ch.qos.logback:logback-classic:1.2.3") - implementation("org.slf4j:slf4j-api:1.7.30") + implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") } tasks { diff --git a/testing-common/build.gradle.kts b/testing-common/build.gradle.kts index 8a9d89d51..4bc82931a 100644 --- a/testing-common/build.gradle.kts +++ b/testing-common/build.gradle.kts @@ -20,9 +20,9 @@ dependencies { implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-spi:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry_java_agent"]}") implementation("ch.qos.logback:logback-classic:1.2.3") - implementation("org.slf4j:log4j-over-slf4j:1.7.30") - implementation("org.slf4j:jcl-over-slf4j:1.7.30") - implementation("org.slf4j:jul-to-slf4j:1.7.30") + implementation("org.slf4j:log4j-over-slf4j:${versions["slf4j"]}") + implementation("org.slf4j:jcl-over-slf4j:${versions["slf4j"]}") + implementation("org.slf4j:jul-to-slf4j:${versions["slf4j"]}") implementation("net.bytebuddy:byte-buddy:${versions["byte_buddy"]}") implementation("net.bytebuddy:byte-buddy-agent:${versions["byte_buddy"]}") implementation("com.google.auto.service:auto-service:1.0-rc7")