o
    ưi                     @   s   U d Z ddlZddlmZ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dZee ed< ed	Zee ed	< eejd
ZdefddZdd ZdefddZdee fddZdS )z*
Helper functions to query prometheus API
    N)datetime	timedelta)Optional)
get_secret)verbose_logger)get_async_httpx_clienthttpxSpecialProviderPROMETHEUS_URLPROMETHEUS_SELECTED_INSTANCE)Zllm_providermetric_namec                    sp   t d u r	td|  d}tt }tjt  d||ddI d H }| }td| | d d }|S )	N=PROMETHEUS_URL not set please set 'PROMETHEUS_URL=<>' in .envz[24h]z/api/v1/query)querytimeparams+json response from prometheus /query api %sdataresult)	r	   
ValueErrorintr   async_http_handlergetjsonr   debug)r   r   nowresponse_json_responseresults r   m/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/prometheus_helpers/prometheus_api.pyget_metric_from_prometheus   s   
r    c            
   
      s   d} ddg}|D ]a}t |dI dH }|rdtd| |D ]F}td| |d }|d	 }|d
 }tdur=|dtkr=qtt|d }|dd}|dd}	| d| d| d|	 d7 } | d7 } qtd|  q	| S )zE
    Gets fallback metrics from prometheus for the last 24 hours
     Z-litellm_deployment_successful_fallbacks_totalZ)litellm_deployment_failed_fallbacks_total)r   Nzresponse json %sz
result= %smetricvaluesr   instance   primary_modelUnknownfallback_model`z3 successful fallback requests` with primary model=`z` -> fallback model=`
zresponse message %s)r    r   r   r
   r   r   float)
Zresponse_messageZrelevant_metricsr"   Zresponse_jsonr   Zmetric_valuesZmost_recent_valuevaluer&   r(   r   r   r   #get_fallback_metric_from_prometheus+   s4   
r-   returnc                   C   s   t d urdS dS )NTF)r	   r   r   r   r   is_prometheus_connectedN   s   r/   api_keyc                    s   t du r	tdt }|tdd }| d }| d }t  d}| du r,d}nd|  d	}|||d
d}tj||dI dH }| }	t	
d|	 | d d }
g }|
D ]$}|d }|D ]\}}tt| d }t|}|||d qaqY|S )z
    Expected Response Format:
    [
    {
        "date": "2024-08-18T00:00:00+00:00",
        "spend": 1.001818099998933
    },
    ...]
    Nr      )daysz+00:00z/api/v1/query_rangez*sum(delta(litellm_spend_metric_total[1d]))z5sum(delta(litellm_spend_metric_total{hashed_api_key="z"}[1d]))Z86400)r   startendstepr   r   r   r   r#   )datespend)r	   r   r   utcnowr   	isoformatr   r   r   r   r   fromtimestampr+   append)r0   end_dateZ
start_dateZ	start_strZend_strurlr   r   r   r   r   Zformatted_resultsr   Zmetric_data	timestampr,   r6   r7   r   r   r   get_daily_spend_from_prometheusT   s@   


r?   )__doc__r   r   r   typingr   Zlitellmr   Zlitellm._loggingr   Z&litellm.llms.custom_httpx.http_handlerr   r   r	   str__annotations__r
   ZLoggingCallbackr   r    r-   boolr/   r?   r   r   r   r   <module>   s$    
#