diff --git a/src/agents/tracing/processors.py b/src/agents/tracing/processors.py index b61f3e7976..eef04208d2 100644 --- a/src/agents/tracing/processors.py +++ b/src/agents/tracing/processors.py @@ -580,6 +580,12 @@ def __init__( self._thread_start_lock = threading.Lock() self._export_lock = threading.Lock() self._shutdown_deadline: float | None = None + self._dropped_count: int = 0 + + @property + def dropped_count(self) -> int: + """The number of spans or traces dropped due to a full queue.""" + return self._dropped_count def _ensure_thread_started(self) -> None: # Fast path without holding the lock @@ -601,6 +607,7 @@ def on_trace_start(self, trace: Trace) -> None: try: self._queue.put_nowait(trace) except queue.Full: + self._dropped_count += 1 logger.warning("Queue is full, dropping trace.") def on_trace_end(self, trace: Trace) -> None: @@ -618,6 +625,7 @@ def on_span_end(self, span: Span[Any]) -> None: try: self._queue.put_nowait(span) except queue.Full: + self._dropped_count += 1 logger.warning("Queue is full, dropping span.") def shutdown(self, timeout: float | None = None): diff --git a/tests/test_trace_processor.py b/tests/test_trace_processor.py index 07e975ccb9..96d30d58a3 100644 --- a/tests/test_trace_processor.py +++ b/tests/test_trace_processor.py @@ -105,6 +105,24 @@ def test_batch_trace_processor_queue_full(mocked_exporter): processor.shutdown() +def test_batch_trace_processor_dropped_count(mocked_exporter): + processor = BatchTraceProcessor(exporter=mocked_exporter, max_queue_size=2, schedule_delay=0.1) + + # Fill the queue + processor.on_trace_start(get_trace(processor)) + processor.on_trace_start(get_trace(processor)) + assert processor.dropped_count == 0 + + # Next item should be dropped and counter incremented + processor.on_trace_start(get_trace(processor)) + assert processor.dropped_count == 1 + + processor.on_span_end(get_span(processor)) + assert processor.dropped_count == 2 + + processor.shutdown() + + def test_batch_processor_doesnt_enqueue_on_trace_end_or_span_start(mocked_exporter): processor = BatchTraceProcessor(exporter=mocked_exporter)