Add Builder to DDTracer

Deprecate previous constructors.
This commit is contained in:
Tyler Benson 2020-01-14 17:05:05 -08:00
parent e05c892271
commit e31cbd6c89
22 changed files with 154 additions and 117 deletions

View File

@ -11,7 +11,7 @@ public class TracerInstaller {
public static synchronized void installGlobalTracer() {
if (Config.get().isTraceEnabled()) {
if (!io.opentracing.util.GlobalTracer.isRegistered()) {
final DDTracer tracer = new DDTracer();
final DDTracer tracer = DDTracer.builder().build();
try {
io.opentracing.util.GlobalTracer.register(tracer);
datadog.trace.api.GlobalTracer.registerIfAbsent(tracer);

View File

@ -95,7 +95,7 @@ public abstract class AgentTestRunner extends DDSpecification {
return result;
}
};
TEST_TRACER = new DDTracer(TEST_WRITER);
TEST_TRACER = DDTracer.builder().writer(TEST_WRITER).build();
GlobalTracerUtils.registerOrReplaceGlobalTracer((Tracer) TEST_TRACER);
GlobalTracer.registerIfAbsent((datadog.trace.api.Tracer) TEST_TRACER);
}

View File

@ -96,28 +96,68 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
private final HttpCodec.Injector injector;
private final HttpCodec.Extractor extractor;
public static class Builder {
public Builder() {
// Apply the default values from config.
withConfig(Config.get());
}
public Builder writer(final Writer writer) {
if (this.writer != null && this.writer != writer) {
// Try to avoid leaking resources
this.writer.close();
}
this.writer = writer;
return this;
}
public Builder withProperties(final Properties properties) {
return withConfig(Config.get(properties));
}
public Builder withConfig(final Config config) {
serviceName(config.getServiceName());
writer(Writer.Builder.forConfig(config));
sampler(Sampler.Builder.forConfig(config));
injector(HttpCodec.createInjector(config));
extractor(HttpCodec.createExtractor(config, config.getHeaderTags()));
localRootSpanTags(config.getLocalRootSpanTags());
defaultSpanTags(config.getMergedSpanTags());
serviceNameMappings(config.getServiceMapping());
taggedHeaders(config.getHeaderTags());
partialFlushMinSpans(config.getPartialFlushMinSpans());
return this;
}
}
/** By default, report to local agent and collect all traces. */
@Deprecated
public DDTracer() {
this(Config.get());
}
@Deprecated
public DDTracer(final String serviceName) {
this(serviceName, Config.get());
}
@Deprecated
public DDTracer(final Properties config) {
this(Config.get(config));
}
@Deprecated
public DDTracer(final Config config) {
this(config.getServiceName(), config);
}
// This constructor is already used in the wild, so we have to keep it inside this API for now.
@Deprecated
public DDTracer(final String serviceName, final Writer writer, final Sampler sampler) {
this(serviceName, writer, sampler, Config.get().getLocalRootSpanTags());
}
@Deprecated
private DDTracer(final String serviceName, final Config config) {
this(
serviceName,
@ -132,6 +172,7 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
}
/** Visible for testing */
@Deprecated
DDTracer(
final String serviceName,
final Writer writer,
@ -148,10 +189,12 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
0);
}
@Deprecated
public DDTracer(final Writer writer) {
this(Config.get(), writer);
}
@Deprecated
public DDTracer(final Config config, final Writer writer) {
this(
config.getServiceName(),
@ -164,9 +207,6 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
config.getPartialFlushMinSpans());
}
/**
* @deprecated Use {@link #DDTracer(String, Writer, Sampler, Map, Map, Map, Map, int)} instead.
*/
@Deprecated
public DDTracer(
final String serviceName,
@ -188,9 +228,6 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
Config.get().getPartialFlushMinSpans());
}
/**
* @deprecated Use {@link #DDTracer(String, Writer, Sampler, Map, Map, Map, Map, int)} instead.
*/
@Deprecated
public DDTracer(
final String serviceName,
@ -211,6 +248,7 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
Config.get().getPartialFlushMinSpans());
}
@Deprecated
public DDTracer(
final String serviceName,
final Writer writer,
@ -220,6 +258,34 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
final Map<String, String> serviceNameMappings,
final Map<String, String> taggedHeaders,
final int partialFlushMinSpans) {
this(
serviceName,
writer,
sampler,
HttpCodec.createInjector(Config.get()),
HttpCodec.createExtractor(Config.get(), taggedHeaders),
localRootSpanTags,
defaultSpanTags,
serviceNameMappings,
taggedHeaders,
partialFlushMinSpans);
}
@lombok.Builder(builderClassName = "Builder")
// These field names must be stable to ensure the builder api is stable.
private DDTracer(
final String serviceName,
final Writer writer,
final Sampler sampler,
final HttpCodec.Injector injector,
final HttpCodec.Extractor extractor,
final Map<String, String> localRootSpanTags,
final Map<String, String> defaultSpanTags,
final Map<String, String> serviceNameMappings,
final Map<String, String> taggedHeaders,
final int partialFlushMinSpans) {
assert writer != null;
assert localRootSpanTags != null;
assert defaultSpanTags != null;
assert serviceNameMappings != null;
@ -227,13 +293,16 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
this.serviceName = serviceName;
this.writer = writer;
this.writer.start();
this.sampler = sampler;
this.injector = injector;
this.extractor = extractor;
this.localRootSpanTags = localRootSpanTags;
this.defaultSpanTags = defaultSpanTags;
this.serviceNameMappings = serviceNameMappings;
this.partialFlushMinSpans = partialFlushMinSpans;
this.writer.start();
shutdownCallback = new ShutdownHook(this);
try {
Runtime.getRuntime().addShutdownHook(shutdownCallback);
@ -241,10 +310,6 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
// The JVM is already shutting down.
}
// TODO: we have too many constructors, we should move to some sort of builder approach
injector = HttpCodec.createInjector(Config.get());
extractor = HttpCodec.createExtractor(Config.get(), taggedHeaders);
if (this.writer instanceof DDAgentWriter && sampler instanceof DDAgentResponseListener) {
((DDAgentWriter) this.writer).addResponseListener((DDAgentResponseListener) this.sampler);
}

View File

@ -16,7 +16,7 @@ public class DDTracerResolver extends TracerResolver {
Tracer resolve(final Config config) {
if (config.isTraceResolverEnabled()) {
log.info("Creating DDTracer with DDTracerResolver");
return new DDTracer();
return DDTracer.builder().withConfig(config).build();
} else {
log.info("DDTracerResolver disabled");
return null;

View File

@ -17,7 +17,7 @@ class OT31ApiTest extends DDSpecification {
static final WRITER = new ListWriter()
@Subject
Tracer tracer = new DDTracer(WRITER)
Tracer tracer = DDTracer.builder().writer(WRITER).build()
def "test startActive"() {
when:

View File

@ -13,7 +13,7 @@ class OT33ApiTest extends DDSpecification {
static final WRITER = new ListWriter()
@Subject
Tracer tracer = new DDTracer(WRITER)
Tracer tracer = DDTracer.builder().writer(WRITER).build()
def "test start"() {
when:

View File

@ -16,7 +16,7 @@ class DDSpanBuilderTest extends DDSpecification {
def writer = new ListWriter()
def config = Config.get()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
def "build simple span"() {
setup:
@ -458,7 +458,7 @@ class DDSpanBuilderTest extends DDSpecification {
setup:
System.setProperty("dd.trace.span.tags", tagString)
def config = new Config()
tracer = new DDTracer(config, writer)
tracer = DDTracer.builder().withConfig(config).writer(writer).build()
def span = tracer.buildSpan("op name").withServiceName("foo").start()
expect:

View File

@ -40,7 +40,7 @@ class DDSpanSerializationTest extends DDSpecification {
expected.put("trace_id", 1l)
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
final DDSpanContext context =
new DDSpanContext(
1G,
@ -81,7 +81,7 @@ class DDSpanSerializationTest extends DDSpecification {
setup:
def objectMapper = new ObjectMapper(new MessagePackFactory())
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
def context = new DDSpanContext(
value,
value,

View File

@ -17,7 +17,7 @@ class DDSpanTest extends DDSpecification {
def writer = new ListWriter()
def sampler = new RateByServiceSampler()
def tracer = new DDTracer(DEFAULT_SERVICE_NAME, writer, sampler, [:])
def tracer = DDTracer.builder().writer(writer).sampler(sampler).build()
def "getters and setters"() {
setup:
@ -91,7 +91,7 @@ class DDSpanTest extends DDSpecification {
when:
final String resourceName = "fake"
final String serviceName = "myService"
span = new DDTracer()
span = DDTracer.builder().build()
.buildSpan(opName)
.withResourceName(resourceName)
.withServiceName(serviceName)

View File

@ -23,7 +23,7 @@ class PendingTraceTest extends DDSpecification {
PendingTraceTest.this.traceCount.incrementAndGet()
}
}
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
BigInteger traceId = BigInteger.valueOf(System.identityHashCode(this))
@ -195,7 +195,7 @@ class PendingTraceTest extends DDSpecification {
def properties = new Properties()
properties.setProperty(PARTIAL_FLUSH_MIN_SPANS, "1")
def config = Config.get(properties)
def tracer = new DDTracer(config, writer)
def tracer = DDTracer.builder().withConfig(config).writer(writer).build()
def trace = new PendingTrace(tracer, traceId, [:])
def rootSpan = SpanFactory.newSpanOf(trace)
def child1 = tracer.buildSpan("child1").asChildOf(rootSpan).start()
@ -241,7 +241,7 @@ class PendingTraceTest extends DDSpecification {
def properties = new Properties()
properties.setProperty(PARTIAL_FLUSH_MIN_SPANS, "1")
def config = Config.get(properties)
def tracer = new DDTracer(config, writer)
def tracer = DDTracer.builder().withConfig(config).writer(writer).build()
def trace = new PendingTrace(tracer, traceId, [:])
def rootSpan = SpanFactory.newSpanOf(trace)
def child1 = tracer.buildSpan("child1").asChildOf(rootSpan).start()

View File

@ -8,7 +8,7 @@ class SpanFactory {
static DDSpan newSpanOf(long timestampMicro, String threadName = Thread.currentThread().name) {
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
def currentThreadName = Thread.currentThread().getName()
Thread.currentThread().setName(threadName)
def context = new DDSpanContext(
@ -70,7 +70,7 @@ class SpanFactory {
static DDSpan newSpanOf(String serviceName, String envName) {
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
def context = new DDSpanContext(
1G,
1G,

View File

@ -10,7 +10,7 @@ class TraceCorrelationTest extends DDSpecification {
static final WRITER = new ListWriter()
@Shared
DDTracer tracer = new DDTracer(WRITER)
DDTracer tracer = DDTracer.builder().writer(WRITER).build()
def scope = tracer.buildSpan("test").startActive(true)

View File

@ -12,7 +12,7 @@ import java.util.concurrent.atomic.AtomicBoolean
class TraceInterceptorTest extends DDSpecification {
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
def "interceptor is registered as a service"() {
expect:

View File

@ -16,7 +16,6 @@ import io.opentracing.tag.Tags
import static datadog.trace.api.Config.DEFAULT_SERVICE_NAME
import static datadog.trace.api.DDTags.ANALYTICS_SAMPLE_RATE
import static java.util.Collections.emptyMap
class SpanDecoratorTest extends DDSpecification {
static {
@ -30,7 +29,7 @@ class SpanDecoratorTest extends DDSpecification {
System.clearProperty("dd.$Config.SPLIT_BY_TAGS")
}
}
def tracer = new DDTracer(new LoggingWriter())
def tracer = DDTracer.builder().writer(new LoggingWriter()).build()
def span = SpanFactory.newSpanOf(tracer)
def "adding span personalisation using Decorators"() {
@ -55,16 +54,12 @@ class SpanDecoratorTest extends DDSpecification {
def "set service name"() {
setup:
tracer = new DDTracer(
"wrong-service",
new LoggingWriter(),
new AllSampler(),
"some-runtime-id",
emptyMap(),
emptyMap(),
mapping,
emptyMap()
)
tracer = DDTracer.builder()
.serviceName("wrong-service")
.writer(new LoggingWriter())
.sampler(new AllSampler())
.serviceNameMappings(mapping)
.build()
when:
def span = tracer.buildSpan("some span").withTag(tag, name).start()
@ -91,16 +86,12 @@ class SpanDecoratorTest extends DDSpecification {
def "default or configured service name can be remapped without setting tag"() {
setup:
tracer = new DDTracer(
serviceName,
new LoggingWriter(),
new AllSampler(),
"some-runtime-id",
emptyMap(),
emptyMap(),
mapping,
emptyMap()
)
tracer = DDTracer.builder()
.serviceName(serviceName)
.writer(new LoggingWriter())
.sampler(new AllSampler())
.serviceNameMappings(mapping)
.build()
when:
def span = tracer.buildSpan("some span").start()
@ -138,16 +129,12 @@ class SpanDecoratorTest extends DDSpecification {
def "set service name from servlet.context with context '#context' for service #serviceName"() {
setup:
tracer = new DDTracer(
serviceName,
new LoggingWriter(),
new AllSampler(),
"some-runtime-id",
emptyMap(),
emptyMap(),
mapping,
emptyMap()
)
tracer = DDTracer.builder()
.serviceName(serviceName)
.writer(new LoggingWriter())
.sampler(new AllSampler())
.serviceNameMappings(mapping)
.build()
when:
def span = tracer.buildSpan("some span").start()
@ -172,16 +159,12 @@ class SpanDecoratorTest extends DDSpecification {
}
static createSplittingTracer(tag) {
def tracer = new DDTracer(
"my-service",
new LoggingWriter(),
new AllSampler(),
"some-runtime-id",
emptyMap(),
emptyMap(),
emptyMap(),
emptyMap()
)
def tracer = DDTracer.builder()
.serviceName("my-service")
.writer(new LoggingWriter())
.sampler(new AllSampler())
.build()
// equivalent to split-by-tags: tag
tracer.addDecorator(new ServiceNameDecorator(tag, true))
@ -477,16 +460,11 @@ class SpanDecoratorTest extends DDSpecification {
System.setProperty("dd.trace." + PeerServiceDecorator.getSimpleName().toLowerCase() + ".enabled", "false")
}
tracer = new DDTracer(
"some-service",
new LoggingWriter(),
new AllSampler(),
"some-runtime-id",
emptyMap(),
emptyMap(),
emptyMap(),
emptyMap()
)
tracer = DDTracer.builder()
.serviceName("some-service")
.writer(new LoggingWriter())
.sampler(new AllSampler())
.build()
when:
def span = tracer.buildSpan("some span").withTag(Tags.PEER_SERVICE.key, "peer-service").start()
@ -507,16 +485,11 @@ class SpanDecoratorTest extends DDSpecification {
System.setProperty("dd.trace." + ServiceNameDecorator.getSimpleName().toLowerCase() + ".enabled", "false")
}
tracer = new DDTracer(
"some-service",
new LoggingWriter(),
new AllSampler(),
"some-runtime-id",
emptyMap(),
emptyMap(),
emptyMap(),
emptyMap()
)
tracer = DDTracer.builder()
.serviceName("some-service")
.writer(new LoggingWriter())
.sampler(new AllSampler())
.build()
when:
def span = tracer.buildSpan("some span").withTag(tag, name).start()

View File

@ -12,7 +12,7 @@ import spock.lang.Subject
class URLAsResourceNameTest extends DDSpecification {
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
@Subject
def decorator = new URLAsResourceName()

View File

@ -20,7 +20,7 @@ class B3HttpInjectorTest extends DDSpecification {
def "inject http headers"() {
setup:
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
final DDSpanContext mockedContext =
new DDSpanContext(
traceId,

View File

@ -22,7 +22,7 @@ class DatadogHttpInjectorTest extends DDSpecification {
def "inject http headers"() {
setup:
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
final DDSpanContext mockedContext =
new DDSpanContext(
traceId,

View File

@ -20,7 +20,7 @@ class HaystackHttpInjectorTest extends DDSpecification {
def "inject http headers"() {
setup:
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
final DDSpanContext mockedContext =
new DDSpanContext(
traceId,

View File

@ -25,7 +25,7 @@ class HttpInjectorTest extends DDSpecification {
def spanId = 2G
def writer = new ListWriter()
def tracer = new DDTracer(writer)
def tracer = DDTracer.builder().writer(writer).build()
final DDSpanContext mockedContext =
new DDSpanContext(
traceId,

View File

@ -40,7 +40,7 @@ class DDTracerTest extends DDSpecification {
def "verify defaults on tracer"() {
when:
def tracer = new DDTracer()
def tracer = DDTracer.builder().build()
then:
tracer.serviceName == "unnamed-java-app"
@ -63,7 +63,7 @@ class DDTracerTest extends DDSpecification {
System.setProperty(PREFIX + HEALTH_METRICS_ENABLED, "true")
when:
def tracer = new DDTracer(new Config())
def tracer = DDTracer.builder().withConfig(new Config()).build()
then:
tracer.writer.monitor instanceof Monitor.StatsD
@ -75,7 +75,7 @@ class DDTracerTest extends DDSpecification {
setup:
System.setProperty(PREFIX + PRIORITY_SAMPLING, "false")
when:
def tracer = new DDTracer(new Config())
def tracer = DDTracer.builder().withConfig(new Config()).build()
then:
tracer.sampler instanceof AllSampler
}
@ -85,7 +85,7 @@ class DDTracerTest extends DDSpecification {
System.setProperty(PREFIX + WRITER_TYPE, "LoggingWriter")
when:
def tracer = new DDTracer(new Config())
def tracer = DDTracer.builder().withConfig(new Config()).build()
then:
tracer.writer instanceof LoggingWriter
@ -98,8 +98,7 @@ class DDTracerTest extends DDSpecification {
System.setProperty(PREFIX + HEADER_TAGS, mapString)
when:
def config = new Config()
def tracer = new DDTracer(config)
def tracer = DDTracer.builder().withConfig(new Config()).build()
// Datadog extractor gets placed first
def taggedHeaders = tracer.extractor.extractors[0].taggedHeaders
@ -117,7 +116,7 @@ class DDTracerTest extends DDSpecification {
def "verify overriding host"() {
when:
System.setProperty(PREFIX + key, value)
def tracer = new DDTracer(new Config())
def tracer = DDTracer.builder().withConfig(new Config()).build()
then:
tracer.writer instanceof DDAgentWriter
@ -132,7 +131,7 @@ class DDTracerTest extends DDSpecification {
def "verify overriding port"() {
when:
System.setProperty(PREFIX + key, value)
def tracer = new DDTracer(new Config())
def tracer = DDTracer.builder().withConfig(new Config()).build()
then:
tracer.writer instanceof DDAgentWriter
@ -148,7 +147,7 @@ class DDTracerTest extends DDSpecification {
def "Writer is instance of LoggingWriter when property set"() {
when:
System.setProperty(PREFIX + "writer.type", "LoggingWriter")
def tracer = new DDTracer(new Config())
def tracer = DDTracer.builder().withConfig(new Config()).build()
then:
tracer.writer instanceof LoggingWriter
@ -173,7 +172,7 @@ class DDTracerTest extends DDSpecification {
def "Shares TraceCount with DDApi with #key = #value"() {
setup:
System.setProperty(PREFIX + key, value)
final DDTracer tracer = new DDTracer(new Config())
final DDTracer tracer = DDTracer.builder().build()
expect:
tracer.writer instanceof DDAgentWriter
@ -187,7 +186,7 @@ class DDTracerTest extends DDSpecification {
def "root tags are applied only to root spans"() {
setup:
def tracer = new DDTracer('my_service', new ListWriter(), new AllSampler(), '', ['only_root': 'value'], [:], [:], [:])
def tracer = DDTracer.builder().localRootSpanTags(['only_root': 'value']).build()
def root = tracer.buildSpan('my_root').start()
def child = tracer.buildSpan('my_child').asChildOf(root).start()
@ -204,7 +203,7 @@ class DDTracerTest extends DDSpecification {
given:
Properties properties = new Properties()
properties.setProperty("writer.type", "LoggingWriter")
def tracer = new DDTracer(new Config(properties, Config.get()))
def tracer = DDTracer.builder().withProperties(properties).build()
when:
def span = tracer.buildSpan("operation").start()
@ -218,7 +217,7 @@ class DDTracerTest extends DDSpecification {
given:
Properties properties = new Properties()
properties.setProperty("writer.type", "LoggingWriter")
def tracer = new DDTracer(new Config(properties, Config.get()))
def tracer = DDTracer.builder().withProperties(properties).build()
when:
def root = tracer.buildSpan("operation").start()
@ -240,7 +239,7 @@ class DDTracerTest extends DDSpecification {
given:
Properties properties = new Properties()
properties.setProperty("writer.type", "LoggingWriter")
def tracer = new DDTracer(new Config(properties, Config.get()))
def tracer = DDTracer.builder().withProperties(properties).build()
def injector = Mock(TextMapInject)
when:
@ -261,7 +260,7 @@ class DDTracerTest extends DDSpecification {
def "span priority only set after first injection"() {
given:
def sampler = new ControllableSampler()
def tracer = new DDTracer("serviceName", new LoggingWriter(), sampler)
def tracer = DDTracer.builder().writer(new LoggingWriter()).sampler(sampler).build()
def injector = Mock(TextMapInject)
when:
@ -294,7 +293,7 @@ class DDTracerTest extends DDSpecification {
def "injection doesn't override set priority"() {
given:
def sampler = new ControllableSampler()
def tracer = new DDTracer("serviceName", new LoggingWriter(), sampler)
def tracer = DDTracer.builder().writer(new LoggingWriter()).sampler(sampler).build()
def injector = Mock(TextMapInject)
when:

View File

@ -74,7 +74,7 @@ class RateByServiceSamplerTest extends DDSpecification {
def "sampling priority set when service later"() {
def sampler = new RateByServiceSampler()
def tracer = new DDTracer("serviceName", new LoggingWriter(), sampler)
def tracer = DDTracer.builder().writer(new LoggingWriter()).sampler(sampler).build()
sampler.onResponse("test", new ObjectMapper()
.readTree('{"rate_by_service":{"service:,env:":1.0,"service:spock,env:":0.0}}'))
@ -103,7 +103,7 @@ class RateByServiceSamplerTest extends DDSpecification {
def "setting forced tracing via tag"() {
when:
def sampler = new RateByServiceSampler()
def tracer = new DDTracer("serviceName", new LoggingWriter(), sampler)
def tracer = DDTracer.builder().writer(new LoggingWriter()).sampler(sampler).build()
def span = tracer.buildSpan("root").start()
if (tagName) {
span.setTag(tagName, tagValue)
@ -122,7 +122,7 @@ class RateByServiceSamplerTest extends DDSpecification {
def "not setting forced tracing via tag or setting it wrong value not causing exception"() {
setup:
def sampler = new RateByServiceSampler()
def tracer = new DDTracer("serviceName", new LoggingWriter(), sampler)
def tracer = DDTracer.builder().writer(new LoggingWriter()).sampler(sampler).build()
def span = tracer.buildSpan("root").start()
if (tagName) {
span.setTag(tagName, tagValue)

View File

@ -23,7 +23,7 @@ class DDApiIntegrationTest {
@Requires({ "true" == System.getenv("CI") || jvm.java8Compatible })
static class DDAgentApiIntegrationV4Test extends DDSpecification {
static final WRITER = new ListWriter()
static final TRACER = new DDTracer(WRITER)
static final TRACER = DDTracer.builder().writer(WRITER).build()
static final CONTEXT = new DDSpanContext(
1G,
1G,