mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-05 08:07:05 +00:00
* fix(otel/v2): detach credential-routed tenant spans into their own trace Multi-tenant OTel v2 routes a team or key's LLM-call span to that tenant's own vendor account (New Relic, Arize, Langfuse, Weave) via dynamic OTLP credential headers, while the request-root, auth, and db spans stay on the operator's default backend. The span was still parented into the request trace, so the tenant account received a child whose parent it never got, and New Relic rendered it as a fragmented trace with a missing parent. Detach a credential-routed span the same way a project-routed (Phoenix) span already detaches: root a fresh trace in the tenant account and link back to the request trace for correlation. Service-name routing keeps parenting, since it only relabels service.name on the same operator backend where the parent is present. Guard the detach on the callback actually owning an OTLP exporter the credentials can reach: a callback owning only a console or in_memory exporter has nowhere to stamp them, so the span would export to the default backend unchanged and detaching would orphan it on the very backend that holds its parent. In that case warn once and keep the default tracer. * fix(otel/v2): derive tenant-route routability from resolved exporter transport A denylist classified an owned exporter as routable whenever its kind was not console/in_memory, so a typo'd or unavailable kind (e.g. "otlp", "grcp") passed the check while _exporter_from_spec falls it back to a header-ignoring console exporter. Detaching such a span would root a fresh trace that only ever reaches the operator console, never the tenant backend, orphaning it on both sides. Route on a shared exporter_transport() predicate that resolves the kind the same way _exporter_from_spec builds it (registered factories + otlp_http aliases -> http, otlp_grpc aliases -> grpc, else headerless), so an unresolvable kind is headerless and stays parented. Fixes the same latent gap in project routability. |
||
|---|---|---|
| .. | ||
| agent_tests | ||
| audio_tests | ||
| base_sdk_tests | ||
| basic_proxy_startup_tests | ||
| batches_tests | ||
| benchmarks | ||
| code_coverage_tests | ||
| documentation_tests | ||
| e2e | ||
| enterprise | ||
| guardrails_tests | ||
| image_gen_tests | ||
| integration | ||
| litellm-proxy-extras | ||
| litellm_utils_tests | ||
| llm_responses_api_testing | ||
| llm_translation | ||
| load_tests | ||
| local_testing | ||
| logging_callback_tests | ||
| mcp_tests | ||
| multi_instance_e2e_tests | ||
| ocr_tests | ||
| openai_endpoints_tests | ||
| otel_tests | ||
| pass_through_tests | ||
| pass_through_unit_tests | ||
| proxy_admin_ui_tests | ||
| proxy_behavior | ||
| proxy_e2e_anthropic_messages_tests | ||
| proxy_migration_tests | ||
| proxy_security_tests | ||
| proxy_unit_tests | ||
| router_unit_tests | ||
| search_tests | ||
| spend_tracking_tests | ||
| store_model_in_db_tests | ||
| test_litellm | ||
| unified_google_tests | ||
| vector_store_tests | ||
| windows_tests | ||
| __init__.py | ||
| _fake_openai_endpoint_server.py | ||
| _flush_vcr_cache.py | ||
| _live_test_helpers.py | ||
| _openai_record_replay_proxy.py | ||
| _vcr_conftest_common.py | ||
| _vcr_redis_persister.py | ||
| _wait_helpers.py | ||
| _ws_vcr.py | ||
| eval_swe_bench.py | ||
| fake_openai_endpoint.py | ||
| gettysburg.wav | ||
| large_text.py | ||
| openai_batch_completions.jsonl | ||
| pyrightconfig.json | ||
| README.MD | ||
| test_anthropic_compaction_usage.py | ||
| test_budget_management.py | ||
| test_callbacks_on_proxy.py | ||
| test_debug_warning.py | ||
| test_default_encoding_non_root.py | ||
| test_end_users.py | ||
| test_fallbacks.py | ||
| test_gpt5_azure_temperature_support.py | ||
| test_health.py | ||
| test_keys.py | ||
| test_litellm_proxy_responses_config.py | ||
| test_logging.conf | ||
| test_models.py | ||
| test_new_vector_store_endpoints.py | ||
| test_openai_endpoints.py | ||
| test_organizations.py | ||
| test_otel_thread_leak.py | ||
| test_presidio_latency.py | ||
| test_proxy_server_non_root.py | ||
| test_ratelimit.py | ||
| test_resource_cleanup.py | ||
| test_service_logger_otel.py | ||
| test_spend_logs.py | ||
| test_team.py | ||
| test_team_logging.py | ||
| test_team_members.py | ||
| test_users.py | ||
In total litellm runs 1000+ tests
[02/20/2025] Update:
To make it easier to contribute and map what behavior is tested,
we've started mapping the litellm directory in tests/test_litellm
This folder can only run mock tests.