Spaces:
Sleeping
Sleeping
File size: 2,344 Bytes
db4ba8d | 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 49 50 51 52 53 54 55 56 57 58 59 60 | """
TradeFlow AI — OpenTelemetry & Prometheus Observability Initialization
"""
import structlog
from fastapi import FastAPI
try:
from opentelemetry import metrics, trace
from opentelemetry.instrumentation.celery import CeleryInstrumentor
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
from opentelemetry.instrumentation.redis import RedisInstrumentor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import (
ConsoleMetricExporter,
PeriodicExportingMetricReader,
)
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
OPENTELEMETRY_AVAILABLE = True
except Exception: # pragma: no cover - optional observability
OPENTELEMETRY_AVAILABLE = False
from ..config import settings
log = structlog.get_logger()
def setup_telemetry(app: FastAPI) -> None:
"""Initialize OpenTelemetry tracing and Prometheus metrics."""
enabled = settings.OTEL_ENABLED
if not enabled or not OPENTELEMETRY_AVAILABLE:
log.info("OpenTelemetry is disabled or not installed. Skipping telemetry setup.")
return
# Setup Tracing
resource = Resource.create({"service.name": "tradeflow-api", "service.version": "1.0.0"})
tracer_provider = TracerProvider(resource=resource)
# In production, use OTLPSpanExporter to send to Jaeger/Tempo
# For now, we export to console for debug, but only if trace level is high
exporter = ConsoleSpanExporter()
span_processor = BatchSpanProcessor(exporter)
tracer_provider.add_span_processor(span_processor)
trace.set_tracer_provider(tracer_provider)
# Setup Metrics
metric_reader = PeriodicExportingMetricReader(ConsoleMetricExporter())
meter_provider = MeterProvider(resource=resource, metric_readers=[metric_reader])
metrics.set_meter_provider(meter_provider)
# Instrument libraries
FastAPIInstrumentor.instrument_app(app)
CeleryInstrumentor().instrument()
HTTPXClientInstrumentor().instrument()
RedisInstrumentor().instrument()
log.info("OpenTelemetry & Prometheus instrumentation initialized.")
|