Skip to content

Commit c5c860f

Browse files
committed
Connect rum injector, telemetry collector, and statsdclient
1 parent 92f0c54 commit c5c860f

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
@@ -117,7 +117,7 @@ public void resetBuffer() {
117117
}
118118

119119
public void onInjected() {
120-
RumInjector.reportInjectionSucceed();
120+
RumInjector.getTelemetryCollector().onInjectionSucceed();
121121
try {
122122
setHeader("x-datadog-rum-injected", "1");
123123
} 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
@@ -94,7 +94,7 @@ public void resetBuffer() {
9494
}
9595

9696
public void onInjected() {
97-
RumInjector.reportInjectionSucceed();
97+
RumInjector.getTelemetryCollector().onInjectionSucceed();
9898
try {
9999
setHeader("x-datadog-rum-injected", "1");
100100
} 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;
@@ -208,7 +206,6 @@ public static CoreTracerBuilder builder() {
208206
private final Monitoring performanceMonitoring;
209207

210208
private final HealthMetrics healthMetrics;
211-
private final RumTelemetryCollector rumInjectorHealthMetrics;
212209
private final Recording traceWriteTimer;
213210
private final IdGenerationStrategy idGenerationStrategy;
214211
private final TraceCollector.Factory traceCollectorFactory;
@@ -708,14 +705,10 @@ private CoreTracer(
708705
: HealthMetrics.NO_OP;
709706
healthMetrics.start();
710707

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

720713
performanceMonitoring =
721714
config.isPerfMetricsEnabled()
@@ -1262,7 +1255,7 @@ public void close() {
12621255
tracingConfigPoller.stop();
12631256
pendingTraceBuffer.close();
12641257
writer.close();
1265-
rumInjectorHealthMetrics.close();
1258+
RumInjector.shutdownTelemetry();
12661259
statsDClient.close();
12671260
metricsAggregator.close();
12681261
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
@@ -29,7 +29,7 @@ public final class RumInjector {
2929
private final DDCache<String, byte[]> markerCache;
3030
private final Function<String, byte[]> snippetBytes;
3131

32-
// Health metrics telemetry collector (set by CoreTracer)
32+
// telemetry collector defaults to NO_OP
3333
private static volatile RumTelemetryCollector telemetryCollector = RumTelemetryCollector.NO_OP;
3434

3535
RumInjector(Config config, InstrumenterConfig instrumenterConfig) {
@@ -126,26 +126,30 @@ public byte[] getMarkerBytes(String encoding) {
126126
return this.markerCache.computeIfAbsent(encoding, MARKER_BYTES);
127127
}
128128

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

134-
// report to the telemetry collector that the RUM injector succeeded in injecting the SDK in an
135-
// HTTP response
136-
public static void reportInjectionSucceed() {
137-
telemetryCollector.onInjectionSucceed();
140+
// shutdown telemetry and reset to NO_OP
141+
public static void shutdownTelemetry() {
142+
telemetryCollector.close();
143+
telemetryCollector = RumTelemetryCollector.NO_OP;
138144
}
139145

140-
// report to the telemetry collector that the RUM injector failed to inject the SDK in an HTTP
141-
// response
142-
public static void reportInjectionFailed() {
143-
telemetryCollector.onInjectionFailed();
146+
// set the telemetry collector
147+
public static void setTelemetryCollector(RumTelemetryCollector collector) {
148+
telemetryCollector = collector != null ? collector : RumTelemetryCollector.NO_OP;
144149
}
145150

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

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
@@ -65,4 +65,59 @@ class RumInjectorTest extends DDSpecification {
6565
injector.getSnippetChars() != null
6666
injector.getMarkerChars() != null
6767
}
68+
69+
void 'set telemetry collector'() {
70+
setup:
71+
def mockTelemetryCollector = mock(RumTelemetryCollector)
72+
73+
when:
74+
RumInjector.setTelemetryCollector(mockTelemetryCollector)
75+
def telemetryCollector = RumInjector.getTelemetryCollector()
76+
77+
then:
78+
telemetryCollector == mockTelemetryCollector
79+
}
80+
81+
void 'return NO_OP when telemetry collector is not set'() {
82+
when:
83+
RumInjector.setTelemetryCollector(null)
84+
def telemetryCollector = RumInjector.getTelemetryCollector()
85+
86+
then:
87+
telemetryCollector == RumTelemetryCollector.NO_OP
88+
}
89+
90+
void 'enable telemetry with StatsDClient'() {
91+
setup:
92+
def mockStatsDClient = mock(datadog.trace.api.StatsDClient)
93+
RumInjector.enableTelemetry(mockStatsDClient)
94+
95+
when:
96+
def telemetryCollector = RumInjector.getTelemetryCollector()
97+
98+
then:
99+
telemetryCollector instanceof datadog.trace.api.rum.RumInjectorMetrics
100+
}
101+
102+
void 'enabling telemetry with a null StatsDClient sets the telemetry collector to NO_OP'() {
103+
when:
104+
RumInjector.enableTelemetry(null)
105+
def telemetryCollector = RumInjector.getTelemetryCollector()
106+
107+
then:
108+
telemetryCollector == RumTelemetryCollector.NO_OP
109+
}
110+
111+
void 'shutdown telemetry'() {
112+
setup:
113+
def mockStatsDClient = mock(datadog.trace.api.StatsDClient)
114+
RumInjector.enableTelemetry(mockStatsDClient)
115+
116+
when:
117+
RumInjector.shutdownTelemetry()
118+
def telemetryCollector = RumInjector.getTelemetryCollector()
119+
120+
then:
121+
telemetryCollector == RumTelemetryCollector.NO_OP
122+
}
68123
}

0 commit comments

Comments
 (0)