Skip to content

Commit 99b0082

Browse files
authored
Update config to use filter jar paths and load jars (#261)
* updating config to have javaagent config with filter jar paths and load these jars in FilterRegistry * review comments * updating agent config submodule
1 parent 23761b2 commit 99b0082

File tree

14 files changed

+83
-15
lines changed

14 files changed

+83
-15
lines changed

build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ subprojects {
3030
extra.set("versions", mapOf(
3131
"opentelemetry" to "0.15.0",
3232
"opentelemetry_java_agent" to "0.15.1",
33-
"byte_buddy" to "1.10.18"
33+
"byte_buddy" to "1.10.18",
34+
"slf4j" to "1.7.30"
3435
))
3536

3637
apply<JavaPlugin>()

filter-api/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ dependencies {
99
api("io.opentelemetry:opentelemetry-api:${versions["opentelemetry"]}")
1010
api(project(":javaagent-core"))
1111
implementation("com.google.auto.service:auto-service:1.0-rc7")
12+
implementation("org.slf4j:slf4j-api:${versions["slf4j"]}")
1213
annotationProcessor("com.google.auto.service:auto-service:1.0-rc7")
1314
}

filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,19 @@
1616

1717
package org.hypertrace.agent.filter;
1818

19+
import com.google.protobuf.StringValue;
20+
import java.net.MalformedURLException;
21+
import java.net.URL;
22+
import java.net.URLClassLoader;
1923
import java.util.ArrayList;
20-
import java.util.Iterator;
2124
import java.util.List;
2225
import java.util.ServiceLoader;
2326
import org.hypertrace.agent.core.config.EnvironmentConfig;
27+
import org.hypertrace.agent.core.config.HypertraceConfig;
2428
import org.hypertrace.agent.filter.api.Filter;
2529
import org.hypertrace.agent.filter.spi.FilterProvider;
30+
import org.slf4j.Logger;
31+
import org.slf4j.LoggerFactory;
2632

2733
/**
2834
* Provides access to the {@link Filter} implementations. The {@link Filter} implementation are
@@ -33,6 +39,8 @@
3339
*/
3440
public class FilterRegistry {
3541

42+
private static final Logger logger = LoggerFactory.getLogger(FilterRegistry.class);
43+
3644
private FilterRegistry() {}
3745

3846
private static Filter filter;
@@ -54,11 +62,10 @@ public static Filter getFilter() {
5462
}
5563

5664
private static Filter load() {
57-
ServiceLoader<FilterProvider> providers = ServiceLoader.load(FilterProvider.class);
65+
ClassLoader cl = loadJars();
66+
ServiceLoader<FilterProvider> providers = ServiceLoader.load(FilterProvider.class, cl);
5867
List<Filter> filters = new ArrayList<>();
59-
Iterator<FilterProvider> iterator = providers.iterator();
60-
while (iterator.hasNext()) {
61-
FilterProvider provider = iterator.next();
68+
for (FilterProvider provider : providers) {
6269
String disabled =
6370
EnvironmentConfig.getProperty(getProviderDisabledPropertyName(provider.getClass()));
6471
if ("true".equalsIgnoreCase(disabled)) {
@@ -70,6 +77,23 @@ private static Filter load() {
7077
return new MultiFilter(filters);
7178
}
7279

80+
private static ClassLoader loadJars() {
81+
List<StringValue> jarPaths = HypertraceConfig.get().getJavaagent().getFilterJarPathsList();
82+
URL[] urls = new URL[jarPaths.size()];
83+
int i = 0;
84+
for (StringValue jarPath : jarPaths) {
85+
try {
86+
URL url = new URL("file", "", -1, jarPath.getValue());
87+
urls[i] = url;
88+
i++;
89+
} catch (MalformedURLException e) {
90+
logger.warn(
91+
String.format("Malformed URL exception for jar on path: %s", jarPath.getValue()), e);
92+
}
93+
}
94+
return new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
95+
}
96+
7397
public static String getProviderDisabledPropertyName(Class<?> clazz) {
7498
return String.format("ht.filter.provider.%s.disabled", clazz.getSimpleName());
7599
}

filter-custom-opa/build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ plugins {
22
`java-library`
33
}
44

5+
val versions: Map<String, String> by extra
6+
57
dependencies {
68
api(project(":filter-api"))
7-
implementation("org.slf4j:slf4j-api:1.7.30")
9+
implementation("org.slf4j:slf4j-api:${versions["slf4j"]}")
810
implementation("com.squareup.okhttp3:okhttp:3.14.9")
911
implementation("com.fasterxml.jackson.core:jackson-databind:2.11.3")
1012
implementation("com.google.auto.service:auto-service:1.0-rc7")

javaagent-core/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ val versions: Map<String, String> by extra
2727
dependencies {
2828
api("io.opentelemetry:opentelemetry-api:${versions["opentelemetry"]}")
2929
api("io.opentelemetry.javaagent:opentelemetry-javaagent-api:${versions["opentelemetry_java_agent"]}")
30-
implementation("org.slf4j:slf4j-api:1.7.30")
30+
implementation("org.slf4j:slf4j-api:${versions["slf4j"]}")
3131

3232
api("com.google.protobuf:protobuf-java:3.11.4")
3333
api("com.google.protobuf:protobuf-java-util:3.11.4")

javaagent-core/src/main/java/org/hypertrace/agent/core/config/EnvironmentConfig.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.protobuf.StringValue;
2222
import org.hypertrace.agent.config.Config.AgentConfig;
2323
import org.hypertrace.agent.config.Config.DataCapture;
24+
import org.hypertrace.agent.config.Config.JavaAgent;
2425
import org.hypertrace.agent.config.Config.Message;
2526
import org.hypertrace.agent.config.Config.Opa;
2627
import org.hypertrace.agent.config.Config.Opa.Builder;
@@ -54,6 +55,9 @@ private EnvironmentConfig() {}
5455
public static final String CAPTURE_RPC_METADATA_PREFIX = CAPTURE_PREFIX + "rpc.metadata.";
5556
public static final String CAPTURE_RPC_BODY_PREFIX = CAPTURE_PREFIX + "rpc.body.";
5657

58+
private static final String JAVAAGENT_PREFIX = HT_PREFIX + "javaagent.";
59+
public static final String JAVAAGENT_FILTER_JAR_PATHS = JAVAAGENT_PREFIX + "filter.jar.paths";
60+
5761
public static AgentConfig.Builder applyPropertiesAndEnvVars(AgentConfig.Builder builder) {
5862
String serviceName = getProperty(SERVICE_NAME);
5963
if (serviceName != null) {
@@ -67,6 +71,20 @@ public static AgentConfig.Builder applyPropertiesAndEnvVars(AgentConfig.Builder
6771
setDefaultsToDataCapture(builder.getDataCapture().toBuilder());
6872
builder.setDataCapture(dataCaptureBuilder);
6973
applyPropagationFormat(builder);
74+
JavaAgent.Builder javaagentBuilder = applyJavaAgent(builder.getJavaagentBuilder());
75+
builder.setJavaagent(javaagentBuilder);
76+
return builder;
77+
}
78+
79+
private static JavaAgent.Builder applyJavaAgent(JavaAgent.Builder builder) {
80+
String filterJarPaths = getProperty(JAVAAGENT_FILTER_JAR_PATHS);
81+
if (filterJarPaths != null) {
82+
builder.clearFilterJarPaths();
83+
String[] jarPaths = filterJarPaths.split(",");
84+
for (String jarPath : jarPaths) {
85+
builder.addFilterJarPaths(StringValue.newBuilder().setValue(jarPath));
86+
}
87+
}
7088
return builder;
7189
}
7290

javaagent-core/src/test/java/org/hypertrace/agent/core/config/EnvironmentConfigTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class EnvironmentConfigTest {
3535
@ClearSystemProperty(key = EnvironmentConfig.PROPAGATION_FORMATS)
3636
@ClearSystemProperty(key = EnvironmentConfig.CAPTURE_HTTP_BODY_PREFIX + "request")
3737
@ClearSystemProperty(key = EnvironmentConfig.CAPTURE_BODY_MAX_SIZE_BYTES)
38+
@ClearSystemProperty(key = EnvironmentConfig.JAVAAGENT_FILTER_JAR_PATHS)
3839
public void systemProperties() {
3940
// when tests are run in parallel the env vars/sys props set it junit-pioneer are visible to
4041
// parallel tests
@@ -46,6 +47,7 @@ public void systemProperties() {
4647
System.setProperty(EnvironmentConfig.OPA_ENABLED, "true");
4748
System.setProperty(EnvironmentConfig.PROPAGATION_FORMATS, "B3,TRACECONTEXT");
4849
System.setProperty(EnvironmentConfig.CAPTURE_BODY_MAX_SIZE_BYTES, "512");
50+
System.setProperty(EnvironmentConfig.JAVAAGENT_FILTER_JAR_PATHS, "/path1.jar,/path/2/jar.jar");
4951

5052
AgentConfig.Builder configBuilder = AgentConfig.newBuilder();
5153
configBuilder.setServiceName(StringValue.newBuilder().setValue("foo"));
@@ -65,5 +67,12 @@ public void systemProperties() {
6567
Assertions.assertEquals(true, agentConfig.getReporting().getSecure().getValue());
6668
Assertions.assertEquals(
6769
true, agentConfig.getDataCapture().getHttpBody().getRequest().getValue());
70+
Assertions.assertEquals(2, agentConfig.getJavaagent().getFilterJarPathsCount());
71+
Assertions.assertEquals(
72+
StringValue.newBuilder().setValue("/path1.jar").build(),
73+
agentConfig.getJavaagent().getFilterJarPaths(0));
74+
Assertions.assertEquals(
75+
StringValue.newBuilder().setValue("/path/2/jar.jar").build(),
76+
agentConfig.getJavaagent().getFilterJarPaths(1));
6877
}
6978
}

javaagent-core/src/test/java/org/hypertrace/agent/core/config/HypertraceConfigTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.hypertrace.agent.core.config;
1818

19+
import com.google.protobuf.StringValue;
1920
import com.google.protobuf.util.JsonFormat;
2021
import java.io.File;
2122
import java.io.FileOutputStream;
@@ -67,6 +68,7 @@ public void defaultValues() throws IOException {
6768
true, agentConfig.getDataCapture().getRpcBody().getRequest().getValue());
6869
Assertions.assertEquals(
6970
true, agentConfig.getDataCapture().getRpcBody().getResponse().getValue());
71+
Assertions.assertTrue(agentConfig.hasJavaagent());
7072
}
7173

7274
@Test
@@ -111,6 +113,13 @@ private void assertConfig(AgentConfig agentConfig) {
111113
true, agentConfig.getDataCapture().getHttpBody().getRequest().getValue());
112114
Assertions.assertEquals(
113115
true, agentConfig.getDataCapture().getRpcBody().getRequest().getValue());
116+
Assertions.assertEquals(2, agentConfig.getJavaagent().getFilterJarPathsCount());
117+
Assertions.assertEquals(
118+
StringValue.newBuilder().setValue("/path1.jar").build(),
119+
agentConfig.getJavaagent().getFilterJarPaths(0));
120+
Assertions.assertEquals(
121+
StringValue.newBuilder().setValue("/path/2/jar.jar").build(),
122+
agentConfig.getJavaagent().getFilterJarPaths(1));
114123
}
115124

116125
@Test

javaagent-core/src/test/resources/config.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ dataCapture:
1414
request: true
1515
response: false
1616
httpBody:
17+
javaagent:
18+
filter_jar_paths:
19+
- /path1.jar
20+
- /path/2/jar.jar

0 commit comments

Comments
 (0)