Refactor the configuration
MODIFY
dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerFactory.java
dd-trace/src/main/java/com/datadoghq/trace/resolver/DDTracerFactory.java
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,6 +20,11 @@ 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
*
@@ -31,34 +35,41 @@ public class DDTracerFactory {
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() {

MODIFY
dd-trace/src/main/java/com/datadoghq/trace/resolver/TracerConfig.java
dd-trace/src/main/java/com/datadoghq/trace/resolver/TracerConfig.java
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<String,Object> writer;
- private Map<String,Object> sampler;
+ private WriterConfig writer;
+ private SamplerConfig sampler;
private List<DDSpanDecoratorConfig> decorators;
+
public String getDefaultServiceName() {
return defaultServiceName;
}
+
public void setDefaultServiceName(String defaultServiceName) {
this.defaultServiceName = defaultServiceName;
}
- public Map<String, Object> getWriter() {
+
+ public WriterConfig getWriter() {
return writer;
}
- public void setWriter(Map<String, Object> writer) {
+
+ public void setWriter(WriterConfig writer) {
this.writer = writer;
}
- public Map<String, Object> getSampler() {
+
+ public SamplerConfig getSampler() {
return sampler;
}
- public void setSampler(Map<String, Object> sampler) {
+
+ public void setSampler(SamplerConfig sampler) {
this.sampler = sampler;
}
+
public List<DDSpanDecoratorConfig> getDecorators() {
return decorators;
}
+
public void setDecorators(List<DDSpanDecoratorConfig> decorators) {
this.decorators = decorators;
}
@@ -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;
+ }
}

ADD
dd-trace/src/test/java/com/datadoghq/trace/resolver/DDTracerFactoryTest.java
+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

ADD
dd-trace/src/test/resources/dd-trace-1.yaml
+# 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

ADD
dd-trace/src/test/resources/dd-trace-2.yaml
+# 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

Refactor the configuration