o
    ưi/                     @   s   d dl Z d dlmZmZ d dlmZmZmZmZ d dl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mZ erYd dlmZ d dlmZ eeef ZeZneZeZeZG dd deZdS )    N)datetime	timedelta)TYPE_CHECKINGAnyOptionalUnion)verbose_logger   )CustomLoggerDataDogLogger)OpenTelemetry)PrometheusServicesLogger)ServiceLoggerPayloadServiceTypes)Span)UserAPIKeyAuthc                       sz  e Zd ZdZd&deddfddZ			d'ded	ed
ede	e
 de	eeef  de	eeef  fddZded	eded
efddZ				d(ded
ed	ede	e
 de	eeef  de	eeef  de	e fddZdd Zdd Zdd Z				d(ded	edeeef d
ede	e
 de	eeef  de	eeef  de	e fddZ	d)deded ed!e	e f fd"d#Zd$d% Z  ZS )*ServiceLoggingzb
    Separate class used for monitoring health of litellm-adjacent services (redis/postgres).
    Fmock_testingreturnNc                 C   s8   || _ d| _d| _d| _d| _dtjv rt | _d S d S )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    r   N/home/app/Keep/.python/lib/python3.10/site-packages/litellm/_service_logger.py__init__    s   
zServiceLogging.__init__serviceduration	call_typeparent_otel_span
start_timeend_timec                 C   s   | j r
|  jd7  _z*t }| r$|| j||||||d W dS || j||||||d W dS  tyL   t	| j||||||d Y dS w )z]
        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'   loopr   r   r    service_success_hook)   sJ   



z#ServiceLogging.service_success_hookerrorc                 C   s   | j r|  jd7  _dS dS )zo
        [TODO] Not implemented for sync calls yet. V0 is focused on async monitoring (used by proxy).
        r	   N)r   r   )r   r"   r#   r2   r$   r   r   r    service_failure_hookb   s   z#ServiceLogging.service_failure_hookevent_metadatac                    s  | j r|  jd7  _tdd||||d}tjD ]p}	|	dkr0|  I dH  | jj|dI dH  q|	dks9t|	t	rO| 
 I dH  | jj|||||dI dH  q|	d	ksXt|	trd}
t|	trb|	}
nd
dlm} |durst|trs|}
|
dur|dur|
j|||||dI dH  qdS )zJ
        - For counting if the redis, postgres call is successful
        r	   FNZis_errorr2   r"   r#   r$   r4   r   )payloaddatadog)r6   r%   r&   r'   r4   otelr   open_telemetry_logger)r   r   r   r   r   'init_prometheus_services_logger_if_noner   r,   
isinstancer   init_datadog_logger_if_none	dd_loggerr   litellm.proxy.proxy_serverr:   )r   r"   r$   r#   r%   r&   r'   r4   r6   callback_otel_logger_to_user:   r   r   r    r,   k   sZ   
	

z)ServiceLogging.async_service_success_hookc                    s0   t | dst | _dS | jdu r|  | _dS )zu
        initializes prometheusServicesLogger if it is None or no attribute exists on ServiceLogging Object

        r   N)hasattrr   r   )r   r   r   r    r;      s   


z6ServiceLogging.init_prometheus_services_logger_if_nonec                    s$   ddl m} t| ds| | _dS )zf
        initializes dd_logger if it is None or no attribute exists on ServiceLogging Object

        r   r   r>   N)Z$litellm.integrations.datadog.datadogr   rB   r>   )r   r   r   r   r    r=      s
   
z*ServiceLogging.init_datadog_logger_if_nonec                    sB   ddl m} t| ds|durt|tr|| _dS td dS )zh
        initializes otel_logger if it is None or no attribute exists on ServiceLogging Object

        r   r9   otel_loggerNzPServiceLogger: open_telemetry_logger is None or not an instance of OpenTelemetry)r?   r:   rB   r<   r   rC   r   warning)r   r:   r   r   r    init_otel_logger_if_none   s   

z'ServiceLogging.init_otel_logger_if_nonec	              	      sT  | j r|  jd7  _d}	t|trt|}	nt|tr|}	td|	||||d}
tjD ]|}|dkrD|  I dH  | j	j
|
|dI dH  q+|dksMt|trd|  I dH  | jj
|
|	||||d	I dH  q+|d
ksmt|trd}t|trw|}nddlm} |durt|tr|}t|tst|}|dur|dur|j
|
|||||d	I dH  q+dS )zL
        - For counting if the redis, postgres call is unsuccessful
        r	    Tr5   r   N)r6   r2   r7   )r6   r2   r%   r&   r'   r4   r8   r   r9   )r   r   r<   	Exceptionstrr   r   r   r;   r   async_service_failure_hookr   r=   r>   r   r?   r:   )r   r"   r#   r2   r$   r%   r&   r'   r4   error_messager6   r@   rA   r:   r   r   r    rI      sn   



	


z)ServiceLogging.async_service_failure_hookrequest_dataoriginal_exceptionuser_api_key_dicttraceback_strc                    s   t  |||I dH S )z<
        Hook to track failed litellm-service calls
        N)superasync_post_call_failure_hook)r   rK   rL   rM   rN   	__class__r   r    rP     s   

z+ServiceLogging.async_post_call_failure_hookc              
      s   z1|| }t |tr| }nt |trn
td|t|| jtj	||
dddI dH  W dS  ty@ } z|d}~ww )zG
        Hook to track latency for litellm proxy llm api calls
        z7Duration={} is not a float or timedelta object. type={}r$   unknown)r"   r#   r$   N)r<   r   total_secondsfloatrG   formattyper,   r   ZLITELLMget)r   kwargsZresponse_objr&   r'   Z	_durationer   r   r    async_log_success_event+  s*   



z&ServiceLogging.async_log_success_event)F)NNN)NNNN)N)__name__
__module____qualname____doc__boolr!   r   rU   rH   r   r   r   r   r1   rG   r3   dictr,   r;   r=   rE   rI   r   rP   r[   __classcell__r   r   rQ   r    r      s    
9

=
	
Or   )r(   r   r   typingr   r   r   r   r   Zlitellm._loggingr   Zintegrations.custom_loggerr
   Zintegrations.datadog.datadogr   Zintegrations.opentelemetryr   Z integrations.prometheus_servicesr   Ztypes.servicesr   r   Zopentelemetry.tracer   _SpanZlitellm.proxy._typesr   Z	OTELClassr   r   r   r   r    <module>   s&    