8
8
def test_enable (test_agent_session , run_python_code_in_subprocess ):
9
9
code = """
10
10
from ddtrace.internal.telemetry import telemetry_writer
11
+ from ddtrace.internal.service import ServiceStatus
12
+
11
13
telemetry_writer.enable()
14
+
15
+ assert telemetry_writer.status == ServiceStatus.RUNNING
16
+ assert telemetry_writer._worker is not None
12
17
"""
13
18
14
19
stdout , stderr , status , _ = run_python_code_in_subprocess (code )
@@ -17,26 +22,10 @@ def test_enable(test_agent_session, run_python_code_in_subprocess):
17
22
assert stdout == b"" , stderr
18
23
assert stderr == b""
19
24
20
- events = test_agent_session .get_events ()
21
- assert len (events ) == 3
22
-
23
- # Same runtime id is used
24
- assert events [0 ]["runtime_id" ] == events [1 ]["runtime_id" ]
25
- assert events [0 ]["request_type" ] == "app-closing"
26
- assert events [1 ]["request_type" ] == "app-dependencies-loaded"
27
- assert events [2 ]["request_type" ] == "app-started"
28
- assert events [2 ]["payload" ]["error" ] == {"code" : 0 , "message" : "" }
29
-
30
25
31
26
@pytest .mark .snapshot
32
27
def test_telemetry_enabled_on_first_tracer_flush (test_agent_session , ddtrace_run_python_code_in_subprocess ):
33
28
"""assert telemetry events are generated after the first trace is flushed to the agent"""
34
- # Using ddtrace-run and/or importing ddtrace alone should not enable telemetry
35
- # Telemetry data should only be sent after the first trace to the agent
36
- _ , stderr , status , _ = ddtrace_run_python_code_in_subprocess ("import ddtrace" )
37
- assert status == 0 , stderr
38
- # No trace and No Telemetry
39
- assert len (test_agent_session .get_events ()) == 0
40
29
41
30
# Submit a trace to the agent in a subprocess
42
31
code = 'from ddtrace import tracer; span = tracer.trace("test-telemetry"); span.finish()'
@@ -65,6 +54,7 @@ def test_enable_fork(test_agent_session, run_python_code_in_subprocess):
65
54
66
55
# We have to start before forking since fork hooks are not enabled until after enabling
67
56
telemetry_writer.enable()
57
+ telemetry_writer._app_started_event()
68
58
69
59
if os.fork() == 0:
70
60
# Send multiple started events to confirm none get sent
@@ -85,15 +75,12 @@ def test_enable_fork(test_agent_session, run_python_code_in_subprocess):
85
75
requests = test_agent_session .get_requests ()
86
76
87
77
# We expect 2 events from the parent process to get sent, but none from the child process
88
- assert len (requests ) == 3
78
+ assert len (requests ) == 2
89
79
# Validate that the runtime id sent for every event is the parent processes runtime id
90
80
assert requests [0 ]["body" ]["runtime_id" ] == runtime_id
91
81
assert requests [0 ]["body" ]["request_type" ] == "app-closing"
92
82
assert requests [1 ]["body" ]["runtime_id" ] == runtime_id
93
- assert requests [1 ]["body" ]["request_type" ] == "app-dependencies-loaded"
94
- assert requests [1 ]["body" ]["runtime_id" ] == runtime_id
95
- assert requests [2 ]["body" ]["request_type" ] == "app-started"
96
- assert requests [2 ]["body" ]["runtime_id" ] == runtime_id
83
+ assert requests [1 ]["body" ]["request_type" ] == "app-started"
97
84
98
85
99
86
def test_enable_fork_heartbeat (test_agent_session , run_python_code_in_subprocess ):
@@ -250,6 +237,9 @@ def test_handled_integration_error(test_agent_session, run_python_code_in_subpro
250
237
251
238
from ddtrace import patch, tracer
252
239
patch(raise_errors=False, sqlite3=True)
240
+
241
+ # Create a span to start the telemetry writer
242
+ tracer.trace("hi").finish()
253
243
"""
254
244
255
245
_ , stderr , status , _ = run_python_code_in_subprocess (code )
@@ -260,15 +250,11 @@ def test_handled_integration_error(test_agent_session, run_python_code_in_subpro
260
250
261
251
events = test_agent_session .get_events ()
262
252
263
- assert len (events ) == 5
264
- # Same runtime id is used
265
- assert (
266
- events [0 ]["runtime_id" ]
267
- == events [1 ]["runtime_id" ]
268
- == events [2 ]["runtime_id" ]
269
- == events [3 ]["runtime_id" ]
270
- == events [4 ]["runtime_id" ]
271
- )
253
+ assert len (events ) > 1
254
+ for event in events :
255
+ # Same runtime id is used
256
+ assert event ["runtime_id" ] == events [0 ]["runtime_id" ]
257
+
272
258
integrations_events = [event for event in events if event ["request_type" ] == "app-integrations-change" ]
273
259
274
260
assert len (integrations_events ) == 1
@@ -277,12 +263,14 @@ def test_handled_integration_error(test_agent_session, run_python_code_in_subpro
277
263
== "failed to import ddtrace module 'ddtrace.contrib.sqlite3' when patching on import"
278
264
)
279
265
280
- metric_events = [event for event in events if event ["request_type" ] == "generate-metrics" ]
281
-
266
+ metric_events = [
267
+ event
268
+ for event in events
269
+ if event ["request_type" ] == "generate-metrics"
270
+ and event ["payload" ]["series" ][0 ]["metric" ] == "integration_errors"
271
+ ]
282
272
assert len (metric_events ) == 1
283
- assert metric_events [0 ]["payload" ]["namespace" ] == "tracers"
284
273
assert len (metric_events [0 ]["payload" ]["series" ]) == 1
285
- assert metric_events [0 ]["payload" ]["series" ][0 ]["metric" ] == "integration_errors"
286
274
assert metric_events [0 ]["payload" ]["series" ][0 ]["type" ] == "count"
287
275
assert len (metric_events [0 ]["payload" ]["series" ][0 ]["points" ]) == 1
288
276
assert metric_events [0 ]["payload" ]["series" ][0 ]["points" ][0 ][1 ] == 1
0 commit comments