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.")