diff --git a/litellm/integrations/otel/model/metadata.py b/litellm/integrations/otel/model/metadata.py index 28d6ad54607..4f76ebc56d2 100644 --- a/litellm/integrations/otel/model/metadata.py +++ b/litellm/integrations/otel/model/metadata.py @@ -152,8 +152,14 @@ class RequestIdentity: ) if (value := get(attr)) ) + raw_key_meta: Final = as_str_mapping(get("metadata") or get("user_api_key_auth_metadata")) + key_meta: Final = ( + tuple(flatten_metadata({"user_api_key_auth_metadata": raw_key_meta})) + if raw_key_meta is not None + else () + ) request_meta: Final = flatten_metadata(request_metadata) if request_metadata is not None else () - metadata: Final = MappingProxyType(dict((*request_meta, *auth_meta))) + metadata: Final = MappingProxyType(dict((*request_meta, *auth_meta, *key_meta))) return cls( team_id=as_str(get("team_id")), team_alias=as_str(get("team_alias")), diff --git a/tests/unit/integrations/otel/test_otel_v2_sources_of_truth.py b/tests/unit/integrations/otel/test_otel_v2_sources_of_truth.py index 2d0b4701c9f..4ac00ef889a 100644 --- a/tests/unit/integrations/otel/test_otel_v2_sources_of_truth.py +++ b/tests/unit/integrations/otel/test_otel_v2_sources_of_truth.py @@ -1607,6 +1607,18 @@ def test_request_identity_from_user_api_key_auth(): assert ident.metadata["user_api_key_end_user_id"] == "eu9" +def test_request_identity_from_user_api_key_auth_flattens_key_metadata(): + from litellm.integrations.otel.model.payloads import RequestIdentity + + class _Auth: + metadata = {"team": "a", "customtag": "b", "nested": {"k": "v"}} + + ident = RequestIdentity.from_user_api_key_auth(_Auth()) + assert ident.metadata["user_api_key_auth_metadata.team"] == "a" + assert ident.metadata["user_api_key_auth_metadata.customtag"] == "b" + assert ident.metadata["user_api_key_auth_metadata.nested.k"] == "v" + + # --- request-metadata translation layer (RequestContext) -------------------- #