Skip to content

Update config to use filter jar paths and load jars #261

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Feb 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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<JavaPlugin>()
Expand Down
1 change: 1 addition & 0 deletions filter-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -33,6 +39,8 @@
*/
public class FilterRegistry {

private static final Logger logger = LoggerFactory.getLogger(FilterRegistry.class);

private FilterRegistry() {}

private static Filter filter;
Expand All @@ -54,11 +62,10 @@ public static Filter getFilter() {
}

private static Filter load() {
ServiceLoader<FilterProvider> providers = ServiceLoader.load(FilterProvider.class);
ClassLoader cl = loadJars();
ServiceLoader<FilterProvider> providers = ServiceLoader.load(FilterProvider.class, cl);
List<Filter> filters = new ArrayList<>();
Iterator<FilterProvider> 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)) {
Expand All @@ -70,6 +77,23 @@ private static Filter load() {
return new MultiFilter(filters);
}

private static ClassLoader loadJars() {
List<StringValue> 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());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we know that this works on Windows?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No.. I am not sure

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());
}
Expand Down
4 changes: 3 additions & 1 deletion filter-custom-opa/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ plugins {
`java-library`
}

val versions: Map<String, String> 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")
Expand Down
2 changes: 1 addition & 1 deletion javaagent-core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ val versions: Map<String, String> 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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion javaagent-core/src/main/proto
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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"));
Expand All @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions javaagent-core/src/test/resources/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ dataCapture:
request: true
response: false
httpBody:
javaagent:
filter_jar_paths:
- /path1.jar
- /path/2/jar.jar
2 changes: 1 addition & 1 deletion javaagent-tooling/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"]}")
}
2 changes: 1 addition & 1 deletion otel-extensions/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
2 changes: 1 addition & 1 deletion testing-bootstrap/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
6 changes: 3 additions & 3 deletions testing-common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"]}")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️ nice work :)

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")
Expand Down