From 29b6723b016f75fcb5e4c62dfd91006a0d7b0e83 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Wed, 30 Sep 2026 00:40:10 -0700 Subject: [PATCH] feat(proxy): enable agent tracing from general_settings.tracing --- litellm/proxy/proxy_server.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index a994293a4d8..973a76667ec 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -713,6 +713,7 @@ try: except ImportError: build_billing_metrics_recorder = None shutdown_billing_metrics_recorder = None +from litellm.proxy import tracing_endpoints from litellm.proxy.middleware.admission_control_middleware import ( AdmissionControlMiddleware, admission_control_state, @@ -844,6 +845,7 @@ from litellm.secret_managers.main import ( secret_manager_would_be_consulted, str_to_bool, ) +from litellm.tracing import TraceReceiver from litellm.types.integrations.slack_alerting import AlertType, SlackAlertingArgs from litellm.types.llms.anthropic import ( AnthropicMessagesRequest, @@ -1124,6 +1126,9 @@ async def proxy_shutdown_event(worker_heartbeat: ProxyWorkerHeartbeat | None = N await jwt_handler.close() + if tracing_endpoints.receiver is not None: + await tracing_endpoints.receiver.flush() + if db_writer_client is not None: await db_writer_client.close() @@ -1520,6 +1525,9 @@ async def proxy_startup_event(app: FastAPI) -> AsyncGenerator[None, None]: _tagged.strategy._state_loaded = True asyncio.create_task(_adaptive_router_flusher_loop()) + ## [Optional] Initialize agent tracing + await ProxyStartupEvent._init_tracing(general_settings) + ## [Optional] Initialize dd tracer ProxyStartupEvent._init_dd_tracer() @@ -11309,6 +11317,23 @@ class ProxyStartupEvent: ) return connected_client + @classmethod + async def _init_tracing(cls, general_settings: dict) -> None: + """ + Enable agent tracing (`POST/GET /v1/traces`) when configured: + + general_settings: + tracing: + store: clickhouse # CLICKHOUSE_URL / _USER / _PASSWORD / _DATABASE + """ + settings = general_settings.get("tracing") or {} + if settings.get("store") != "clickhouse": + return + tracing = TraceReceiver.from_env() + await tracing.start() + tracing_endpoints.receiver = tracing + verbose_proxy_logger.info("Agent tracing enabled (store=clickhouse)") + @classmethod def _init_dd_tracer(cls): """ @@ -19860,6 +19885,7 @@ app.include_router(rag_router) app.include_router(video_router) app.include_router(container_router) app.include_router(search_router) +app.include_router(tracing_endpoints.router) app.include_router(image_router) app.include_router(fine_tuning_router) app.include_router(credential_router)