Skip to content
This repository was archived by the owner on Dec 23, 2023. It is now read-only.

Commit cdd4ce2

Browse files
authored
Add initial support for configuring the agent. (#753)
* Add initial support for configuring the agent. * Add a simple unit test to check the effect of the config knob. * No need for static here. * Use non-deprecated MockitoJUnitRunner. * Add another naive unit test. * ./gradlew googleJavaFormat * Add another naive unit test. * Suffix feature-paths with .enabled to allow for feature-specific detail config. * Update example to use the new config path. * Revert Mockito upgrade.
1 parent 6484142 commit cdd4ce2

File tree

14 files changed

+259
-9
lines changed

14 files changed

+259
-9
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ subprojects {
118118
auto_value: "com.google.auto.value:auto-value:${autoValueVersion}",
119119
auto_service: 'com.google.auto.service:auto-service:1.0-rc3',
120120
byte_buddy: 'net.bytebuddy:byte-buddy:1.7.8',
121+
config: 'com.typesafe:config:1.2.1',
121122
disruptor: 'com.lmax:disruptor:3.3.6',
122123
errorprone: "com.google.errorprone:error_prone_annotations:${errorProneVersion}",
123124
findbugs_annotations: "com.google.code.findbugs:annotations:${findBugsVersion}",

contrib/agent/README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,26 @@ executable as shown in the following example. Replace `X.Y.Z` with the actual ve
6565
java -javaagent:path/to/opencensus-contrib-agent-X.Y.Z.jar ...
6666
```
6767

68+
69+
## Configuration
70+
71+
The *OpenCensus Agent for Java* uses [Typesafe's configuration
72+
library](https://lightbend.github.io/config/) for all user-configurable settings. Please refer to
73+
[reference.conf](src/main/resources/reference.conf) for the available configuration knobs and their
74+
defaults.
75+
76+
You can override the default configuration in [different
77+
ways](https://github.com/lightbend/config/blob/7cae92d3ae3ff9d06f1db43800232d2f73c6fe44/README.md#standard-behavior).
78+
For example, to disable the automatic context propagation for Executors, add a system property as
79+
follows:
80+
81+
```shell
82+
java -javaagent:path/to/opencensus-contrib-agent-X.Y.Z.jar \
83+
-Dopencensus.contrib.agent.context-propagation.executor.enabled=false \
84+
...
85+
```
86+
87+
6888
[travis-image]: https://travis-ci.org/census-instrumentation/opencensus-java.svg?branch=master
6989
[travis-url]: https://travis-ci.org/census-instrumentation/opencensus-java
7090
[appveyor-image]: https://ci.appveyor.com/api/projects/status/hxthmpkxar4jq4be/branch/master?svg=true

contrib/agent/build.gradle

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ dependencies {
2424
compileOnly libraries.auto_service
2525
compileOnly libraries.grpc_context
2626
compileOnly project(':opencensus-api')
27+
compile libraries.byte_buddy
28+
compile libraries.config
2729
compile libraries.findbugs_annotations
2830
compile libraries.guava
29-
compile libraries.byte_buddy
3031

3132
signature 'org.codehaus.mojo.signature:java16:+@signature'
3233
}
@@ -61,6 +62,7 @@ shadowJar {
6162
// Include only the following dependencies (excluding transitive dependencies).
6263
dependencies {
6364
include(dependency(libraries.byte_buddy))
65+
include(dependency(libraries.config))
6466
include(dependency(libraries.guava))
6567
}
6668

@@ -72,6 +74,8 @@ shadowJar {
7274
// classes, which are loaded by the same classloader (the system classloader).
7375
// Byte Buddy:
7476
relocate 'net.bytebuddy', agentRepackaged + '.bytebuddy'
77+
// Config:
78+
relocate 'com.typesafe.config', agentRepackaged + '.config'
7579
// Guava:
7680
relocate 'com.google.common', agentRepackaged + '.guava'
7781
relocate 'com.google.thirdparty.publicsuffix', agentRepackaged + '.publicsuffix'
@@ -99,7 +103,8 @@ shadowJar {
99103
// ... except for the expected entries.
100104
[ agentPackageDir,
101105
'META-INF/MANIFEST.MF',
102-
'META-INF/services/io.opencensus.contrib.agent.instrumentation.Instrumenter'
106+
'META-INF/services/io.opencensus.contrib.agent.instrumentation.Instrumenter',
107+
'reference.conf',
103108
].any { entry.isDirectory() ? it.startsWith(entry.name) : it == entry.name }
104109
// Also, should not have the bootstrap classes.
105110
assert !entry.name.startsWith(agentBootstrapPackageDir)

contrib/agent/src/main/java/io/opencensus/contrib/agent/AgentMain.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import static com.google.common.base.Preconditions.checkState;
2121
import static net.bytebuddy.matcher.ElementMatchers.none;
2222

23+
import com.typesafe.config.Config;
24+
import com.typesafe.config.ConfigFactory;
2325
import io.opencensus.contrib.agent.bootstrap.ContextStrategy;
2426
import io.opencensus.contrib.agent.bootstrap.ContextTrampoline;
2527
import io.opencensus.contrib.agent.instrumentation.Instrumenter;
@@ -73,14 +75,15 @@ public static void premain(String agentArgs, Instrumentation instrumentation) th
7375
checkLoadedByBootstrapClassloader(ContextTrampoline.class);
7476
checkLoadedByBootstrapClassloader(ContextStrategy.class);
7577

78+
Config config = readConfig();
7679
AgentBuilder agentBuilder =
7780
new AgentBuilder.Default()
7881
.disableClassFormatChanges()
7982
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
8083
.with(new AgentBuilderListener())
8184
.ignore(none());
8285
for (Instrumenter instrumenter : ServiceLoader.load(Instrumenter.class)) {
83-
agentBuilder = instrumenter.instrument(agentBuilder);
86+
agentBuilder = instrumenter.instrument(agentBuilder, config);
8487
}
8588
agentBuilder.installOn(instrumentation);
8689

@@ -91,4 +94,12 @@ private static void checkLoadedByBootstrapClassloader(Class<?> clazz) {
9194
checkState(
9295
clazz.getClassLoader() == null, "%s must be loaded by the bootstrap classloader", clazz);
9396
}
97+
98+
private static Config readConfig() {
99+
final String configPath = "opencensus.contrib.agent";
100+
Config config = ConfigFactory.load();
101+
config.checkValid(ConfigFactory.defaultReference(), configPath);
102+
103+
return config.getConfig(configPath);
104+
}
94105
}

contrib/agent/src/main/java/io/opencensus/contrib/agent/instrumentation/ContextTrampolineInitializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.opencensus.contrib.agent.instrumentation;
1818

1919
import com.google.auto.service.AutoService;
20+
import com.typesafe.config.Config;
2021
import io.opencensus.contrib.agent.bootstrap.ContextStrategy;
2122
import io.opencensus.contrib.agent.bootstrap.ContextTrampoline;
2223
import net.bytebuddy.agent.builder.AgentBuilder;
@@ -26,7 +27,7 @@
2627
public final class ContextTrampolineInitializer implements Instrumenter {
2728

2829
@Override
29-
public AgentBuilder instrument(AgentBuilder agentBuilder) {
30+
public AgentBuilder instrument(AgentBuilder agentBuilder, Config config) {
3031
// TODO(stschmidt): Gracefully handle the case of missing io.grpc.Context at runtime,
3132
// maybe load the missing classes from a JAR that comes with the agent JAR.
3233
ContextTrampoline.setContextStrategy(new ContextStrategyImpl());

contrib/agent/src/main/java/io/opencensus/contrib/agent/instrumentation/ExecutorInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static net.bytebuddy.matcher.ElementMatchers.not;
2626

2727
import com.google.auto.service.AutoService;
28+
import com.typesafe.config.Config;
2829
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2930
import io.opencensus.contrib.agent.bootstrap.ContextTrampoline;
3031
import java.util.concurrent.Executor;
@@ -44,8 +45,13 @@
4445
public final class ExecutorInstrumentation implements Instrumenter {
4546

4647
@Override
47-
public AgentBuilder instrument(AgentBuilder agentBuilder) {
48+
public AgentBuilder instrument(AgentBuilder agentBuilder, Config config) {
4849
checkNotNull(agentBuilder, "agentBuilder");
50+
checkNotNull(config, "config");
51+
52+
if (!config.getBoolean("context-propagation.executor.enabled")) {
53+
return agentBuilder;
54+
}
4955

5056
return agentBuilder.type(createMatcher()).transform(new Transformer());
5157
}

contrib/agent/src/main/java/io/opencensus/contrib/agent/instrumentation/Instrumenter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.opencensus.contrib.agent.instrumentation;
1818

19+
import com.typesafe.config.Config;
1920
import net.bytebuddy.agent.builder.AgentBuilder;
2021

2122
/** Interface for plug-ins that add bytecode instrumentation. */
@@ -26,7 +27,8 @@ public interface Instrumenter {
2627
*
2728
* @param agentBuilder an {@link AgentBuilder} object to which the additional instrumentation is
2829
* added
30+
* @param config the configuration settings
2931
* @return an {@link AgentBuilder} object having the additional instrumentation
3032
*/
31-
AgentBuilder instrument(AgentBuilder agentBuilder);
33+
AgentBuilder instrument(AgentBuilder agentBuilder, Config config);
3234
}

contrib/agent/src/main/java/io/opencensus/contrib/agent/instrumentation/ThreadInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static net.bytebuddy.matcher.ElementMatchers.named;
2222

2323
import com.google.auto.service.AutoService;
24+
import com.typesafe.config.Config;
2425
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2526
import io.opencensus.contrib.agent.bootstrap.ContextTrampoline;
2627
import net.bytebuddy.agent.builder.AgentBuilder;
@@ -42,8 +43,13 @@
4243
public final class ThreadInstrumentation implements Instrumenter {
4344

4445
@Override
45-
public AgentBuilder instrument(AgentBuilder agentBuilder) {
46+
public AgentBuilder instrument(AgentBuilder agentBuilder, Config config) {
4647
checkNotNull(agentBuilder, "agentBuilder");
48+
checkNotNull(config, "config");
49+
50+
if (!config.getBoolean("context-propagation.thread.enabled")) {
51+
return agentBuilder;
52+
}
4753

4854
return agentBuilder.type(isSubTypeOf(Thread.class)).transform(new Transformer());
4955
}

contrib/agent/src/main/java/io/opencensus/contrib/agent/instrumentation/TraceTrampolineInitializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.opencensus.contrib.agent.instrumentation;
1818

1919
import com.google.auto.service.AutoService;
20+
import com.typesafe.config.Config;
2021
import io.opencensus.contrib.agent.bootstrap.TraceStrategy;
2122
import io.opencensus.contrib.agent.bootstrap.TraceTrampoline;
2223
import net.bytebuddy.agent.builder.AgentBuilder;
@@ -26,7 +27,7 @@
2627
public final class TraceTrampolineInitializer implements Instrumenter {
2728

2829
@Override
29-
public AgentBuilder instrument(AgentBuilder agentBuilder) {
30+
public AgentBuilder instrument(AgentBuilder agentBuilder, Config config) {
3031
// TODO(stschmidt): Gracefully handle the case of missing trace API at runtime,
3132
// maybe load the missing classes from a JAR that comes with the agent JAR.
3233
TraceTrampoline.setTraceStrategy(new TraceStrategyImpl());

contrib/agent/src/main/java/io/opencensus/contrib/agent/instrumentation/UrlInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import com.google.auto.service.AutoService;
2323
import com.google.errorprone.annotations.MustBeClosed;
24+
import com.typesafe.config.Config;
2425
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
2526
import io.opencensus.contrib.agent.bootstrap.TraceTrampoline;
2627
import java.io.Closeable;
@@ -40,8 +41,13 @@
4041
public final class UrlInstrumentation implements Instrumenter {
4142

4243
@Override
43-
public AgentBuilder instrument(AgentBuilder agentBuilder) {
44+
public AgentBuilder instrument(AgentBuilder agentBuilder, Config config) {
4445
checkNotNull(agentBuilder, "agentBuilder");
46+
checkNotNull(config, "config");
47+
48+
if (!config.getBoolean("trace.java.net.URL.getContent.enabled")) {
49+
return agentBuilder;
50+
}
4551

4652
return agentBuilder.type(named("java.net.URL")).transform(new Transformer());
4753
}

0 commit comments

Comments
 (0)