Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
e7204baa5a
|
@ -150,7 +150,7 @@ public void myMethod() throws InterruptedException{
|
|||
</dependency>
|
||||
```
|
||||
|
||||
- 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/).
|
||||
|
||||
|
|
|
@ -261,7 +261,7 @@
|
|||
</excludes>
|
||||
<forkCount>3</forkCount>
|
||||
<reuseForks>false</reuseForks>
|
||||
<argLine>-Xmx500m -Xms500m -XX:MaxPermSize=256m -Dorg.jboss.byteman.verbose=true -Djavaagent.enableAnnotations
|
||||
<argLine>-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</argLine>
|
||||
<workingDirectory>target/FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
|
||||
</configuration>
|
||||
|
|
|
@ -14,4 +14,5 @@ public class AgentTracerConfig extends TracerConfig {
|
|||
public void setEnableCustomTracing(boolean enableCustomTracing) {
|
||||
this.enableCustomTracing = enableCustomTracing;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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<Method> 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<trace.tagsKV().length;i=i+2){
|
||||
sb.append(".withTag(\"")
|
||||
.append(trace.tagsKV()[i]).append("\",\"").append(trace.tagsKV()[i+1])
|
||||
.append(CLOSE_PARENTHESIS);
|
||||
.append(trace.tagsKV()[i]).append("\",\"").append(trace.tagsKV()[i+1])
|
||||
.append(CLOSE_PARENTHESIS);
|
||||
}
|
||||
return sb.toString();
|
||||
}else{
|
||||
|
|
|
@ -18,4 +18,7 @@ sampler:
|
|||
# AllSampler: all spans are reported to the writer
|
||||
# RateSample: only a portion of spans are reported to the writer
|
||||
# - Param 'rate': the portion of spans to keep
|
||||
type: AllSampler
|
||||
type: AllSampler
|
||||
|
||||
# Enable custom tracing (annotations)
|
||||
# enableCustomTracing: true
|
|
@ -4,6 +4,4 @@ writer:
|
|||
host: localhost
|
||||
port: 10000
|
||||
sampler:
|
||||
type: AllSampler
|
||||
|
||||
|
||||
type: AllSampler
|
|
@ -1,17 +1,12 @@
|
|||
package com.datadoghq.trace.resolver;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.datadoghq.trace.integration.DDSpanContextDecorator;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||
|
||||
/**
|
||||
* Create DDSpaDecorators from a valid configuration
|
||||
|
@ -24,7 +19,6 @@ public class DDDecoratorsFactory {
|
|||
|
||||
public static final String CONFIG_PATH = "dd-trace-decorators.yaml";
|
||||
|
||||
private static final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
|
||||
|
||||
/**
|
||||
* Create decorators from configuration
|
||||
|
@ -77,22 +71,11 @@ public class DDDecoratorsFactory {
|
|||
}
|
||||
|
||||
public static List<DDSpanContextDecorator> createFromResources(){
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
|
||||
List<DDSpanContextDecorator> result = new ArrayList<DDSpanContextDecorator>();
|
||||
try{
|
||||
Enumeration<URL> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<URL> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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> A loadConfigFromResource(String resourceName, Class<A> targetClass){
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
A config = null;
|
||||
try {
|
||||
Enumeration<URL> 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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue