File size: 1,629 Bytes
dfb775d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | """OpenTelemetry init hooks (lazy import — opt-in via `--extra obs`).
If `opentelemetry-sdk` is not installed, `init_otel()` is a graceful no-op
and `is_enabled()` returns False — calls into the package never raise.
"""
from __future__ import annotations
import logging
import os
logger = logging.getLogger(__name__)
def is_enabled() -> bool:
try:
import opentelemetry # noqa: F401
except ImportError:
return False
return True
def init_otel(service_name: str = "mindxtrain", endpoint: str | None = None) -> bool:
"""Initialize OpenTelemetry tracing if available; return whether init ran."""
if not is_enabled():
logger.info("opentelemetry-sdk not installed; skipping init_otel")
return False
try:
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
except ImportError as exc: # pragma: no cover
logger.warning("partial opentelemetry install (%s); skipping init", exc)
return False
endpoint = endpoint or os.environ.get("MINDXTRAIN_OTEL_ENDPOINT", "")
resource = Resource.create({"service.name": service_name})
provider = TracerProvider(resource=resource)
if endpoint:
provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint=endpoint)))
trace.set_tracer_provider(provider)
return True
__all__ = ["init_otel", "is_enabled"]
|