1+ import os
12import threading
23import uuid
34
45import pytest
56
67from ddtrace .internal import nogevent
78from ddtrace .profiling import recorder
8- from ddtrace .profiling .collector import _task
99from ddtrace .profiling .collector import threading as collector_threading
1010
1111from . import test_collector
1212
1313
14+ TESTING_GEVENT = os .getenv ("DD_PROFILE_TEST_GEVENT" , False )
15+
16+
1417def test_repr ():
1518 test_collector ._test_repr (
1619 collector_threading .LockCollector ,
@@ -63,13 +66,13 @@ def test_lock_acquire_events():
6366 assert len (r .events [collector_threading .LockAcquireEvent ]) == 1
6467 assert len (r .events [collector_threading .LockReleaseEvent ]) == 0
6568 event = r .events [collector_threading .LockAcquireEvent ][0 ]
66- assert event .lock_name == "test_threading.py:61 "
69+ assert event .lock_name == "test_threading.py:64 "
6770 assert event .thread_id == nogevent .thread_get_ident ()
6871 assert event .wait_time_ns > 0
6972 # It's called through pytest so I'm sure it's gonna be that long, right?
7073 assert len (event .frames ) > 3
7174 assert event .nframes > 3
72- assert event .frames [0 ] == (__file__ , 62 , "test_lock_acquire_events" )
75+ assert event .frames [0 ] == (__file__ , 65 , "test_lock_acquire_events" )
7376 assert event .sampling_pct == 100
7477
7578
@@ -90,14 +93,14 @@ def test_lock_events_tracer(tracer):
9093 events = r .reset ()
9194 # The tracer might use locks, so we need to look into every event to assert we got ours
9295 for event_type in (collector_threading .LockAcquireEvent , collector_threading .LockReleaseEvent ):
93- assert {"test_threading.py:81 " , "test_threading.py:84 " }.issubset ({e .lock_name for e in events [event_type ]})
96+ assert {"test_threading.py:84 " , "test_threading.py:87 " }.issubset ({e .lock_name for e in events [event_type ]})
9497 for event in events [event_type ]:
95- if event .name == "test_threading.py:81 " :
98+ if event .name == "test_threading.py:84 " :
9699 assert event .trace_id is None
97100 assert event .span_id is None
98101 assert event .trace_resource_container is None
99102 assert event .trace_type is None
100- elif event .name == "test_threading.py:84 " :
103+ elif event .name == "test_threading.py:87 " :
101104 assert event .trace_id == trace_id
102105 assert event .span_id == span_id
103106 assert event .trace_resource_container [0 ] == t .resource
@@ -123,14 +126,14 @@ def test_lock_events_tracer_late_finish(tracer):
123126 events = r .reset ()
124127 # The tracer might use locks, so we need to look into every event to assert we got ours
125128 for event_type in (collector_threading .LockAcquireEvent , collector_threading .LockReleaseEvent ):
126- assert {"test_threading.py:112 " , "test_threading.py:115 " }.issubset ({e .lock_name for e in events [event_type ]})
129+ assert {"test_threading.py:115 " , "test_threading.py:118 " }.issubset ({e .lock_name for e in events [event_type ]})
127130 for event in events [event_type ]:
128- if event .name == "test_threading.py:112 " :
131+ if event .name == "test_threading.py:115 " :
129132 assert event .trace_id is None
130133 assert event .span_id is None
131134 assert event .trace_resource_container is None
132135 assert event .trace_type is None
133- elif event .name == "test_threading.py:115 " :
136+ elif event .name == "test_threading.py:118 " :
134137 assert event .trace_id == trace_id
135138 assert event .span_id == span_id
136139 assert event .trace_resource_container [0 ] == span .resource
@@ -155,14 +158,14 @@ def test_resource_not_collected(monkeypatch, tracer):
155158 events = r .reset ()
156159 # The tracer might use locks, so we need to look into every event to assert we got ours
157160 for event_type in (collector_threading .LockAcquireEvent , collector_threading .LockReleaseEvent ):
158- assert {"test_threading.py:146 " , "test_threading.py:149 " }.issubset ({e .lock_name for e in events [event_type ]})
161+ assert {"test_threading.py:149 " , "test_threading.py:152 " }.issubset ({e .lock_name for e in events [event_type ]})
159162 for event in events [event_type ]:
160- if event .name == "test_threading.py:146 " :
163+ if event .name == "test_threading.py:149 " :
161164 assert event .trace_id is None
162165 assert event .span_id is None
163166 assert event .trace_resource_container is None
164167 assert event .trace_type is None
165- elif event .name == "test_threading.py:149 " :
168+ elif event .name == "test_threading.py:152 " :
166169 assert event .trace_id == trace_id
167170 assert event .span_id == span_id
168171 assert event .trace_resource_container is None
@@ -178,17 +181,17 @@ def test_lock_release_events():
178181 assert len (r .events [collector_threading .LockAcquireEvent ]) == 1
179182 assert len (r .events [collector_threading .LockReleaseEvent ]) == 1
180183 event = r .events [collector_threading .LockReleaseEvent ][0 ]
181- assert event .lock_name == "test_threading.py:175 "
184+ assert event .lock_name == "test_threading.py:178 "
182185 assert event .thread_id == nogevent .thread_get_ident ()
183186 assert event .locked_for_ns >= 0.1
184187 # It's called through pytest so I'm sure it's gonna be that long, right?
185188 assert len (event .frames ) > 3
186189 assert event .nframes > 3
187- assert event .frames [0 ] == (__file__ , 177 , "test_lock_release_events" )
190+ assert event .frames [0 ] == (__file__ , 180 , "test_lock_release_events" )
188191 assert event .sampling_pct == 100
189192
190193
191- @pytest .mark .skipif (_task . _gevent_tracer is None , reason = "gevent tasks not supported " )
194+ @pytest .mark .skipif (not TESTING_GEVENT , reason = "Not testing gevent " )
192195def test_lock_gevent_tasks ():
193196 r = recorder .Recorder ()
194197
@@ -205,33 +208,39 @@ def play_with_lock():
205208 assert len (r .events [collector_threading .LockAcquireEvent ]) >= 1
206209 assert len (r .events [collector_threading .LockReleaseEvent ]) >= 1
207210
208- event = r .events [collector_threading .LockAcquireEvent ][0 ]
209- assert event .lock_name == "test_threading.py:196"
210- assert event .thread_id == nogevent .main_thread_id
211- assert event .wait_time_ns >= 0
212- assert event .task_id == t .ident
213- assert event .task_name == "foobar"
214- # It's called through pytest so I'm sure it's gonna be that long, right?
215- assert len (event .frames ) > 3
216- assert event .nframes > 3
217- assert event .frames [0 ] == (__file__ , 197 , "play_with_lock" )
218- assert event .sampling_pct == 100
219- assert event .task_id == t .ident
220- assert event .task_name == "foobar"
221-
222- event = r .events [collector_threading .LockReleaseEvent ][0 ]
223- assert event .lock_name == "test_threading.py:196"
224- assert event .thread_id == nogevent .main_thread_id
225- assert event .locked_for_ns >= 0.1
226- assert event .task_id == t .ident
227- assert event .task_name == "foobar"
228- # It's called through pytest so I'm sure it's gonna be that long, right?
229- assert len (event .frames ) > 3
230- assert event .nframes > 3
231- assert event .frames [0 ] == (__file__ , 198 , "play_with_lock" )
232- assert event .sampling_pct == 100
233- assert event .task_id == t .ident
234- assert event .task_name == "foobar"
211+ for event in r .events [collector_threading .LockAcquireEvent ]:
212+ if event .lock_name == "test_threading.py:199" :
213+ assert event .thread_id == nogevent .main_thread_id
214+ assert event .wait_time_ns >= 0
215+ assert event .task_id == t .ident
216+ assert event .task_name == "foobar"
217+ # It's called through pytest so I'm sure it's gonna be that long, right?
218+ assert len (event .frames ) > 3
219+ assert event .nframes > 3
220+ assert event .frames [0 ] == (__file__ , 200 , "play_with_lock" )
221+ assert event .sampling_pct == 100
222+ assert event .task_id == t .ident
223+ assert event .task_name == "foobar"
224+ break
225+ else :
226+ pytest .fail ("Lock event not found" )
227+
228+ for event in r .events [collector_threading .LockReleaseEvent ]:
229+ if event .lock_name == "test_threading.py:199" :
230+ assert event .thread_id == nogevent .main_thread_id
231+ assert event .locked_for_ns >= 0.1
232+ assert event .task_id == t .ident
233+ assert event .task_name == "foobar"
234+ # It's called through pytest so I'm sure it's gonna be that long, right?
235+ assert len (event .frames ) > 3
236+ assert event .nframes > 3
237+ assert event .frames [0 ] == (__file__ , 201 , "play_with_lock" )
238+ assert event .sampling_pct == 100
239+ assert event .task_id == t .ident
240+ assert event .task_name == "foobar"
241+ break
242+ else :
243+ pytest .fail ("Lock event not found" )
235244
236245
237246@pytest .mark .benchmark (
0 commit comments