Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lite_bootstrap/instruments/opentelemetry_instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ class OpenTelemetryInstrument(BaseInstrument):
bootstrap_config: OpentelemetryConfig
not_ready_message = "opentelemetry_endpoint is empty and opentelemetry_log_traces is False"
missing_dependency_message = "opentelemetry is not installed"
_tracer_provider: "TracerProvider | None" = dataclasses.field(
default_factory=lambda: None, init=False, repr=False, compare=False
)

def is_ready(self) -> bool:
return (
Expand Down Expand Up @@ -105,6 +108,7 @@ def bootstrap(self) -> None:
)
tracer_provider = TracerProvider(resource=resource)
set_tracer_provider(tracer_provider)
object.__setattr__(self, "_tracer_provider", tracer_provider)
if import_checker.is_pyroscope_installed and getattr(self.bootstrap_config, "pyroscope_endpoint", None):
tracer_provider.add_span_processor(PyroscopeSpanProcessor())
if self.bootstrap_config.opentelemetry_log_traces:
Expand Down Expand Up @@ -133,3 +137,6 @@ def teardown(self) -> None:
one_instrumentor.instrumentor.uninstrument(**one_instrumentor.additional_params)
else:
one_instrumentor.uninstrument()
if self._tracer_provider is not None:
self._tracer_provider.shutdown()
object.__setattr__(self, "_tracer_provider", None)
17 changes: 17 additions & 0 deletions tests/instruments/test_opentelemetry_instrument.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from unittest.mock import patch

from lite_bootstrap.instruments.opentelemetry_instrument import (
InstrumentorWithParams,
OpentelemetryConfig,
Expand Down Expand Up @@ -32,3 +34,18 @@ def test_opentelemetry_instrument_empty_instruments() -> None:
opentelemetry_instrument.bootstrap()
finally:
opentelemetry_instrument.teardown()


def test_opentelemetry_instrument_teardown_shuts_down_tracer_provider() -> None:
instrument = OpenTelemetryInstrument(
bootstrap_config=OpentelemetryConfig(opentelemetry_log_traces=True),
)
instrument.bootstrap()
tracer_provider = instrument._tracer_provider # noqa: SLF001
assert tracer_provider is not None

with patch.object(tracer_provider, "shutdown") as mock_shutdown:
instrument.teardown()

mock_shutdown.assert_called_once_with()
assert instrument._tracer_provider is None # noqa: SLF001
Loading