Skip to content

Commit 329f6fe

Browse files
committed
Lazily load and execute service discovery
1 parent bdc4e71 commit 329f6fe

File tree

3 files changed

+41
-17
lines changed

3 files changed

+41
-17
lines changed

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,22 @@ private static void maybeEnableServiceDiscovery(CoreTracerBuilder tracerBuilder)
5252
log.debug("service discovery not supported on native images");
5353
return;
5454
}
55-
try {
56-
// use reflection to load MemFDUnixWriter so it doesn't get picked up when we transitively
57-
// look for all tracer class dependencies to install in GraalVM via VMRuntimeInstrumentation
58-
Class<?> memFdClass =
59-
Class.forName("datadog.trace.agent.tooling.servicediscovery.MemFDUnixWriter");
60-
ForeignMemoryWriter memFd = (ForeignMemoryWriter) memFdClass.getConstructor().newInstance();
61-
tracerBuilder.serviceDiscovery(new ServiceDiscovery(memFd));
62-
} catch (Throwable e) {
63-
log.debug("service discovery not supported", e);
64-
}
55+
tracerBuilder.serviceDiscoveryFactory(
56+
() -> {
57+
try {
58+
// use reflection to load MemFDUnixWriter so it doesn't get picked up when we
59+
// transitively look for all tracer class dependencies to install in GraalVM via
60+
// VMRuntimeInstrumentation
61+
Class<?> memFdClass =
62+
Class.forName("datadog.trace.agent.tooling.servicediscovery.MemFDUnixWriter");
63+
ForeignMemoryWriter memFd =
64+
(ForeignMemoryWriter) memFdClass.getConstructor().newInstance();
65+
return new ServiceDiscovery(memFd);
66+
} catch (Throwable e) {
67+
log.debug("service discovery not supported", e);
68+
return null;
69+
}
70+
});
6571
}
6672

6773
public static void installGlobalTracer(final CoreTracer tracer) {

dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
import datadog.trace.core.propagation.XRayPropagator;
9898
import datadog.trace.core.scopemanager.ContinuableScopeManager;
9999
import datadog.trace.core.servicediscovery.ServiceDiscovery;
100+
import datadog.trace.core.servicediscovery.ServiceDiscoveryFactory;
100101
import datadog.trace.core.taginterceptor.RuleFlags;
101102
import datadog.trace.core.taginterceptor.TagInterceptor;
102103
import datadog.trace.core.traceinterceptor.LatencyTraceInterceptor;
@@ -322,7 +323,7 @@ public static class CoreTracerBuilder {
322323
private TagInterceptor tagInterceptor;
323324
private boolean strictTraceWrites;
324325
private InstrumentationGateway instrumentationGateway;
325-
private ServiceDiscovery serviceDiscovery;
326+
private ServiceDiscoveryFactory serviceDiscoveryFactory;
326327
private TimeSource timeSource;
327328
private DataStreamsMonitoring dataStreamsMonitoring;
328329
private ProfilingContextIntegration profilingContextIntegration =
@@ -438,8 +439,9 @@ public CoreTracerBuilder instrumentationGateway(InstrumentationGateway instrumen
438439
return this;
439440
}
440441

441-
public CoreTracerBuilder serviceDiscovery(ServiceDiscovery serviceDiscovery) {
442-
this.serviceDiscovery = serviceDiscovery;
442+
public CoreTracerBuilder serviceDiscoveryFactory(
443+
ServiceDiscoveryFactory serviceDiscoveryFactory) {
444+
this.serviceDiscoveryFactory = serviceDiscoveryFactory;
443445
return this;
444446
}
445447

@@ -535,7 +537,7 @@ public CoreTracer build() {
535537
tagInterceptor,
536538
strictTraceWrites,
537539
instrumentationGateway,
538-
serviceDiscovery,
540+
serviceDiscoveryFactory,
539541
timeSource,
540542
dataStreamsMonitoring,
541543
profilingContextIntegration,
@@ -628,7 +630,7 @@ private CoreTracer(
628630
final TagInterceptor tagInterceptor,
629631
final boolean strictTraceWrites,
630632
final InstrumentationGateway instrumentationGateway,
631-
final ServiceDiscovery serviceDiscovery,
633+
final ServiceDiscoveryFactory serviceDiscoveryFactory,
632634
final TimeSource timeSource,
633635
final DataStreamsMonitoring dataStreamsMonitoring,
634636
final ProfilingContextIntegration profilingContextIntegration,
@@ -897,8 +899,18 @@ private CoreTracer(
897899

898900
this.localRootSpanTagsNeedIntercept =
899901
this.tagInterceptor.needsIntercept(this.localRootSpanTags);
900-
if (serviceDiscovery != null) {
901-
serviceDiscovery.writeTracerMetadata(config);
902+
if (serviceDiscoveryFactory != null) {
903+
AgentTaskScheduler.get()
904+
.schedule(
905+
() -> {
906+
final ServiceDiscovery serviceDiscovery =
907+
serviceDiscoveryFactory.createServiceDiscovery();
908+
if (serviceDiscovery != null) {
909+
serviceDiscovery.writeTracerMetadata(config);
910+
}
911+
},
912+
1,
913+
SECONDS);
902914
}
903915
}
904916

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package datadog.trace.core.servicediscovery;
2+
3+
@FunctionalInterface
4+
public interface ServiceDiscoveryFactory {
5+
ServiceDiscovery createServiceDiscovery();
6+
}

0 commit comments

Comments
 (0)