""" Настройка телеметрии OpenTelemetry. Автор: Сергей Антропов Сайт: https://devops.org.ru """ import logging from opentelemetry import trace from opentelemetry.sdk.resources import Resource, SERVICE_NAME from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.sampling import TraceIdRatioBased from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor logger = logging.getLogger(__name__) def setup_telemetry(): """ Настройка провайдера телеметрии OpenTelemetry. Returns: TracerProvider: Провайдер трейсинга. """ from app.core.config import settings resource = Resource(attributes={SERVICE_NAME: settings.otel_service_name}) sampler = TraceIdRatioBased(1.0) # 100% семплирование # Настройка экспортера OTLP exporter_config = {} if settings.otel_exporter_otlp_endpoint: exporter_config['endpoint'] = settings.otel_exporter_otlp_endpoint exporter_config['insecure'] = settings.otel_exporter_otlp_insecure exporter = OTLPSpanExporter(**exporter_config) provider = TracerProvider(sampler=sampler, resource=resource) processor = SimpleSpanProcessor(exporter) provider.add_span_processor(processor) trace.set_tracer_provider(provider) logger.info(f"Telemetry настроен для сервиса: {settings.otel_service_name}") return provider def add(app): """ Добавить инструментацию OpenTelemetry к приложению FastAPI. Args: app: Экземпляр приложения FastAPI. """ from app.core.config import settings if settings.otel_enabled: try: tracer_provider = setup_telemetry() FastAPIInstrumentor.instrument_app( app, tracer_provider=tracer_provider, excluded_urls="/openapi.json,/docs,/redoc" ) logger.info("OpenTelemetry инструментация добавлена") except Exception as e: logger.error(f"Ошибка настройки OpenTelemetry: {e}") else: logger.info("OpenTelemetry отключен")