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 be399e6ce8..68df96b542 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,8 +1,5 @@ package com.datadoghq.trace.resolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.datadoghq.trace.DDTracer; import com.datadoghq.trace.sampling.AllSampler; import com.datadoghq.trace.sampling.RateSampler; @@ -11,6 +8,8 @@ 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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Create a tracer from a configuration file @@ -21,57 +20,69 @@ public class DDTracerFactory { public static final String CONFIG_PATH = "dd-trace.yaml"; + private static final String DD_AGENT_WRITER_TYPE = DDAgentWriter.class.getSimpleName(); + private static final String LOGGING_WRITER_TYPE = LoggingWritter.class.getSimpleName(); + private static final String ALL_SAMPLER_TYPE = AllSampler.class.getSimpleName(); + private static final String RATE_SAMPLER_TYPE = RateSampler.class.getSimpleName(); + /** * Create a tracer from a TracerConfig object - * + * * @param config * @return the corresponding tracer */ - public static DDTracer create(TracerConfig config){ + public static DDTracer create(TracerConfig config) { String defaultServiceName = config.getDefaultServiceName() != null ? config.getDefaultServiceName() : DDTracer.UNASSIGNED_DEFAULT_SERVICE_NAME; //Create writer - Writer writer = DDTracer.UNASSIGNED_WRITER; - if (config.getWriter() != null && config.getWriter().get("type") != null) { - String type = (String) config.getWriter().get("type"); - if (type.equals(DDAgentWriter.class.getSimpleName())) { - String host = config.getWriter().get("host") != null ? (String) config.getWriter().get("host") : DDAgentWriter.DEFAULT_HOSTNAME; - Integer port = config.getWriter().get("port") != null ? (Integer) config.getWriter().get("port") : DDAgentWriter.DEFAULT_PORT; - DDApi api = new DDApi(host, port); - writer = new DDAgentWriter(api); - } else if (type.equals(LoggingWritter.class.getSimpleName())) { + Writer writer; + + if (config.getWriter() != null) { + WriterConfig c = config.getWriter(); + if (DD_AGENT_WRITER_TYPE.equals(c.getType())) { + writer = new DDAgentWriter(new DDApi(c.getHost(DDAgentWriter.DEFAULT_HOSTNAME), c.getPort(DDAgentWriter.DEFAULT_PORT))); + } else if (LOGGING_WRITER_TYPE.equals(c.getType())) { writer = new LoggingWritter(); + } else { + writer = DDTracer.UNASSIGNED_WRITER; } + } else { + writer = DDTracer.UNASSIGNED_WRITER; + } //Create sampler - Sampler rateSampler = DDTracer.UNASSIGNED_SAMPLER; - if (config.getSampler() != null && config.getSampler().get("type") != null) { - String type = (String) config.getSampler().get("type"); - if (type.equals(AllSampler.class.getSimpleName())) { - rateSampler = new AllSampler(); - } else if (type.equals(RateSampler.class.getSimpleName())) { - rateSampler = new RateSampler((Double) config.getSampler().get("rate")); + Sampler sampler; + + if (config.getSampler() != null) { + if (RATE_SAMPLER_TYPE.equals(config.getSampler().getType())) { + sampler = new RateSampler(config.getSampler().getRate()); + } else if (ALL_SAMPLER_TYPE.equals(config.getSampler().getType())) { + sampler = new AllSampler(); + } else { + sampler = DDTracer.UNASSIGNED_SAMPLER; } + } else { + sampler = DDTracer.UNASSIGNED_SAMPLER; } //Create tracer - return new DDTracer(defaultServiceName, writer, rateSampler); + return new DDTracer(defaultServiceName, writer, sampler); + } - - public static DDTracer createFromResources(){ + public static DDTracer createFromResources() { TracerConfig tracerConfig = FactoryUtils.loadConfigFromResource(CONFIG_PATH, TracerConfig.class); - + DDTracer tracer = null; if (tracerConfig == null) { - logger.info("No valid configuration file {} found. Loading default tracer.",CONFIG_PATH); + logger.info("No valid configuration file {} found. Loading default tracer.", CONFIG_PATH); tracer = new DDTracer(); - }else{ + } else { tracer = DDTracerFactory.create(tracerConfig); } - + return tracer; } diff --git a/dd-trace/src/main/java/com/datadoghq/trace/resolver/TracerConfig.java b/dd-trace/src/main/java/com/datadoghq/trace/resolver/TracerConfig.java index 029bc5acaf..d0600be3b0 100644 --- a/dd-trace/src/main/java/com/datadoghq/trace/resolver/TracerConfig.java +++ b/dd-trace/src/main/java/com/datadoghq/trace/resolver/TracerConfig.java @@ -1,48 +1,56 @@ package com.datadoghq.trace.resolver; -import java.util.List; -import java.util.Map; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import java.util.List; + /** * Tracer configuration */ @JsonIgnoreProperties(ignoreUnknown = true) public class TracerConfig { + private String defaultServiceName; - private Map writer; - private Map sampler; + private WriterConfig writer; + private SamplerConfig sampler; private List decorators; - + + public String getDefaultServiceName() { return defaultServiceName; } + public void setDefaultServiceName(String defaultServiceName) { this.defaultServiceName = defaultServiceName; } - public Map getWriter() { + + public WriterConfig getWriter() { return writer; } - public void setWriter(Map writer) { + + public void setWriter(WriterConfig writer) { this.writer = writer; } - public Map getSampler() { + + public SamplerConfig getSampler() { return sampler; } - public void setSampler(Map sampler) { + + public void setSampler(SamplerConfig sampler) { this.sampler = sampler; } + public List getDecorators() { return decorators; } + public void setDecorators(List decorators) { this.decorators = decorators; } - + @Override public String toString() { try { @@ -52,4 +60,71 @@ public class TracerConfig { return null; } } + +} + +class SamplerConfig { + + + private Double rate; + private String type; + + public String getType() { + return type; + } + + public Double getRate() { + return rate; + } + + + public void setRate(Double rate) { + this.rate = rate; + } + + public void setType(String type) { + this.type = type; + } +} + + +class WriterConfig { + + + private String host; + private Integer port; + private String type; + + public void setHost(String host) { + this.host = host; + } + + public void setPort(Integer port) { + this.port = port; + } + + public void setType(String type) { + this.type = type; + } + + public String getHost() { + return host; + } + + public Integer getPort() { + return port; + } + + public String getType() { + return type; + } + + public String getHost(String defaultHostname) { + return host == null ? defaultHostname : host; + } + + + public Integer getPort(int defaultPort) { + return port == null ? defaultPort : port; + } } diff --git a/dd-trace/src/test/java/com/datadoghq/trace/resolver/DDTracerFactoryTest.java b/dd-trace/src/test/java/com/datadoghq/trace/resolver/DDTracerFactoryTest.java new file mode 100644 index 0000000000..1fc50d0995 --- /dev/null +++ b/dd-trace/src/test/java/com/datadoghq/trace/resolver/DDTracerFactoryTest.java @@ -0,0 +1,44 @@ +package com.datadoghq.trace.resolver; + +import com.datadoghq.trace.sampling.AllSampler; +import com.datadoghq.trace.sampling.RateSampler; +import com.datadoghq.trace.writer.DDAgentWriter; +import org.assertj.core.api.Assertions; +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +public class DDTracerFactoryTest { + + + + + @Test + public void test() throws Exception { + TracerConfig tracerConfig = FactoryUtils.loadConfigFromResource("dd-trace-1.yaml", TracerConfig.class); + + assertThat(tracerConfig.getWriter()).isNotNull(); + assertThat(tracerConfig.getSampler()).isNotNull(); + assertThat(tracerConfig.getDefaultServiceName()).isEqualTo("java-app"); + assertThat(tracerConfig.getWriter().getHost()).isEqualTo("foo"); + assertThat(tracerConfig.getWriter().getPort()).isEqualTo(123); + assertThat(tracerConfig.getWriter().getType()).isEqualTo(DDAgentWriter.class.getSimpleName()); + assertThat(tracerConfig.getSampler().getType()).isEqualTo(AllSampler.class.getSimpleName()); + assertThat(tracerConfig.getSampler().getRate()).isNull(); + + + tracerConfig = FactoryUtils.loadConfigFromResource("dd-trace-2.yaml", TracerConfig.class); + assertThat(tracerConfig.getWriter()).isNotNull(); + assertThat(tracerConfig.getDefaultServiceName()).isEqualTo("java-app"); + assertThat(tracerConfig.getWriter().getHost("localhost")).isEqualTo("localhost"); + assertThat(tracerConfig.getWriter().getPort(8126)).isEqualTo(8126); + assertThat(tracerConfig.getWriter().getType()).isEqualTo(DDAgentWriter.class.getSimpleName()); + assertThat(tracerConfig.getSampler().getType()).isEqualTo(RateSampler.class.getSimpleName()); + assertThat(tracerConfig.getSampler().getRate()).isEqualTo(0.4); + + + + } + +} \ No newline at end of file diff --git a/dd-trace/src/test/resources/dd-trace-1.yaml b/dd-trace/src/test/resources/dd-trace-1.yaml new file mode 100644 index 0000000000..4b62c03757 --- /dev/null +++ b/dd-trace/src/test/resources/dd-trace-1.yaml @@ -0,0 +1,24 @@ +# Service name used if none is provided in the app +defaultServiceName: java-app + +# The writer to use. +# Could be: LoggingWritter or DDAgentWriter (default) +writer: + # LoggingWriter: Spans are logged using the application configuration + # DDAgentWriter: Spans are forwarding to a Datadog Agent + # - Param 'host': the hostname where the DD Agent running (default: localhost) + # - Param 'port': the port to reach the DD Agent (default: 8126) + type: DDAgentWriter + host: foo + port: 123 + +# The sampler to use. +# Could be: AllSampler (default) or RateSampler +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 + +# Enable custom tracing (annotations) +# enableCustomTracing: true \ No newline at end of file diff --git a/dd-trace/src/test/resources/dd-trace-2.yaml b/dd-trace/src/test/resources/dd-trace-2.yaml new file mode 100644 index 0000000000..9e5ded6b1c --- /dev/null +++ b/dd-trace/src/test/resources/dd-trace-2.yaml @@ -0,0 +1,23 @@ +# Service name used if none is provided in the app +defaultServiceName: java-app + +# The writer to use. +# Could be: LoggingWritter or DDAgentWriter (default) +writer: + # LoggingWriter: Spans are logged using the application configuration + # DDAgentWriter: Spans are forwarding to a Datadog Agent + # - Param 'host': the hostname where the DD Agent running (default: localhost) + # - Param 'port': the port to reach the DD Agent (default: 8126) + type: DDAgentWriter + +# The sampler to use. +# Could be: AllSampler (default) or RateSampler +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: RateSampler + rate: 0.4 + +# Enable custom tracing (annotations) +# enableCustomTracing: true \ No newline at end of file