diff --git a/litellm/integrations/arize/arize.py b/litellm/integrations/arize/arize.py index 60c6adf575..768f8a655d 100644 --- a/litellm/integrations/arize/arize.py +++ b/litellm/integrations/arize/arize.py @@ -101,3 +101,11 @@ class ArizeLogger(OpenTelemetry): ): """Arize is used mainly for LLM I/O tracing, sending router+caching metrics adds bloat to arize logs""" pass + + def create_litellm_proxy_request_started_span( + self, + start_time: datetime, + headers: dict, + ): + """Arize is used mainly for LLM I/O tracing, sending Proxy Server Request adds bloat to arize logs""" + pass diff --git a/litellm/integrations/opentelemetry.py b/litellm/integrations/opentelemetry.py index 53bac2e2a7..76b8ec75c5 100644 --- a/litellm/integrations/opentelemetry.py +++ b/litellm/integrations/opentelemetry.py @@ -485,12 +485,7 @@ class OpenTelemetry(CustomLogger): self, span: Span, kwargs, response_obj: Optional[Any] ): try: - if self.callback_name == "arize": - from litellm.integrations.arize.arize import ArizeLogger - - ArizeLogger.set_arize_attributes(span, kwargs, response_obj) - return - elif self.callback_name == "arize_phoenix": + if self.callback_name == "arize_phoenix": from litellm.integrations.arize.arize_phoenix import ArizePhoenixLogger ArizePhoenixLogger.set_arize_phoenix_attributes( @@ -1006,3 +1001,18 @@ class OpenTelemetry(CustomLogger): ) management_endpoint_span.set_status(Status(StatusCode.ERROR)) management_endpoint_span.end(end_time=_end_time_ns) + + def create_litellm_proxy_request_started_span( + self, + start_time: datetime, + headers: dict, + ) -> Optional[Span]: + """ + Create a span for the received proxy server request. + """ + return self.tracer.start_span( + name="Received Proxy Server Request", + start_time=self._to_ns(start_time), + context=self.get_traceparent_from_header(headers=headers), + kind=self.span_kind.SERVER, + ) diff --git a/litellm/proxy/auth/user_api_key_auth.py b/litellm/proxy/auth/user_api_key_auth.py index 7e293b758d..63411cab12 100644 --- a/litellm/proxy/auth/user_api_key_auth.py +++ b/litellm/proxy/auth/user_api_key_auth.py @@ -370,14 +370,11 @@ async def _user_api_key_auth_builder( # noqa: PLR0915 ) if open_telemetry_logger is not None: - - parent_otel_span = open_telemetry_logger.tracer.start_span( - name="Received Proxy Server Request", - start_time=_to_ns(start_time), - context=open_telemetry_logger.get_traceparent_from_header( - headers=request.headers - ), - kind=open_telemetry_logger.span_kind.SERVER, + parent_otel_span = ( + open_telemetry_logger.create_litellm_proxy_request_started_span( + start_time=start_time, + headers=dict(request.headers), + ) ) ### USER-DEFINED AUTH FUNCTION ### diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 37790cb489..f10b4ef86b 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -33,9 +33,12 @@ from litellm.types.utils import ( if TYPE_CHECKING: from opentelemetry.trace import Span as _Span + from litellm.integrations.opentelemetry import OpenTelemetry + Span = _Span else: Span = Any + OpenTelemetry = Any def showwarning(message, category, filename, lineno, file=None, line=None): @@ -777,7 +780,7 @@ disable_spend_logs = False jwt_handler = JWTHandler() prompt_injection_detection_obj: Optional[_OPTIONAL_PromptInjectionDetection] = None store_model_in_db: bool = False -open_telemetry_logger: Optional[Any] = None +open_telemetry_logger: Optional[OpenTelemetry] = None ### INITIALIZE GLOBAL LOGGING OBJECT ### proxy_logging_obj = ProxyLogging( user_api_key_cache=user_api_key_cache, premium_user=premium_user