@@ -230,3 +230,73 @@ def init_in_thread():
230230 mock_holder ["logger" ].debug .assert_any_call (
231231 "Skipping signal handler registration: not running in main thread"
232232 )
233+
234+
235+ def test_hook_dispatched_span_counts_point_usage ():
236+ with (
237+ patch .dict (
238+ os .environ ,
239+ {
240+ "CREWAI_DISABLE_TELEMETRY" : "false" ,
241+ "CREWAI_DISABLE_TRACKING" : "false" ,
242+ "OTEL_SDK_DISABLED" : "false" ,
243+ },
244+ ),
245+ patch ("crewai.telemetry.telemetry.TracerProvider" ),
246+ ):
247+ telemetry = Telemetry ()
248+ with patch .object (telemetry , "feature_usage_span" ) as feature_usage_span :
249+ telemetry .hook_dispatched_span ("pre_tool_call" , "proceeded" )
250+
251+ feature_usage_span .assert_called_once_with ("hooks:pre_tool_call" )
252+
253+
254+ def test_hook_dispatched_span_counts_aborts ():
255+ with (
256+ patch .dict (
257+ os .environ ,
258+ {
259+ "CREWAI_DISABLE_TELEMETRY" : "false" ,
260+ "CREWAI_DISABLE_TRACKING" : "false" ,
261+ "OTEL_SDK_DISABLED" : "false" ,
262+ },
263+ ),
264+ patch ("crewai.telemetry.telemetry.TracerProvider" ),
265+ ):
266+ telemetry = Telemetry ()
267+ with patch .object (telemetry , "feature_usage_span" ) as feature_usage_span :
268+ telemetry .hook_dispatched_span ("pre_tool_call" , "aborted" )
269+
270+ feature_usage_span .assert_any_call ("hooks:pre_tool_call" )
271+ feature_usage_span .assert_any_call ("hooks:aborted" )
272+ assert feature_usage_span .call_count == 2
273+
274+
275+ def test_event_listener_tracks_hook_dispatched_events ():
276+ from crewai .events .event_bus import crewai_event_bus
277+ from crewai .events .event_listener import event_listener
278+ from crewai .events .types .hook_events import HookDispatchedEvent
279+
280+ with (
281+ crewai_event_bus .scoped_handlers (),
282+ patch .object (
283+ event_listener ._telemetry ,
284+ "hook_dispatched_span" ,
285+ ) as hook_dispatched_span ,
286+ ):
287+ event_listener .setup_listeners (crewai_event_bus )
288+ crewai_event_bus .emit (
289+ "test" ,
290+ HookDispatchedEvent (
291+ interception_point = "pre_tool_call" ,
292+ outcome = "aborted" ,
293+ hook_count = 1 ,
294+ duration_ms = 1.5 ,
295+ ),
296+ )
297+ crewai_event_bus .flush ()
298+
299+ hook_dispatched_span .assert_called_once_with (
300+ interception_point = "pre_tool_call" ,
301+ outcome = "aborted" ,
302+ )
0 commit comments