mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-07-30 21:56:07 +08:00
Fix BatchExportSpanProcessor not resetting timeout on worker loop (#1218)
This commit is contained in:
@ -119,7 +119,8 @@ class DatadogExportSpanProcessor(SpanProcessor):
|
||||
with self.condition:
|
||||
self.condition.wait(timeout)
|
||||
if not self.check_traces_queue:
|
||||
# spurious notification, let's wait again
|
||||
# spurious notification, let's wait again, reset timeout
|
||||
timeout = self.schedule_delay_millis / 1e3
|
||||
continue
|
||||
if self.done:
|
||||
# missing spans will be sent when calling flush
|
||||
|
@ -483,6 +483,42 @@ class TestDatadogSpanExporter(unittest.TestCase):
|
||||
|
||||
tracer_provider.shutdown()
|
||||
|
||||
def test_batch_span_processor_reset_timeout(self):
|
||||
"""Test that the scheduled timeout is reset on cycles without spans"""
|
||||
delay = 50
|
||||
# pylint: disable=protected-access
|
||||
exporter = MockDatadogSpanExporter()
|
||||
exporter._agent_writer.write.side_effect = lambda spans: time.sleep(
|
||||
0.05
|
||||
)
|
||||
span_processor = datadog.DatadogExportSpanProcessor(
|
||||
exporter, schedule_delay_millis=delay
|
||||
)
|
||||
tracer_provider = trace.TracerProvider()
|
||||
tracer_provider.add_span_processor(span_processor)
|
||||
tracer = tracer_provider.get_tracer(__name__)
|
||||
with mock.patch.object(span_processor.condition, "wait") as mock_wait:
|
||||
with tracer.start_span("foo"):
|
||||
pass
|
||||
|
||||
# give some time for exporter to loop
|
||||
# since wait is mocked it should return immediately
|
||||
time.sleep(0.1)
|
||||
mock_wait_calls = list(mock_wait.mock_calls)
|
||||
|
||||
# find the index of the call that processed the singular span
|
||||
for idx, wait_call in enumerate(mock_wait_calls):
|
||||
_, args, __ = wait_call
|
||||
if args[0] <= 0:
|
||||
after_calls = mock_wait_calls[idx + 1 :]
|
||||
break
|
||||
|
||||
self.assertTrue(
|
||||
all(args[0] >= 0.05 for _, args, __ in after_calls)
|
||||
)
|
||||
|
||||
span_processor.shutdown()
|
||||
|
||||
def test_span_processor_accepts_parent_context(self):
|
||||
span_processor = mock.Mock(
|
||||
wraps=datadog.DatadogExportSpanProcessor(self.exporter)
|
||||
|
Reference in New Issue
Block a user