diff --git a/dd-java-agent/Readme.md b/dd-java-agent/Readme.md
index d77a2c70ea..4b9319f011 100644
--- a/dd-java-agent/Readme.md
+++ b/dd-java-agent/Readme.md
@@ -150,7 +150,7 @@ public void myMethod() throws InterruptedException{
```
-- Enable custom tracing by adding this JVM property `-Ddd.enable_custom_tracing`
+- Enable custom tracing by adding in the `dd-trace.yaml` config file `enableCustomTracing: true`
If you want to see custom tracing in action please run the [Dropwizard example](https://github.com/DataDog/dd-trace-java/blob/dev/dd-trace-examples/dropwizard-mongo-client/).
diff --git a/dd-java-agent/pom.xml b/dd-java-agent/pom.xml
index fccb9e5031..c544bada64 100644
--- a/dd-java-agent/pom.xml
+++ b/dd-java-agent/pom.xml
@@ -261,7 +261,7 @@
3
false
- -Xmx500m -Xms500m -XX:MaxPermSize=256m -Dorg.jboss.byteman.verbose=true -Djavaagent.enableAnnotations
+ -Xmx1g -Xms1g -XX:MaxPermSize=512m -Dorg.jboss.byteman.verbose=true
-javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar
target/FORK_DIRECTORY_${surefire.forkNumber}
diff --git a/dd-java-agent/src/main/java/com/datadoghq/trace/resolver/AgentTracerConfig.java b/dd-java-agent/src/main/java/com/datadoghq/trace/resolver/AgentTracerConfig.java
index 147b50230f..40227180fa 100644
--- a/dd-java-agent/src/main/java/com/datadoghq/trace/resolver/AgentTracerConfig.java
+++ b/dd-java-agent/src/main/java/com/datadoghq/trace/resolver/AgentTracerConfig.java
@@ -14,4 +14,5 @@ public class AgentTracerConfig extends TracerConfig {
public void setEnableCustomTracing(boolean enableCustomTracing) {
this.enableCustomTracing = enableCustomTracing;
}
+
}
diff --git a/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java b/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java
index 6a9e9debc8..565fbbe299 100644
--- a/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java
+++ b/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java
@@ -17,6 +17,10 @@ import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;
+import com.datadoghq.trace.resolver.AgentTracerConfig;
+import com.datadoghq.trace.resolver.DDTracerFactory;
+import com.datadoghq.trace.resolver.FactoryUtils;
+
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
@@ -30,8 +34,8 @@ import javassist.bytecode.Descriptor;
public class TraceAnnotationsManager extends OpenTracingManager{
private static Logger log = Logger.getLogger(TraceAnnotationsManager.class.getName());
- private static Retransformer transformer;
-
+ private static Retransformer transformer;
+
/**
* This method initializes the manager.
*
@@ -42,9 +46,12 @@ public class TraceAnnotationsManager extends OpenTracingManager{
transformer = trans;
OpenTracingManager.initialize(trans);
OpenTracingManager.loadRules(ClassLoader.getSystemClassLoader());
-
- String value = System.getProperty("dd.enable_custom_tracing","false");
- if("true".equalsIgnoreCase(value)){
+
+ //Load configuration
+ AgentTracerConfig agentTracerConfig = FactoryUtils.loadConfigFromResource(DDTracerFactory.CONFIG_PATH, AgentTracerConfig.class);
+
+ //Check if annotations are enabled
+ if(agentTracerConfig.isEnableCustomTracing()){
loadRules(ClassLoader.getSystemClassLoader());
}
}
@@ -59,7 +66,7 @@ public class TraceAnnotationsManager extends OpenTracingManager{
.forPackages("/")
.filterInputsBy(new FilterBuilder().include(".*\\.class"))
.setScanners(new MethodAnnotationsScanner()));
-
+
Set methods = reflections.getMethodsAnnotatedWith(Trace.class);
StringBuilder generatedScripts = new StringBuilder();
@@ -78,7 +85,7 @@ public class TraceAnnotationsManager extends OpenTracingManager{
START;
RuleScript script = createRuleScript("Child of ",cc, javassistMethod, Location.create(LocationType.ENTRY,""),ruleText);
generatedScripts.append(script).append("\n");
-
+
//AT ENTRY: new trace
ruleText =
CURRENT_SPAN_NOT_EXISTS+
@@ -87,11 +94,11 @@ public class TraceAnnotationsManager extends OpenTracingManager{
START;
script = createRuleScript("New trace ",cc, javassistMethod, Location.create(LocationType.ENTRY,""),ruleText);
generatedScripts.append(script).append("\n");
-
+
//AT EXIT
script = createRuleScript("Close span ",cc, javassistMethod, Location.create(LocationType.EXIT,""),EXIT_RULE);
generatedScripts.append(script).append("\n");
-
+
}catch(Exception e){
log.log(Level.SEVERE,"Could not create rule for method "+method+". Proceed to next annoted method.",e);
}
@@ -132,13 +139,13 @@ public class TraceAnnotationsManager extends OpenTracingManager{
false);
return ruleScript;
}
-
+
private static String CURRENT_SPAN_EXISTS = "IF currentSpan() != null\n";
private static String CURRENT_SPAN_NOT_EXISTS = "IF currentSpan() == null\n";
-
+
private static String BUILD_SPAN = "DO\n"+"activateSpan(getTracer().buildSpan(\"";
private static String CLOSE_PARENTHESIS = "\")";
-
+
private static String CHILD_OF_CURRENT_SPAN = ".asChildOf(currentSpan())";
private static String START = ".start());";
@@ -146,7 +153,7 @@ public class TraceAnnotationsManager extends OpenTracingManager{
"DO\n"+
"currentSpan().finish();\n"+
"deactivateCurrentSpan();";
-
+
private static String buildSpan(CtMethod javassistMethod){
try {
Trace trace = (Trace) javassistMethod.getAnnotation(Trace.class);
@@ -158,7 +165,7 @@ public class TraceAnnotationsManager extends OpenTracingManager{
}
return BUILD_SPAN+javassistMethod.getName()+CLOSE_PARENTHESIS;
};
-
+
private static String buildWithTags(CtMethod javassistMethod){
try {
Trace trace = (Trace) javassistMethod.getAnnotation(Trace.class);
@@ -167,8 +174,8 @@ public class TraceAnnotationsManager extends OpenTracingManager{
StringBuilder sb = new StringBuilder();
for(int i = 0;i createFromResources(){
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-
List result = new ArrayList();
- try{
- Enumeration iter = classLoader.getResources(CONFIG_PATH);
- while (iter.hasMoreElements()) {
- TracerConfig config = objectMapper.readValue(iter.nextElement().openStream(), TracerConfig.class);
- result = DDDecoratorsFactory.create(config.getDecorators());
-
- break; // ONLY the closest resource file is taken into account
- }
- }catch(IOException e){
- logger.error("Could not load decorators configuration file.", e);
+ TracerConfig config = FactoryUtils.loadConfigFromResource(CONFIG_PATH, TracerConfig.class);
+ if(config!=null){
+ result = DDDecoratorsFactory.create(config.getDecorators());
}
-
-
return result;
}
}
diff --git a/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerFactory.java b/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerFactory.java
index 35074d0c76..be399e6ce8 100644
--- a/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerFactory.java
+++ b/dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerFactory.java
@@ -1,9 +1,5 @@
package com.datadoghq.trace.resolver;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Enumeration;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,8 +11,6 @@ import com.datadoghq.trace.writer.DDAgentWriter;
import com.datadoghq.trace.writer.DDApi;
import com.datadoghq.trace.writer.LoggingWritter;
import com.datadoghq.trace.writer.Writer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
/**
* Create a tracer from a configuration file
@@ -26,8 +20,6 @@ public class DDTracerFactory {
private final static Logger logger = LoggerFactory.getLogger(DDTracerFactory.class);
public static final String CONFIG_PATH = "dd-trace.yaml";
- private static final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
-
/**
* Create a tracer from a TracerConfig object
@@ -66,27 +58,20 @@ public class DDTracerFactory {
//Create tracer
return new DDTracer(defaultServiceName, writer, rateSampler);
}
+
+
public static DDTracer createFromResources(){
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ TracerConfig tracerConfig = FactoryUtils.loadConfigFromResource(CONFIG_PATH, TracerConfig.class);
+
DDTracer tracer = null;
- try {
- Enumeration iter = classLoader.getResources(CONFIG_PATH);
- while (iter.hasMoreElements()) {
- TracerConfig config = objectMapper.readValue(iter.nextElement().openStream(), TracerConfig.class);
-
- tracer = DDTracerFactory.create(config);
-
- break; // ONLY the closest resource file is taken into account
- }
- } catch (IOException e) {
- logger.error("Could not load tracer configuration file.", e);
- }
-
- if (tracer == null) {
+ if (tracerConfig == null) {
logger.info("No valid configuration file {} found. Loading default tracer.",CONFIG_PATH);
tracer = new DDTracer();
+ }else{
+ tracer = DDTracerFactory.create(tracerConfig);
}
+
return tracer;
}
diff --git a/dd-trace/src/main/java/com/datadoghq/trace/resolver/FactoryUtils.java b/dd-trace/src/main/java/com/datadoghq/trace/resolver/FactoryUtils.java
new file mode 100644
index 0000000000..88f1e31d4c
--- /dev/null
+++ b/dd-trace/src/main/java/com/datadoghq/trace/resolver/FactoryUtils.java
@@ -0,0 +1,34 @@
+package com.datadoghq.trace.resolver;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+
+public class FactoryUtils {
+ private final static Logger logger = LoggerFactory.getLogger(FactoryUtils.class);
+
+ private static final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
+
+ public static A loadConfigFromResource(String resourceName, Class targetClass){
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ A config = null;
+ try {
+ Enumeration iter = classLoader.getResources(resourceName);
+ while (iter.hasMoreElements()) {
+ config = objectMapper.readValue(iter.nextElement().openStream(), targetClass);
+
+ break; // ONLY the closest resource file is taken into account
+ }
+ } catch (IOException e) {
+ logger.warn("Could not load configuration file {}.", resourceName);
+ logger.error("Error when loading config file", e);
+ }
+ return config;
+ }
+}