o
    ưiL,                     @   sf   d dl mZmZmZmZ d dlmZmZ d dlm	Z	 d dl
mZmZmZmZ ddgZG dd dZd	S )
    )DictListOptionalUnion)print_verboseverbose_logger)LATENCY_BUCKETS)DEFAULT_SERVICE_CONFIGSServiceLoggerPayloadServiceMetricsServiceTypeserror_classfunction_namec                	   @   s  e Zd ZdZ	d(defddZdedee fdd	Z	defd
dZ
dd ZdedefddZdedefddZ	d)dededeee  fddZdedefddZdedefddZg fdededeee  fddZdefdd Zdefd!d"Zdefd#d$Zded%eeef fd&d'ZdS )*PrometheusServicesLoggerNFmock_testingc              
   K   sv  zzddl m}m}m}m} ddlm} W n ty    tdw || _|| _|| _|| _t	
d i | _tD ]]}g }	| |}
tj|
v rT| j|jdd}|rT|	| tj|
v rx| j|jdtd	}|ri|	| | j|jd
d}|rx|	| tj|
v r| j|jdd}|r|	| |	r|	| j|j< q7i | _|| _d| _d| _W d S  ty } ztdt|  |d }~ww )Nr   )REGISTRYCounterGauge	Histogram)	Collectorz>Missing prometheus_client. Run `pip install prometheus-client`z#in init prometheus services metricsZlatency)type_of_requestfailed_requests)r   additional_labelstotal_requestssizez(Got exception on init prometheus client )Zprometheus_clientr   r   r   r   Zprometheus_client.gc_collectorr   ImportError	Exceptionr   debugpayload_to_prometheus_mapr   _get_service_metrics_initializer   	HISTOGRAMcreate_histogramvalueappendCOUNTERcreate_counterFAILED_REQUESTS_LABELSZGAUGEcreate_gaugeZprometheus_to_amount_mapr   mock_testing_success_callsmock_testing_failure_callsr   str)selfr   kwargsr   r   r   r   r   serviceZservice_metricsZmetrics_to_initialize	histogramZcounter_failed_requestZcounter_total_requestsgaugee r1   _/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/prometheus_services.py__init__   sl   








z!PrometheusServicesLogger.__init__r-   returnc                 C   sH   t jt jg}|tvr|S t|i dg }|s"td|  |S |S )NmetricszNo metrics found for service )r   r$   r    r	   getr   r   )r+   r-   ZDEFAULT_METRICSr5   r1   r1   r2   r   ^   s   z8PrometheusServicesLogger._get_service_metrics_initializec                 C   sB   t | jdd }|d ur||v S | j D ]
}||jkr dS qdS )N_names_to_collectorsTF)getattrr   Zcollectname)r+   metric_nameZnames_to_collectorsZmetricr1   r1   r2   is_metric_registeredk   s   
z-PrometheusServicesLogger.is_metric_registeredc                 C   s   | j j|S )zL
        Helper function to get a metric from the registry by name.
        )r   r7   r6   )r+   r:   r1   r1   r2   _get_metricv   s   z$PrometheusServicesLogger._get_metricr   c                 C   s>   d ||}| |}|r| |S | j|d ||gtdS )Nlitellm_{}_{}zLatency for {} service)
labelnamesZbuckets)formatr;   r<   r   r   r+   r-   r   r:   is_registeredr1   r1   r2   r!   |   s   

z)PrometheusServicesLogger.create_histogramc                 C   s<   d ||}| |}|r| |S | j|d ||gdS )Nr=   zGauge for {} servicer>   )r?   r;   r<   r   r@   r1   r1   r2   r'      s   

z%PrometheusServicesLogger.create_gauger   c                 C   sF   d ||}| |}|r| |S | j|d |||g|pg  dS )Nr=   zTotal {} for {} servicerB   )r?   r;   r<   r   )r+   r-   r   r   r:   rA   r1   r1   r2   r%      s   


z'PrometheusServicesLogger.create_counterlabelsamountc                 C   $   t || jsJ ||| d S N)
isinstancer   rC   Zobserve)r+   r.   rC   rD   r1   r1   r2   observe_histogram   s   z*PrometheusServicesLogger.observe_histogramc                 C   rE   rF   )rG   r   rC   set)r+   r/   rC   rD   r1   r1   r2   update_gauge   s   z%PrometheusServicesLogger.update_gaugec                 C   sD   t || jsJ |r|j|g|R  | d S ||| d S rF   )rG   r   rC   inc)r+   counterrC   rD   r   r1   r1   r2   increment_counter   s   z*PrometheusServicesLogger.increment_counterpayloadc                 C   s   | j r
|  jd7  _|jj| jv rD| j|jj }|D ]+}t|| jr.| j||jj|jd qt|| j	rCd|j
v rC| j||jjdd qd S d S )N   r.   rC   rD   r   rL   rC   rD   )r   r(   r-   r"   r   rG   r   rH   durationr   _namerM   r+   rN   prom_objectsobjr1   r1   r2   service_success_hook   s(   z-PrometheusServicesLogger.service_success_hookc                 C   sb   | j r
|  jd7  _|jj| jv r-| j|jj }|D ]}t|| jr,| j||jjdd qd S d S )NrO   rQ   )r   r)   r-   r"   r   rG   r   rM   rT   r1   r1   r2   service_failure_hook   s   z-PrometheusServicesLogger.service_failure_hookc                    s   | j r|  jd7  _|jj| jv rc| j|jj }|D ]I}t|| jr/| j||jj|jd qt|| j	rEd|j
v rE| j||jjdd qt|| jrb|jrb| j||jdpXd|jdp_dd	 qd
S d
S )z3
        Log successful call to prometheus
        rO   rP   r   rQ   Zgauge_labels Zgauge_valuer   )r/   rC   rD   N)r   r(   r-   r"   r   rG   r   rH   rR   r   rS   rM   r   Zevent_metadatarJ   r6   rT   r1   r1   r2   async_service_success_hook   s8   z3PrometheusServicesLogger.async_service_success_hookerrorc                    s   | j r|  jd7  _|jj}|j}|jj| jv rH| j|jj }|D ]'}t|| j	rGd|j
v r=| j||jj||gdd q"| j||jjdd q"d S d S )NrO   r   )rL   rC   r   rD   rQ   )r   r)   	__class____name__Z	call_typer-   r"   r   rG   r   rS   rM   )r+   rN   r[   r   r   rU   rV   r1   r1   r2   async_service_failure_hook  s0   
z3PrometheusServicesLogger.async_service_failure_hook)FrF   )r]   
__module____qualname__Zlitellm_service_latencyboolr3   r   r   r   r   r;   r<   r*   r!   r'   r   r%   floatrH   rJ   rM   r
   rW   rX   rZ   r   r   r^   r1   r1   r1   r2   r      sb    
F








r   N)typingr   r   r   r   Zlitellm._loggingr   r   Z%litellm.types.integrations.prometheusr   Zlitellm.types.servicesr	   r
   r   r   r&   r   r1   r1   r1   r2   <module>   s   