2026-10-13 21:56:06 +03:30
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
from opentelemetry import metrics, trace
|
|
|
|
|
from opentelemetry.sdk.metrics import MeterProvider
|
2026-10-12 23:11:26 +03:30
|
|
|
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
|
|
|
|
|
from opentelemetry.sdk.trace import TracerProvider
|
|
|
|
|
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
|
|
|
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
2026-10-13 21:56:06 +03:30
|
|
|
from opentelemetry.exporter.prometheus import PrometheusMetricReader
|
2026-10-13 11:28:03 +03:30
|
|
|
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
|
|
|
|
|
from opentelemetry.instrumentation.redis import RedisInstrumentor
|
2026-10-13 21:56:06 +03:30
|
|
|
from prometheus_client import start_http_server
|
2026-10-12 23:11:26 +03:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def setup_telemetry(service_name: str):
|
|
|
|
|
resource = Resource.create(attributes={SERVICE_NAME: service_name})
|
|
|
|
|
processor = BatchSpanProcessor(OTLPSpanExporter())
|
|
|
|
|
provider = TracerProvider(resource=resource)
|
|
|
|
|
provider.add_span_processor(processor)
|
|
|
|
|
trace.set_tracer_provider(provider)
|
2026-10-13 11:28:03 +03:30
|
|
|
|
2026-10-13 21:56:06 +03:30
|
|
|
# Pull, not push: Alloy 404s OTLP metrics, so Prometheus scrapes each
|
|
|
|
|
# service instead. The reader renders current values on every scrape.
|
|
|
|
|
# It serves on its own port rather than a FastAPI route so /metrics is
|
|
|
|
|
# never reachable through gateway's public Traefik router, and so the
|
|
|
|
|
# audit worker (no HTTP app) exposes metrics the same way.
|
|
|
|
|
reader = PrometheusMetricReader()
|
|
|
|
|
metrics.set_meter_provider(MeterProvider(resource=resource, metric_readers=[reader]))
|
|
|
|
|
start_http_server(
|
|
|
|
|
port=int(os.environ.get("OTEL_EXPORTER_PROMETHEUS_PORT", "9464")),
|
|
|
|
|
addr=os.environ.get("OTEL_EXPORTER_PROMETHEUS_HOST", "0.0.0.0"),
|
|
|
|
|
)
|
|
|
|
|
|
2026-10-13 11:28:03 +03:30
|
|
|
# Process-wide patches on the client classes, so they also cover clients
|
|
|
|
|
# created at import time (gateway's _proxy_client, common.redis_client).
|
|
|
|
|
HTTPXClientInstrumentor().instrument()
|
|
|
|
|
RedisInstrumentor().instrument()
|