Skip to content

Commit 3d4ac53

Browse files
committed
Add tests
1 parent c5c860f commit 3d4ac53

File tree

2 files changed

+134
-44
lines changed

2 files changed

+134
-44
lines changed

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

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,72 +11,72 @@ class RumInjectorMetricsTest extends Specification {
1111
def statsD = Mock(StatsDClient)
1212

1313
@Subject
14-
def healthMetrics = new RumInjectorMetrics(statsD)
14+
def metrics = new RumInjectorMetrics(statsD)
1515

1616
def "test onInjectionSucceed"() {
1717
setup:
1818
def latch = new CountDownLatch(1)
19-
def healthMetrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
20-
healthMetrics.start()
19+
def metrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
20+
metrics.start()
2121

2222
when:
23-
healthMetrics.onInjectionSucceed()
23+
metrics.onInjectionSucceed()
2424
latch.await(5, TimeUnit.SECONDS)
2525

2626
then:
2727
1 * statsD.count('rum.injection.succeed', 1, _)
2828
0 * _
2929

3030
cleanup:
31-
healthMetrics.close()
31+
metrics.close()
3232
}
3333

3434
def "test onInjectionFailed"() {
3535
setup:
3636
def latch = new CountDownLatch(1)
37-
def healthMetrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
38-
healthMetrics.start()
37+
def metrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
38+
metrics.start()
3939

4040
when:
41-
healthMetrics.onInjectionFailed()
41+
metrics.onInjectionFailed()
4242
latch.await(5, TimeUnit.SECONDS)
4343

4444
then:
4545
1 * statsD.count('rum.injection.failed', 1, _)
4646
0 * _
4747

4848
cleanup:
49-
healthMetrics.close()
49+
metrics.close()
5050
}
5151

5252
def "test onInjectionSkipped"() {
5353
setup:
5454
def latch = new CountDownLatch(1)
55-
def healthMetrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
56-
healthMetrics.start()
55+
def metrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
56+
metrics.start()
5757

5858
when:
59-
healthMetrics.onInjectionSkipped()
59+
metrics.onInjectionSkipped()
6060
latch.await(5, TimeUnit.SECONDS)
6161

6262
then:
6363
1 * statsD.count('rum.injection.skipped', 1, _)
6464
0 * _
6565

6666
cleanup:
67-
healthMetrics.close()
67+
metrics.close()
6868
}
6969

70-
def "test multiple events"() {
70+
def "test flushing multiple events"() {
7171
setup:
7272
def latch = new CountDownLatch(3) // expecting 3 metric types
73-
def healthMetrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
74-
healthMetrics.start()
73+
def metrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
74+
metrics.start()
7575

7676
when:
77-
healthMetrics.onInjectionSucceed()
78-
healthMetrics.onInjectionFailed()
79-
healthMetrics.onInjectionSkipped()
77+
metrics.onInjectionSucceed()
78+
metrics.onInjectionFailed()
79+
metrics.onInjectionSkipped()
8080
latch.await(5, TimeUnit.SECONDS)
8181

8282
then:
@@ -86,23 +86,59 @@ class RumInjectorMetricsTest extends Specification {
8686
0 * _
8787

8888
cleanup:
89-
healthMetrics.close()
89+
metrics.close()
9090
}
9191

92-
def "test summary"() {
92+
def "test that flushing only reports non-zero deltas"() {
93+
setup:
94+
def latch = new CountDownLatch(1) // expecting only 1 metric call (non-zero delta)
95+
def metrics = new RumInjectorMetrics(new Latched(statsD, latch), 10, TimeUnit.MILLISECONDS)
96+
metrics.start()
97+
9398
when:
94-
healthMetrics.onInjectionSucceed()
95-
healthMetrics.onInjectionFailed()
96-
healthMetrics.onInjectionSkipped()
97-
def summary = healthMetrics.summary()
99+
metrics.onInjectionSucceed()
100+
metrics.onInjectionSucceed()
101+
latch.await(5, TimeUnit.SECONDS)
98102

99103
then:
100-
summary.contains("injectionSucceed=1")
101-
summary.contains("injectionFailed=1")
104+
1 * statsD.count('rum.injection.succeed', 2, _)
105+
// should not be called since they have delta of 0
106+
0 * statsD.count('rum.injection.failed', _, _)
107+
0 * statsD.count('rum.injection.skipped', _, _)
108+
0 * _
109+
110+
cleanup:
111+
metrics.close()
112+
}
113+
114+
def "test summary with multiple events"() {
115+
when:
116+
metrics.onInjectionSucceed()
117+
metrics.onInjectionFailed()
118+
metrics.onInjectionSucceed()
119+
metrics.onInjectionFailed()
120+
metrics.onInjectionSucceed()
121+
metrics.onInjectionSkipped()
122+
def summary = metrics.summary()
123+
124+
then:
125+
summary.contains("injectionSucceed=3")
126+
summary.contains("injectionFailed=2")
102127
summary.contains("injectionSkipped=1")
103128
0 * _
104129
}
105130

131+
def "test metrics start at zero"() {
132+
when:
133+
def summary = metrics.summary()
134+
135+
then:
136+
summary.contains("injectionSucceed=0")
137+
summary.contains("injectionFailed=0")
138+
summary.contains("injectionSkipped=0")
139+
0 * _
140+
}
141+
106142
// taken from HealthMetricsTest
107143
private static class Latched implements StatsDClient {
108144
final StatsDClient delegate

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

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,56 +68,110 @@ class RumInjectorTest extends DDSpecification {
6868

6969
void 'set telemetry collector'() {
7070
setup:
71-
def mockTelemetryCollector = mock(RumTelemetryCollector)
71+
def telemetryCollector = mock(RumTelemetryCollector)
7272

7373
when:
74-
RumInjector.setTelemetryCollector(mockTelemetryCollector)
75-
def telemetryCollector = RumInjector.getTelemetryCollector()
74+
RumInjector.setTelemetryCollector(telemetryCollector)
7675

7776
then:
78-
telemetryCollector == mockTelemetryCollector
77+
RumInjector.getTelemetryCollector() == telemetryCollector
78+
79+
cleanup:
80+
RumInjector.setTelemetryCollector(RumTelemetryCollector.NO_OP)
7981
}
8082

8183
void 'return NO_OP when telemetry collector is not set'() {
8284
when:
8385
RumInjector.setTelemetryCollector(null)
84-
def telemetryCollector = RumInjector.getTelemetryCollector()
8586

8687
then:
87-
telemetryCollector == RumTelemetryCollector.NO_OP
88+
RumInjector.getTelemetryCollector() == RumTelemetryCollector.NO_OP
89+
90+
cleanup:
91+
RumInjector.setTelemetryCollector(RumTelemetryCollector.NO_OP)
8892
}
8993

9094
void 'enable telemetry with StatsDClient'() {
91-
setup:
92-
def mockStatsDClient = mock(datadog.trace.api.StatsDClient)
93-
RumInjector.enableTelemetry(mockStatsDClient)
94-
9595
when:
96-
def telemetryCollector = RumInjector.getTelemetryCollector()
96+
RumInjector.enableTelemetry(mock(datadog.trace.api.StatsDClient))
9797

9898
then:
99-
telemetryCollector instanceof datadog.trace.api.rum.RumInjectorMetrics
99+
RumInjector.getTelemetryCollector() instanceof datadog.trace.api.rum.RumInjectorMetrics
100+
101+
cleanup:
102+
RumInjector.shutdownTelemetry()
100103
}
101104

102105
void 'enabling telemetry with a null StatsDClient sets the telemetry collector to NO_OP'() {
103106
when:
104107
RumInjector.enableTelemetry(null)
105-
def telemetryCollector = RumInjector.getTelemetryCollector()
106108

107109
then:
108-
telemetryCollector == RumTelemetryCollector.NO_OP
110+
RumInjector.getTelemetryCollector() == RumTelemetryCollector.NO_OP
111+
112+
cleanup:
113+
RumInjector.shutdownTelemetry()
109114
}
110115

111116
void 'shutdown telemetry'() {
112117
setup:
113-
def mockStatsDClient = mock(datadog.trace.api.StatsDClient)
114-
RumInjector.enableTelemetry(mockStatsDClient)
118+
RumInjector.enableTelemetry(mock(datadog.trace.api.StatsDClient))
115119

116120
when:
117121
RumInjector.shutdownTelemetry()
122+
123+
then:
124+
RumInjector.getTelemetryCollector() == RumTelemetryCollector.NO_OP
125+
}
126+
127+
void 'telemetry integration works end-to-end'() {
128+
when:
129+
// simulate CoreTracer enabling telemetry
130+
RumInjector.enableTelemetry(mock(datadog.trace.api.StatsDClient))
131+
132+
// simulate reporting successful injection
118133
def telemetryCollector = RumInjector.getTelemetryCollector()
134+
telemetryCollector.onInjectionSucceed()
135+
telemetryCollector.onInjectionSucceed()
136+
telemetryCollector.onInjectionFailed()
137+
138+
// verify metrics are collected
139+
def summary = telemetryCollector.summary()
119140

120141
then:
121-
telemetryCollector == RumTelemetryCollector.NO_OP
142+
summary.contains("injectionSucceed=2")
143+
summary.contains("injectionFailed=1")
144+
summary.contains("injectionSkipped=0")
145+
146+
cleanup:
147+
RumInjector.shutdownTelemetry()
148+
}
149+
150+
void 'concurrent telemetry calls are thread-safe'() {
151+
setup:
152+
RumInjector.enableTelemetry(mock(datadog.trace.api.StatsDClient))
153+
def telemetryCollector = RumInjector.getTelemetryCollector()
154+
def threads = []
155+
156+
when:
157+
// simulate multiple threads calling telemetry methods
158+
(1..50).each { i ->
159+
threads << Thread.start {
160+
telemetryCollector.onInjectionSucceed()
161+
telemetryCollector.onInjectionFailed()
162+
telemetryCollector.onInjectionSkipped()
163+
}
164+
}
165+
threads*.join()
166+
167+
def summary = telemetryCollector.summary()
168+
169+
then:
170+
summary.contains("injectionSucceed=50")
171+
summary.contains("injectionFailed=50")
172+
summary.contains("injectionSkipped=50")
173+
174+
cleanup:
175+
RumInjector.shutdownTelemetry()
122176
}
123177
}

0 commit comments

Comments
 (0)