Skip to content

Commit 8f47b66

Browse files
authored
Remove tracing requirement to be enabled to generate a flare (#9579)
1 parent 61c2d97 commit 8f47b66

File tree

9 files changed

+93
-48
lines changed

9 files changed

+93
-48
lines changed

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ public boolean isEnabledByDefault() {
177177
private static boolean llmObsAgentlessEnabled = false;
178178
private static boolean usmEnabled = false;
179179
private static boolean telemetryEnabled = true;
180+
private static boolean flareEnabled = true;
180181
private static boolean dynamicInstrumentationEnabled = false;
181182
private static boolean exceptionReplayEnabled = false;
182183
private static boolean codeOriginEnabled = false;
@@ -205,6 +206,7 @@ public static void start(
205206
// these default services are not used during native-image builds
206207
remoteConfigEnabled = false;
207208
telemetryEnabled = false;
209+
flareEnabled = false;
208210
// apply trace instrumentation, but skip other products at native-image build time
209211
startDatadogAgent(initTelemetry, inst);
210212
StaticEventLogger.end("Agent.start");
@@ -485,6 +487,10 @@ public static void shutdown(final boolean sync) {
485487
if (telemetryEnabled) {
486488
stopTelemetry();
487489
}
490+
if (flareEnabled) {
491+
stopFlarePoller();
492+
}
493+
488494
if (agentlessLogSubmissionEnabled) {
489495
shutdownLogsIntake();
490496
}
@@ -641,6 +647,9 @@ public void execute() {
641647
if (telemetryEnabled) {
642648
startTelemetry(instrumentation, scoClass, sco);
643649
}
650+
if (flareEnabled) {
651+
startFlarePoller(scoClass, sco);
652+
}
644653
}
645654

646655
private void resumeRemoteComponents() {
@@ -1106,6 +1115,34 @@ private static void stopTelemetry() {
11061115
}
11071116
}
11081117

1118+
private static void startFlarePoller(Class<?> scoClass, Object sco) {
1119+
StaticEventLogger.begin("Flare Poller");
1120+
try {
1121+
final Class<?> tracerFlarePollerClass =
1122+
AGENT_CLASSLOADER.loadClass("datadog.flare.TracerFlarePoller");
1123+
final Method tracerFlarePollerStartMethod =
1124+
tracerFlarePollerClass.getMethod("start", scoClass);
1125+
tracerFlarePollerStartMethod.invoke(null, sco);
1126+
} catch (final Throwable e) {
1127+
log.warn("Unable start Flare Poller", e);
1128+
}
1129+
StaticEventLogger.end("Flare Poller");
1130+
}
1131+
1132+
private static void stopFlarePoller() {
1133+
if (AGENT_CLASSLOADER == null) {
1134+
return;
1135+
}
1136+
try {
1137+
final Class<?> tracerFlarePollerClass =
1138+
AGENT_CLASSLOADER.loadClass("datadog.flare.TracerFlarePoller");
1139+
final Method tracerFlarePollerStopMethod = tracerFlarePollerClass.getMethod("stop");
1140+
tracerFlarePollerStopMethod.invoke(null);
1141+
} catch (final Throwable ex) {
1142+
log.warn("Error encountered while stopping Flare Poller", ex);
1143+
}
1144+
}
1145+
11091146
private static void initializeDelayedCrashTracking() {
11101147
initializeCrashTracking(true, isCrashTrackingAutoconfigEnabled());
11111148
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static synchronized void installGlobalTracer(
2121
CoreTracer.builder()
2222
.sharedCommunicationObjects(sharedCommunicationObjects)
2323
.profilingContextIntegration(profilingContextIntegration)
24-
.pollForTracerFlareRequests()
24+
.reportInTracerFlare()
2525
.pollForTracingConfiguration()
2626
.build();
2727
installGlobalTracer(tracer);

dd-java-agent/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,10 @@ dependencies {
295295
// do not bring along slf4j and dependent subprojects
296296
// (which are loaded on the bootstrap cl)
297297
}
298+
299+
sharedShadowInclude project(':utils:flare-utils'), {
300+
transitive = false
301+
}
298302
sharedShadowInclude libs.bundles.cafe.crypto
299303
sharedShadowInclude project(':remote-config:remote-config-api'), {
300304
transitive = false

dd-trace-core/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ excludedClassesCoverage += [
3636
'datadog.trace.common.writer.TraceProcessingWorker.NonDaemonTraceSerializingHandler',
3737
// Interface with an empty defender method
3838
'datadog.trace.core.propagation.HttpCodec.Extractor',
39-
'datadog.trace.core.flare.*',
4039
'datadog.trace.llmobs.writer.ddintake.LLMObsSpanMapper',
4140
'datadog.trace.llmobs.writer.ddintake.LLMObsSpanMapper.PayloadV1',
4241
// FIXME(DSM): test coverage needed

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

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@
8585
import datadog.trace.core.baggage.BaggagePropagator;
8686
import datadog.trace.core.datastreams.DataStreamsMonitoring;
8787
import datadog.trace.core.datastreams.DefaultDataStreamsMonitoring;
88-
import datadog.trace.core.flare.TracerFlarePoller;
8988
import datadog.trace.core.histogram.Histograms;
9089
import datadog.trace.core.monitor.HealthMetrics;
9190
import datadog.trace.core.monitor.MonitoringImpl;
@@ -131,7 +130,7 @@
131130
* datadog.trace.api.Tracer and TracerAPI, it coordinates many functions necessary creating,
132131
* reporting, and propagating traces
133132
*/
134-
public class CoreTracer implements AgentTracer.TracerAPI {
133+
public class CoreTracer implements AgentTracer.TracerAPI, TracerFlare.Reporter {
135134
private static final Logger log = LoggerFactory.getLogger(CoreTracer.class);
136135
// UINT64 max value
137136
public static final BigInteger TRACE_ID_MAX =
@@ -165,8 +164,6 @@ public static CoreTracerBuilder builder() {
165164
/** Nanosecond offset to counter clock drift */
166165
private volatile long counterDrift;
167166

168-
private final TracerFlarePoller tracerFlarePoller;
169-
170167
private final TracingConfigPoller tracingConfigPoller;
171168

172169
private final PendingTraceBuffer pendingTraceBuffer;
@@ -328,7 +325,7 @@ public static class CoreTracerBuilder {
328325
private DataStreamsMonitoring dataStreamsMonitoring;
329326
private ProfilingContextIntegration profilingContextIntegration =
330327
ProfilingContextIntegration.NoOp.INSTANCE;
331-
private boolean pollForTracerFlareRequests;
328+
private boolean reportInTracerFlare;
332329
private boolean pollForTracingConfiguration;
333330
private boolean injectBaggageAsTags;
334331
private boolean flushOnClose;
@@ -455,8 +452,8 @@ public CoreTracerBuilder profilingContextIntegration(
455452
return this;
456453
}
457454

458-
public CoreTracerBuilder pollForTracerFlareRequests() {
459-
this.pollForTracerFlareRequests = true;
455+
public CoreTracerBuilder reportInTracerFlare() {
456+
this.reportInTracerFlare = true;
460457
return this;
461458
}
462459

@@ -534,7 +531,7 @@ public CoreTracer build() {
534531
timeSource,
535532
dataStreamsMonitoring,
536533
profilingContextIntegration,
537-
pollForTracerFlareRequests,
534+
reportInTracerFlare,
538535
pollForTracingConfiguration,
539536
injectBaggageAsTags,
540537
flushOnClose);
@@ -566,7 +563,7 @@ private CoreTracer(
566563
final TimeSource timeSource,
567564
final DataStreamsMonitoring dataStreamsMonitoring,
568565
final ProfilingContextIntegration profilingContextIntegration,
569-
final boolean pollForTracerFlareRequests,
566+
final boolean reportInTracerFlare,
570567
final boolean pollForTracingConfiguration,
571568
final boolean injectBaggageAsTags,
572569
final boolean flushOnClose) {
@@ -594,7 +591,7 @@ private CoreTracer(
594591
timeSource,
595592
dataStreamsMonitoring,
596593
profilingContextIntegration,
597-
pollForTracerFlareRequests,
594+
reportInTracerFlare,
598595
pollForTracingConfiguration,
599596
injectBaggageAsTags,
600597
flushOnClose);
@@ -625,7 +622,7 @@ private CoreTracer(
625622
final TimeSource timeSource,
626623
final DataStreamsMonitoring dataStreamsMonitoring,
627624
final ProfilingContextIntegration profilingContextIntegration,
628-
final boolean pollForTracerFlareRequests,
625+
final boolean reportInTracerFlare,
629626
final boolean pollForTracingConfiguration,
630627
final boolean injectBaggageAsTags,
631628
final boolean flushOnClose) {
@@ -636,6 +633,9 @@ private CoreTracer(
636633
assert taggedHeaders != null;
637634
assert baggageMapping != null;
638635

636+
if (reportInTracerFlare) {
637+
TracerFlare.addReporter(this);
638+
}
639639
this.timeSource = timeSource == null ? SystemTimeSource.INSTANCE : timeSource;
640640
startTimeNano = this.timeSource.getCurrentTimeNanos();
641641
startNanoTicks = this.timeSource.getNanoTicks();
@@ -740,11 +740,6 @@ private CoreTracer(
740740
sharedCommunicationObjects.monitoring = monitoring;
741741
sharedCommunicationObjects.createRemaining(config);
742742

743-
tracerFlarePoller = new TracerFlarePoller(dynamicConfig);
744-
if (pollForTracerFlareRequests) {
745-
tracerFlarePoller.start(config, sharedCommunicationObjects, this);
746-
}
747-
748743
tracingConfigPoller = new TracingConfigPoller(dynamicConfig);
749744
if (pollForTracingConfiguration) {
750745
tracingConfigPoller.start(config, sharedCommunicationObjects);
@@ -1288,7 +1283,6 @@ public void close() {
12881283
metricsAggregator.close();
12891284
dataStreamsMonitoring.close();
12901285
externalAgentLauncher.close();
1291-
tracerFlarePoller.stop();
12921286
healthMetrics.close();
12931287
}
12941288

@@ -1342,7 +1336,9 @@ public TraceSegment getTraceSegment() {
13421336
return null;
13431337
}
13441338

1345-
public void addTracerReportToFlare(ZipOutputStream zip) throws IOException {
1339+
@Override
1340+
public void addReportToFlare(ZipOutputStream zip) throws IOException {
1341+
TracerFlare.addText(zip, "dynamic_config.txt", dynamicConfig.toString());
13461342
TracerFlare.addText(zip, "tracer_health.txt", healthMetrics.summary());
13471343
TracerFlare.addText(zip, "span_metrics.txt", SpanMetricRegistry.getInstance().summary());
13481344
}

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ include(
142142
":dd-java-agent:testing",
143143
":utils:config-utils",
144144
":utils:container-utils",
145+
":utils:flare-utils",
145146
":utils:socket-utils",
146147
":utils:test-agent-utils:decoder",
147148
":utils:test-utils",

utils/flare-utils/build.gradle.kts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
plugins {
2+
id("java-library")
3+
}
4+
5+
apply(from = "$rootDir/gradle/java.gradle")
6+
7+
dependencies {
8+
api(libs.okhttp)
9+
api(libs.moshi)
10+
11+
compileOnly(project(":communication"))
12+
implementation(project(":utils:version-utils"))
13+
implementation(project(":internal-api"))
14+
implementation(libs.slf4j)
15+
}

dd-trace-core/src/main/java/datadog/trace/core/flare/TracerFlarePoller.java renamed to utils/flare-utils/src/main/java/datadog/flare/TracerFlarePoller.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package datadog.trace.core.flare;
1+
package datadog.flare;
22

33
import com.squareup.moshi.Json;
44
import com.squareup.moshi.JsonAdapter;
@@ -10,8 +10,6 @@
1010
import datadog.remoteconfig.state.ConfigKey;
1111
import datadog.remoteconfig.state.ProductListener;
1212
import datadog.trace.api.Config;
13-
import datadog.trace.api.DynamicConfig;
14-
import datadog.trace.core.CoreTracer;
1513
import java.io.ByteArrayInputStream;
1614
import java.io.IOException;
1715
import java.util.HashMap;
@@ -20,28 +18,36 @@
2018

2119
public final class TracerFlarePoller {
2220
private static final String FLARE_LOG_LEVEL = "flare-log-level";
23-
private final DynamicConfig<?> dynamicConfig;
2421

2522
private Runnable stopPreparer;
2623
private Runnable stopSubmitter;
2724

2825
private TracerFlareService tracerFlareService;
2926

3027
private final Map<String, String> configAction = new HashMap<>();
28+
private static TracerFlarePoller INSTANCE;
3129

32-
public TracerFlarePoller(DynamicConfig<?> dynamicConfig) {
33-
this.dynamicConfig = dynamicConfig;
30+
public static void start(SharedCommunicationObjects sco) {
31+
if (null == INSTANCE) {
32+
INSTANCE = new TracerFlarePoller();
33+
}
34+
INSTANCE.doStart(sco);
3435
}
3536

36-
public void start(Config config, SharedCommunicationObjects sco, CoreTracer tracer) {
37+
public static void stop() {
38+
if (null != INSTANCE) {
39+
INSTANCE.doStop();
40+
}
41+
}
42+
43+
private void doStart(SharedCommunicationObjects sco) {
44+
Config config = Config.get();
3745
stopPreparer = new Preparer().register(config, sco);
3846
stopSubmitter = new Submitter().register(config, sco);
39-
40-
tracerFlareService =
41-
new TracerFlareService(config, dynamicConfig, sco.okHttpClient, sco.agentUrl, tracer);
47+
tracerFlareService = new TracerFlareService(config, sco.okHttpClient, sco.agentUrl);
4248
}
4349

44-
public void stop() {
50+
private void doStop() {
4551
if (null != stopPreparer) {
4652
stopPreparer.run();
4753
}

dd-trace-core/src/main/java/datadog/trace/core/flare/TracerFlareService.java renamed to utils/flare-utils/src/main/java/datadog/flare/TracerFlareService.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
package datadog.trace.core.flare;
1+
package datadog.flare;
22

3+
import static datadog.common.version.VersionInfo.VERSION;
34
import static datadog.trace.util.AgentThreadFactory.AgentThread.TRACER_FLARE;
45

56
import datadog.communication.http.OkHttpUtils;
67
import datadog.trace.api.Config;
7-
import datadog.trace.api.DynamicConfig;
88
import datadog.trace.api.flare.TracerFlare;
99
import datadog.trace.api.time.TimeUtils;
10-
import datadog.trace.core.CoreTracer;
11-
import datadog.trace.core.DDTraceCoreInfo;
1210
import datadog.trace.logging.GlobalLogLevelSwitcher;
1311
import datadog.trace.logging.LogLevel;
1412
import datadog.trace.util.AgentTaskScheduler;
@@ -54,27 +52,18 @@ final class TracerFlareService {
5452
private final AgentTaskScheduler scheduler = new AgentTaskScheduler(TRACER_FLARE);
5553

5654
private final Config config;
57-
private final DynamicConfig<?> dynamicConfig;
5855
private final OkHttpClient okHttpClient;
5956
private final HttpUrl flareUrl;
60-
private final CoreTracer tracer;
6157

6258
private boolean logLevelOverridden;
6359
private volatile long flareStartMillis;
6460

6561
private Scheduled<Runnable> scheduledCleanup;
6662

67-
TracerFlareService(
68-
Config config,
69-
DynamicConfig<?> dynamicConfig,
70-
OkHttpClient okHttpClient,
71-
HttpUrl agentUrl,
72-
CoreTracer tracer) {
63+
TracerFlareService(Config config, OkHttpClient okHttpClient, HttpUrl agentUrl) {
7364
this.config = config;
74-
this.dynamicConfig = dynamicConfig;
7565
this.okHttpClient = okHttpClient;
7666
this.flareUrl = agentUrl.newBuilder().addPathSegments(FLARE_ENDPOINT).build();
77-
this.tracer = tracer;
7867

7968
applyTriageReportTrigger(config.getTriageReportTrigger());
8069
}
@@ -213,7 +202,6 @@ private byte[] buildFlareZip(long startMillis, long endMillis, boolean dumpThrea
213202
addPrelude(zip, startMillis, endMillis);
214203
addConfig(zip);
215204
addRuntime(zip);
216-
tracer.addTracerReportToFlare(zip);
217205
TracerFlare.addReportsToFlare(zip);
218206
if (dumpThreads) {
219207
addThreadDump(zip);
@@ -227,12 +215,11 @@ private byte[] buildFlareZip(long startMillis, long endMillis, boolean dumpThrea
227215
private void addPrelude(ZipOutputStream zip, long startMillis, long endMillis)
228216
throws IOException {
229217
TracerFlare.addText(zip, "flare_info.txt", flareInfo(startMillis, endMillis));
230-
TracerFlare.addText(zip, "tracer_version.txt", DDTraceCoreInfo.VERSION);
218+
TracerFlare.addText(zip, "tracer_version.txt", VERSION);
231219
}
232220

233221
private void addConfig(ZipOutputStream zip) throws IOException {
234222
TracerFlare.addText(zip, "initial_config.txt", config.toString());
235-
TracerFlare.addText(zip, "dynamic_config.txt", dynamicConfig.toString());
236223
}
237224

238225
private void addRuntime(ZipOutputStream zip) throws IOException {

0 commit comments

Comments
 (0)