Skip to content

Commit 0687a05

Browse files
committed
Connect rum injector, telemetry collector, and statsdclient
1 parent 93a8c9c commit 0687a05

File tree

7 files changed

+104
-33
lines changed

7 files changed

+104
-33
lines changed

dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/RumHttpServletResponseWrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void resetBuffer() {
8080
}
8181

8282
public void onInjected() {
83-
RumInjector.reportInjectionSucceed();
83+
RumInjector.getTelemetryCollector().onInjectionSucceed();
8484
try {
8585
setHeader("x-datadog-rum-injected", "1");
8686
} catch (Throwable ignored) {

dd-java-agent/instrumentation/servlet/request-5/src/main/java/datadog/trace/instrumentation/servlet5/RumHttpServletResponseWrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void resetBuffer() {
8080
}
8181

8282
public void onInjected() {
83-
RumInjector.reportInjectionSucceed();
83+
RumInjector.getTelemetryCollector().onInjectionSucceed();
8484
try {
8585
setHeader("x-datadog-rum-injected", "1");
8686
} catch (Throwable ignored) {

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

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@
5050
import datadog.trace.api.naming.SpanNaming;
5151
import datadog.trace.api.remoteconfig.ServiceNameCollector;
5252
import datadog.trace.api.rum.RumInjector;
53-
import datadog.trace.api.rum.RumInjectorMetrics;
54-
import datadog.trace.api.rum.RumTelemetryCollector;
5553
import datadog.trace.api.sampling.PrioritySampling;
5654
import datadog.trace.api.scopemanager.ScopeListener;
5755
import datadog.trace.api.time.SystemTimeSource;
@@ -207,7 +205,6 @@ public static CoreTracerBuilder builder() {
207205
private final Monitoring performanceMonitoring;
208206

209207
private final HealthMetrics healthMetrics;
210-
private final RumTelemetryCollector rumInjectorHealthMetrics;
211208
private final Recording traceWriteTimer;
212209
private final IdGenerationStrategy idGenerationStrategy;
213210
private final TraceCollector.Factory traceCollectorFactory;
@@ -707,14 +704,10 @@ private CoreTracer(
707704
: HealthMetrics.NO_OP;
708705
healthMetrics.start();
709706

710-
// Start RUM injector metrics
711-
rumInjectorHealthMetrics =
712-
config.isHealthMetricsEnabled() && config.isRumEnabled()
713-
? new RumInjectorMetrics(this.statsDClient)
714-
: RumTelemetryCollector.NO_OP;
715-
rumInjectorHealthMetrics.start();
716-
// Register rumInjectorHealthMetrics as the RumInjector's telemetry collector
717-
RumInjector.setTelemetryCollector(rumInjectorHealthMetrics);
707+
// Start RUM injector telemetry
708+
if (config.isRumEnabled()) {
709+
RumInjector.enableTelemetry(this.statsDClient);
710+
}
718711

719712
performanceMonitoring =
720713
config.isPerfMetricsEnabled()
@@ -1261,7 +1254,7 @@ public void close() {
12611254
tracingConfigPoller.stop();
12621255
pendingTraceBuffer.close();
12631256
writer.close();
1264-
rumInjectorHealthMetrics.close();
1257+
RumInjector.shutdownTelemetry();
12651258
statsDClient.close();
12661259
metricsAggregator.close();
12671260
dataStreamsMonitoring.close();

internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public final class RumInjector {
2727
private final DDCache<String, byte[]> markerCache;
2828
private final Function<String, byte[]> snippetBytes;
2929

30-
// Health metrics telemetry collector (set by CoreTracer)
30+
// telemetry collector defaults to NO_OP
3131
private static volatile RumTelemetryCollector telemetryCollector = RumTelemetryCollector.NO_OP;
3232

3333
RumInjector(Config config) {
@@ -124,26 +124,30 @@ public byte[] getMarkerBytes(String encoding) {
124124
return this.markerCache.computeIfAbsent(encoding, MARKER_BYTES);
125125
}
126126

127-
// set the telemetry collector for the RumInjector
128-
public static void setTelemetryCollector(RumTelemetryCollector collector) {
129-
telemetryCollector = collector != null ? collector : RumTelemetryCollector.NO_OP;
127+
// start telemetry collection and report metrics via the given StatsDClient
128+
public static void enableTelemetry(datadog.trace.api.StatsDClient statsDClient) {
129+
if (statsDClient != null) {
130+
RumInjectorMetrics metrics = new RumInjectorMetrics(statsDClient);
131+
metrics.start();
132+
telemetryCollector = metrics;
133+
} else {
134+
telemetryCollector = RumTelemetryCollector.NO_OP;
135+
}
130136
}
131137

132-
// report to the telemetry collector that the RUM injector succeeded in injecting the SDK in an
133-
// HTTP response
134-
public static void reportInjectionSucceed() {
135-
telemetryCollector.onInjectionSucceed();
138+
// shutdown telemetry and reset to NO_OP
139+
public static void shutdownTelemetry() {
140+
telemetryCollector.close();
141+
telemetryCollector = RumTelemetryCollector.NO_OP;
136142
}
137143

138-
// report to the telemetry collector that the RUM injector failed to inject the SDK in an HTTP
139-
// response
140-
public static void reportInjectionFailed() {
141-
telemetryCollector.onInjectionFailed();
144+
// set the telemetry collector
145+
public static void setTelemetryCollector(RumTelemetryCollector collector) {
146+
telemetryCollector = collector != null ? collector : RumTelemetryCollector.NO_OP;
142147
}
143148

144-
// report to the telemetry collector that the RUM injector skipped injecting the SDK in an HTTP
145-
// response
146-
public static void reportInjectionSkipped() {
147-
telemetryCollector.onInjectionSkipped();
149+
// get the telemetry collector. this is used to directly report telemetry
150+
public static RumTelemetryCollector getTelemetryCollector() {
151+
return telemetryCollector;
148152
}
149153
}

internal-api/src/main/java/datadog/trace/api/rum/RumInjectorMetrics.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
import org.slf4j.Logger;
1111
import org.slf4j.LoggerFactory;
1212

13-
// Default implementation of RumInjectorHealthMetrics that reports metrics via StatsDClient
1413
// This class implements the RumTelemetryCollector interface, which is used to collect telemetry
15-
// from the RumInjector in the internal-api module
14+
// from the RumInjector. Metrics are then reported via StatsDClient.
1615
public class RumInjectorMetrics implements RumTelemetryCollector {
1716
private static final Logger log = LoggerFactory.getLogger(RumInjectorMetrics.class);
1817

internal-api/src/main/java/datadog/trace/api/rum/RumTelemetryCollector.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package datadog.trace.api.rum;
22

33
// Collect RUM injection telemetry from the RumInjector
4-
// This is implemented by the DefaultRumInjectorHealthMetrics class in the dd-trace-core module
4+
// This is implemented by the RumInjectorMetrics class
55
public interface RumTelemetryCollector {
66

77
RumTelemetryCollector NO_OP =
88
new RumTelemetryCollector() {
9+
@Override
10+
public void start() {}
11+
912
@Override
1013
public void onInjectionSucceed() {}
1114

@@ -14,8 +17,18 @@ public void onInjectionFailed() {}
1417

1518
@Override
1619
public void onInjectionSkipped() {}
20+
21+
@Override
22+
public void close() {}
23+
24+
@Override
25+
public String summary() {
26+
return "";
27+
}
1728
};
1829

30+
default void start() {}
31+
1932
// call when RUM injection succeeds
2033
void onInjectionSucceed();
2134

@@ -24,4 +37,11 @@ public void onInjectionSkipped() {}
2437

2538
// call when RUM injection is skipped
2639
void onInjectionSkipped();
40+
41+
default void close() {}
42+
43+
// human-readable summary of the current health metrics
44+
default String summary() {
45+
return "";
46+
}
2747
}

internal-api/src/test/groovy/datadog/trace/api/rum/RumInjectorTest.groovy

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,59 @@ class RumInjectorTest extends DDSpecification {
6161
injector.getSnippetChars() != null
6262
injector.getMarkerChars() != null
6363
}
64+
65+
void 'set telemetry collector'() {
66+
setup:
67+
def mockTelemetryCollector = mock(RumTelemetryCollector)
68+
69+
when:
70+
RumInjector.setTelemetryCollector(mockTelemetryCollector)
71+
def telemetryCollector = RumInjector.getTelemetryCollector()
72+
73+
then:
74+
telemetryCollector == mockTelemetryCollector
75+
}
76+
77+
void 'return NO_OP when telemetry collector is not set'() {
78+
when:
79+
RumInjector.setTelemetryCollector(null)
80+
def telemetryCollector = RumInjector.getTelemetryCollector()
81+
82+
then:
83+
telemetryCollector == RumTelemetryCollector.NO_OP
84+
}
85+
86+
void 'enable telemetry with StatsDClient'() {
87+
setup:
88+
def mockStatsDClient = mock(datadog.trace.api.StatsDClient)
89+
RumInjector.enableTelemetry(mockStatsDClient)
90+
91+
when:
92+
def telemetryCollector = RumInjector.getTelemetryCollector()
93+
94+
then:
95+
telemetryCollector instanceof datadog.trace.api.rum.RumInjectorMetrics
96+
}
97+
98+
void 'enabling telemetry with a null StatsDClient sets the telemetry collector to NO_OP'() {
99+
when:
100+
RumInjector.enableTelemetry(null)
101+
def telemetryCollector = RumInjector.getTelemetryCollector()
102+
103+
then:
104+
telemetryCollector == RumTelemetryCollector.NO_OP
105+
}
106+
107+
void 'shutdown telemetry'() {
108+
setup:
109+
def mockStatsDClient = mock(datadog.trace.api.StatsDClient)
110+
RumInjector.enableTelemetry(mockStatsDClient)
111+
112+
when:
113+
RumInjector.shutdownTelemetry()
114+
def telemetryCollector = RumInjector.getTelemetryCollector()
115+
116+
then:
117+
telemetryCollector == RumTelemetryCollector.NO_OP
118+
}
64119
}

0 commit comments

Comments
 (0)