
    AHj                         d Z ddlZddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ erddlmZ ddlmZ eZeeef   ZneZeZ G d de      Zy)zO
arize AI is OTEL compatible

this file has Arize ai specific helper functions
    N)datetime)TYPE_CHECKINGAnyOptionalUnion)_utils)ArizeOTELAttributes)OpenTelemetry)ArizeConfig)ServiceLoggerPayload)StandardCallbackDynamicParams)Span)Protocolc                   *   e Zd ZdZd Zd Zdedee   fdZ	e
defd       Ze
defd	       Z	 	 	 	 ddedee   deeeef      deeeef      dee   f
dZ	 	 	 	 	 ddedee   dee   deeeef      deeeef      dee   fdZd Zdedee   fdZy
)ArizeLoggera"  
    Arize logger that sends traces to an Arize endpoint.

    Creates its own dedicated TracerProvider so it can coexist with the
    generic ``otel`` callback (or any other OTEL-based integration) without
    fighting over the global ``opentelemetry.trace`` TracerProvider singleton.
    c                    ddl m} ddlm} ||j	                  d      | _        || _        y || j                  | j                              }|j                  | j                                |j	                  d      | _        || _        y)z
        Override to always create a *private* TracerProvider for Arize.

        See ArizePhoenixLogger._init_tracing for full rationale.
        r   )TracerProvider)SpanKindNlitellm)resource)opentelemetry.sdk.tracer   opentelemetry.tracer   
get_tracertracer	span_kind_get_litellm_resourceconfigadd_span_processor_get_span_processor)selftracer_providerr   r   providers        X/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/integrations/arize/arize.py_init_tracingzArizeLogger._init_tracing'   su     	;0&)44Y?DK%DN!4+E+Edkk+RS##D$<$<$>?)))4!    c                      y)z
        Override: Arize should NOT overwrite the proxy's
        ``open_telemetry_logger``.  That attribute is reserved for the
        primary ``otel`` callback which handles proxy-level parent spans.
        N )r    s    r#   "_init_otel_logger_on_litellm_proxyz.ArizeLogger._init_otel_logger_on_litellm_proxy:   s     	r%   spanresponse_objc                 2    t         j                  |||       y N)r   set_arize_attributes)r    r)   kwargsr*   s       r#   set_attributeszArizeLogger.set_attributesB   s    ((v|Dr%   c                 <    t        j                  | ||t               y r,   )r   r/   r	   )r)   r.   r*   s      r#   r-   z ArizeLogger.set_arize_attributesF   s    dFL:MNr%   returnc                     t         j                  j                  d      } t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }t         j                  j                  d      }d}d}|rd}|}n|rd	}|}nd}d
}t        | |||||      S )z
        Helper function to get Arize configuration.

        Returns:
            ArizeConfig: A Pydantic model containing Arize configuration.

        Raises:
            ValueError: If required environment variables are not set.
        ARIZE_SPACE_IDARIZE_SPACE_KEYARIZE_API_KEYARIZE_PROJECT_NAMEARIZE_ENDPOINTARIZE_HTTP_ENDPOINTN	otlp_grpc	otlp_httpzhttps://otlp.arize.com/v1)space_id	space_keyapi_keyprotocolendpointproject_name)osenvirongetr   )r;   r<   r=   r@   grpc_endpointhttp_endpointr?   r>   s           r#   get_arize_configzArizeLogger.get_arize_configK   s     ::>>"23JJNN#45	**..1zz~~&:;

'78

'<=("H$H"H$H"H2H%
 	
r%   Npayloadparent_otel_span
start_timeend_timeevent_metadatac                    K   ywzaArize is used mainly for LLM I/O tracing, sending router+caching metrics adds bloat to arize logsNr'   )r    rG   rH   rI   rJ   rK   s         r#   async_service_success_hookz&ArizeLogger.async_service_success_hookt   s      	   errorc                    K   ywrM   r'   )r    rG   rP   rH   rI   rJ   rK   s          r#   async_service_failure_hookz&ArizeLogger.async_service_failure_hook   s      	rO   c                    K   	 | j                         }|j                  s|j                  sdddS |j                  sdddS dddS # t        $ r}ddt        |       dcY d	}~S d	}~ww xY ww)
z
        Performs a health check for Arize integration.

        Returns:
            dict: Health check result with status and message
        	unhealthyz>ARIZE_SPACE_ID or ARIZE_SPACE_KEY environment variable not set)statuserror_messagez*ARIZE_API_KEY environment variable not sethealthyz)Arize credentials are configured properly)rU   messagezArize health check failed: N)rF   r;   r<   r=   	Exceptionstr)r    r   es      r#   async_health_checkzArizeLogger.async_health_check   s     	**,F??6+;+;)%e 
 >>)%Q  $F 
  	%#>s1vh!G 	sJ   A.,A A.A A.A A.	A+A& A+!A.&A++A. standard_callback_dynamic_paramsc                     i }|j                  d      r|j                  d      |d<   |j                  d      r|j                  d      |d<   |j                  d      r|j                  d      |d<   |S )z
        Construct dynamic Arize headers from standard callback dynamic params

        This is used for team/key based logging.

        Returns:
            dict: A dictionary of dynamic Arize headers
        arize_space_idzarize-space-idarize_space_keyarize_api_keyr=   )rC   )r    r]   dynamic_headerss      r#   construct_dynamic_otel_headersz*ArizeLogger.construct_dynamic_otel_headers   s      ,//0@A0P0T0T 1O,- ,//0AB0P0T0T!1O,- ,//@)I)M)M*OI& r%   )NNNN) NNNN)__name__
__module____qualname____doc__r$   r(   r   r   r   r/   staticmethodr-   r   rF   r   r   r   floatdictrN   rZ   rR   r\   r   rc   r'   r%   r#   r   r      s]   "&4 x}  4   &
k &
 &
V ,07;59)-	%	 #4.	 U8U?34		
 5512	 !	  "+/7;59)-
%
 }
 #4.	

 U8U?34
 512
 !
(B"0M"	$"r%   r   )rh   rA   r   typingr   r   r   r   litellm.integrations.arizer   !litellm.integrations.arize._utilsr	   "litellm.integrations.opentelemetryr
    litellm.types.integrations.arizer   litellm.types.servicesr   litellm.types.utilsr   r   r   _Spanr   	_Protocolr   r'   r%   r#   <module>ru      s^    
  6 6 - A < 8 7 =1FHDHDx- xr%   