
    ^hJ-                         S SK r S SKJrJr  S SKJrJrJrJr  S SKrS SK	J
r
  S SKJr  SSKJr  SSKJr  SS	KJr  SS
KJrJr  \(       a  S SKJr  S SKJr  \r\rO\r\r " S S\5      rg)    N)datetime	timedelta)TYPE_CHECKINGAnyOptionalUnion)verbose_logger)UserAPIKeyAuth   )CustomLoggerDataDogLogger)PrometheusServicesLogger)ServiceLoggerPayloadServiceTypes)SpanOpenTelemetryc                     ^  \ rS rSrSrSS\SS4S jjr   SS\S\S	\	S
\
\   S\
\\\4      S\
\\\4      4S jjrS\S\S\S	\	4S jr    SS\S	\	S\S
\
\   S\
\\\4      S\
\\\4      S\
\   4S jjrS rS rS r    SS\S\S\\	\4   S	\	S
\
\   S\
\\\4      S\
\\\4      S\
\   4S jjrS\S\S\4U 4S jjrS rSrU =r$ )ServiceLogging   zZ
Separate class used for monitoring health of litellm-adjacent services (redis/postgres).
mock_testingreturnNc                     Xl         SU l        SU l        SU l        SU l        S[
        R                  ;   a  [        5       U l        g g )Nr   prometheus_system)	r   mock_testing_sync_success_hookmock_testing_async_success_hookmock_testing_sync_failure_hookmock_testing_async_failure_hooklitellmservice_callbackr   prometheusServicesLogger)selfr   s     Q/home/james-whalen/.local/lib/python3.13/site-packages/litellm/_service_logger.py__init__ServiceLogging.__init__   sF    (./+/0,./+/0,'":"::,D,FD) ;    serviceduration	call_typeparent_otel_span
start_timeend_timec                    U R                   (       a  U =R                  S-  sl         [        R                  " 5       nUR	                  5       (       a$  UR                  U R                  UUUUUUS95        gUR                  U R                  UUUUUUS95        g! [         a+    [        R                  " U R                  UUUUUUS95         gf = f)zM
Handles both sync and async monitoring by checking for existing event loop.
r   )r(   r)   r*   r+   r,   r-   N)
r   r   asyncioget_event_loop
is_runningcreate_taskasync_service_success_hookrun_until_completeRuntimeErrorrun)r#   r(   r)   r*   r+   r,   r-   loops           r$   service_success_hook#ServiceLogging.service_success_hook(   s     //14/'	))+D    33 '!)"+)9#-!) 4 	 ''33 '!)"+)9#-!) 4 	  	KK//#%'%5)% 0 		s   AB 6#B 2CCerrorc                 R    U R                   (       a  U =R                  S-  sl        gg)z_
[TODO] Not implemented for sync calls yet. V0 is focused on async monitoring (used by proxy).
r   N)r   r   )r#   r(   r)   r:   r*   s        r$   service_failure_hook#ServiceLogging.service_failure_hooka   s#     //14/ r'   event_metadatac           	        #    SSK Jn  U R                  (       a  U =R                  S-  sl        [	        SSUUUS9n	[
        R                   GH  n
U
S:X  a;  U R                  5       I Sh  vN   U R                  R                  U	S9I Sh  vN   ME  U
S	:X  d  [        U
[        5      (       a?  U R                  5       I Sh  vN   U R                  R                  U	UUUUS
9I Sh  vN   M  U
S:X  d  [        X5      (       d  M  SSKJn  U R!                  5       I Sh  vN   Uc  M  Uc  M  [        X5      (       d  M  U R"                  R                  U	UUUUS
9I Sh  vN   GM     g N N N N NS N7f)z:
- For counting if the redis, postgres call is successful
r   r   r   FNis_errorr:   r(   r)   r*   r   )payloaddatadogrB   r+   r,   r-   r>   otelopen_telemetry_logger)"litellm.integrations.opentelemetryr   r   r   r   r    r!   'init_prometheus_services_logger_if_noner"   r3   
isinstancer   init_datadog_logger_if_none	dd_loggerlitellm.proxy.proxy_serverrG   init_otel_logger_if_noneotel_logger)r#   r(   r*   r)   r+   r,   r-   r>   r   rB   callbackrG   s               r$   r3   )ServiceLogging.async_service_success_hookj   s}     	E00A50&
  00H..BBDDD33NN# O    Y&*X}*M*M66888nn??#%5)%#1 @    V#z('J'JL33555 %0-9"#8HH**EE ')9#-!)'5 F   3 1D 9 6s   A'E4)E(* E4
E*4E4?E, $E4$E.%E4E4E0E4&E4+E4= E4E2E4*E4,E4.E40E42E4c                    #    [        U S5      (       d  [        5       U l        gU R                  c  U R                  5       U l        g7f)ze
initializes prometheusServicesLogger if it is None or no attribute exists on ServiceLogging Object

r"   N)hasattrr   r"   )r#   s    r$   rI   6ServiceLogging.init_prometheus_services_logger_if_none   sG     
 t788,D,FD) 	 **2,0,I,I,KD)s   AAc                 R   #    SSK Jn  [        U S5      (       d  U" 5       U l        g7f)zV
initializes dd_logger if it is None or no attribute exists on ServiceLogging Object

r   r   rL   N)$litellm.integrations.datadog.datadogr   rS   rL   )r#   r   s     r$   rK   *ServiceLogging.init_datadog_logger_if_none   s$     
 	Gt[)),9ODNs   %'c                    #    SSK Jn  SSKJn  [	        U S5      (       d0  Ub  [        X!5      (       a  X l        g[        R                  " S5        g7f)zX
initializes otel_logger if it is None or no attribute exists on ServiceLogging Object

r   r   rF   rO   NzPServiceLogger: open_telemetry_logger is None or not an instance of OpenTelemetry)	rH   r   rM   rG   rS   rJ   rO   r	   warning)r#   r   rG   s      r$   rN   'ServiceLogging.init_otel_logger_if_none   sV     
 	EDt]++$0Z%6 6 3H 
 	 &&f 	s   AAc	           
        #    SSK Jn	  U R                  (       a  U =R                  S-  sl        Sn
[	        U[
        5      (       a  [        U5      n
O[	        U[        5      (       a  Un
[        SU
UUUS9n[        R                   GH:  nUS:X  a<  U R                  5       I Sh  vN   U R                  R                  UUS	9I Sh  vN   MF  US
:X  d  [	        U[        5      (       a@  U R                  5       I Sh  vN   U R                  R                  UU
UUUUS9I Sh  vN   M  US:X  d  [	        X5      (       d  M  SSKJn  U R%                  5       I Sh  vN   [	        U[        5      (       d  [        U5      nUc  M  Uc  GM  [	        X5      (       d  GM  U R&                  R)                  UUUUUS9I Sh  vN   GM=     g GN# GN N N Nw N7f)z<
- For counting if the redis, postgres call is unsuccessful
r   r   r    Tr@   r   N)rB   r:   rC   )rB   r:   r+   r,   r-   r>   rE   rF   rD   )rH   r   r   r   rJ   	Exceptionstrr   r    r!   rI   r"   async_service_failure_hookr   rK   rL   rM   rG   rN   rO   r3   )r#   r(   r)   r:   r*   r+   r,   r-   r>   r   error_messagerB   rP   rG   s                 r$   r_   )ServiceLogging.async_service_failure_hook   s     	E00A50eY''JMs##!M&
  00H..BBDDD33NN# O    Y&*X}*M*M66888nn??#'%5)%#1 @    V#z('J'JL33555!%--JE %0-9"#8HH**EE ')9#-!)'5 F   = 1D
 9 6s   B!G#G$!GG	4G:G;%G G!G?GG%GGG G;G<G	GGGGGrequest_dataoriginal_exceptionuser_api_key_dictc                 B   >#    [         TU ]  UUU5      I Sh  vN $  N7f)z,
Hook to track failed litellm-service calls
N)superasync_post_call_failure_hook)r#   rb   rc   rd   	__class__s       r$   rg   +ServiceLogging.async_post_call_failure_hook  s-      W9
 
 	
 
s   c                 V  #     XC-
  n[        U[        5      (       a  UR                  5       nO:[        U[        5      (       a  O$[	        SR                  U[        U5      5      5      eU R                  [        R                  UUS   S9I Sh  vN   g N! [         a  nUeSnAff = f7f)z7
Hook to track latency for litellm proxy llm api calls
z7Duration={} is not a float or timedelta object. type={}r*   )r(   r)   r*   N)
rJ   r   total_secondsfloatr]   formattyper3   r   LITELLM)r#   kwargsresponse_objr,   r-   	_durationes          r$   async_log_success_event&ServiceLogging.async_log_success_event%  s     	 -I)Y//%335	Iu--MTT!4	? 
 11$,," - 2   
  	G	s;   B)B	B BB B)B 
B&B!!B&&B))rL   r   r   r   r   r   rO   r"   )F)NNN)NNNN)__name__
__module____qualname____firstlineno____doc__boolr%   r   rl   r^   r   r   r   r   r8   r]   r<   dictr3   rI   rK   rN   r_   r
   rg   rt   __static_attributes____classcell__)rh   s   @r$   r   r      s   GT Gd G ,07;5977 7 	7
 #4.7 U8U?347 5127r5#5/45=F5SV5 ,07;59)-99 9 	9
 #4.9 U8U?349 55129 !9v	
2 ,07;59)-EE E S)^$	E
 E #4.E U8U?34E 512E !EN

 &
 *	
 r'   r   )r/   r   r   typingr   r   r   r   r    litellm._loggingr	   litellm.proxy._typesr
   integrations.custom_loggerr   integrations.datadog.datadogr    integrations.prometheus_servicesr   types.servicesr   r   opentelemetry.tracer   _SpanrH   r   	OTELClassr    r'   r$   <module>r      sQ     ( 6 6  + / 4 7 F >1@DIDIa\ ar'   