From 29d2ab8aca796bfcceb65e44c9298b11768db858 Mon Sep 17 00:00:00 2001 From: renaudboutet Date: Mon, 29 May 2017 17:22:28 +0200 Subject: [PATCH 1/2] Enable custom tracing in dd-trace.yaml --- dd-java-agent/Readme.md | 2 +- dd-java-agent/pom.xml | 2 +- .../trace/resolver/AgentTracerConfig.java | 1 + .../agent/TraceAnnotationsManager.java | 39 +++++++++++-------- .../src/main/resources/dd-trace.yaml | 5 ++- .../test/resources/dd-trace-decorators.yaml | 0 .../src/test/resources/dd-trace.yaml | 4 +- .../trace/resolver/DDDecoratorsFactory.java | 23 ++--------- .../trace/resolver/DDTracerFactory.java | 31 ++++----------- 9 files changed, 42 insertions(+), 65 deletions(-) rename {dd-trace => dd-java-agent}/src/test/resources/dd-trace-decorators.yaml (100%) rename {dd-trace => dd-java-agent}/src/test/resources/dd-trace.yaml (78%) 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; } From d20fd7788c849c089d9b2f6bd55f2feeb2be49f2 Mon Sep 17 00:00:00 2001 From: renaudboutet Date: Mon, 29 May 2017 17:33:06 +0200 Subject: [PATCH 2/2] Missing factoryutils --- .../trace/resolver/FactoryUtils.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 dd-trace/src/main/java/com/datadoghq/trace/resolver/FactoryUtils.java 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; + } +}