import threading | |
from opentelemetry.sdk.trace import ReadableSpan | |
from opentelemetry.sdk.trace.export import BatchSpanProcessor | |
class LazyBatchSpanProcessor(BatchSpanProcessor): | |
def __init__(self, *args, **kwargs): | |
super().__init__(*args, **kwargs) | |
self.done = True | |
with self.condition: | |
self.condition.notify_all() | |
self.worker_thread.join() | |
self.done = False | |
self.worker_thread = None | |
def on_end(self, span: ReadableSpan) -> None: | |
if self.worker_thread is None: | |
self.worker_thread = threading.Thread( | |
name=self.__class__.__name__, target=self.worker, daemon=True | |
) | |
self.worker_thread.start() | |
super().on_end(span) | |
def shutdown(self) -> None: | |
self.done = True | |
with self.condition: | |
self.condition.notify_all() | |
if self.worker_thread: | |
self.worker_thread.join() | |
self.span_exporter.shutdown() | |