"""Optional OpenTelemetry span helpers."""
from importlib import import_module
from typing import Any
from sqlspec.exceptions import MissingDependencyError
from sqlspec.observability._common import resolve_db_system
from sqlspec.observability._config import TelemetryConfig
from sqlspec.utils.logging import get_logger
from sqlspec.utils.module_loader import ensure_opentelemetry
from sqlspec.utils.type_guards import has_tracer_provider
__all__ = ("SpanManager", "resolve_db_system")
logger = get_logger("sqlspec.observability.spans")
class SpanManager:
"""Lazy OpenTelemetry span manager with graceful degradation."""
__slots__ = (
"_enabled",
"_provider_factory",
"_resource_attributes",
"_span_kind",
"_status_cls",
"_status_code_cls",
"_trace_api",
"_tracer",
)
def __init__(self, telemetry: TelemetryConfig | None = None) -> None:
telemetry = telemetry or TelemetryConfig()
self._enabled = bool(telemetry.enable_spans)
self._provider_factory = telemetry.provider_factory
self._resource_attributes = dict(telemetry.resource_attributes or {})
self._trace_api: Any | None = None
self._status_cls: Any | None = None
self._status_code_cls: Any | None = None
self._span_kind: Any | None = None
self._tracer: Any | None = None
if self._enabled:
self._resolve_api()