44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
from opentelemetry import trace
|
|
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
|
|
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
|
|
from opentelemetry.instrumentation.redis import RedisInstrumentor
|
|
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
|
|
from opentelemetry.sdk.resources import Resource
|
|
from opentelemetry.sdk.trace import TracerProvider
|
|
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
|
|
from src.infrastructure.config.settings import settings
|
|
|
|
if TYPE_CHECKING:
|
|
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
|
|
|
|
def setup_tracing(app: Any = None, engine: AsyncEngine | None = None) -> None:
|
|
if not settings.OTEL_TRACES_ENABLED:
|
|
return
|
|
|
|
resource = Resource.create({"service.name": settings.OTEL_SERVICE_NAME})
|
|
|
|
provider = TracerProvider(resource=resource)
|
|
|
|
otlp_exporter = OTLPSpanExporter(endpoint=settings.OTEL_EXPORTER_OTLP_ENDPOINT)
|
|
provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
|
|
|
|
trace.set_tracer_provider(provider)
|
|
|
|
if engine is not None:
|
|
sync_engine = engine.sync_engine if hasattr(engine, "sync_engine") else engine
|
|
SQLAlchemyInstrumentor().instrument(engine=sync_engine)
|
|
RedisInstrumentor().instrument()
|
|
|
|
if app is not None:
|
|
FastAPIInstrumentor.instrument_app(app)
|
|
|
|
|
|
def get_tracer(name: str = "pip-platform") -> trace.Tracer:
|
|
return trace.get_tracer(name)
|