Ë
    tPêjh  ã                   óÆ  — U d Z ddlZddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZ ddlmZ dd	lmZmZ  ed
«      Zeedz     ed
<    ed«      Zeedz     ed<    eej0                  ¬«      Zeed<    e	e«      Zeed<    G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zdede e   fd„Z!defd„Z"de#fd„Z$dedefd„Z%dedz  de e   fd„Z&y) z*
Helper functions to query prometheus API
é    N)ÚdatetimeÚ	timedelta)ÚFinal)Ú	BaseModelÚTypeAdapter)ÚReadOnlyÚ	TypedDict)Ú
get_secret)Úverbose_logger)Úget_async_httpx_clientÚhttpxSpecialProviderÚPROMETHEUS_URLÚPROMETHEUS_SELECTED_INSTANCE)Úllm_providerÚasync_http_handlerÚ_RAW_JSON_PAYLOADc                   ó@   — e Zd ZU dZeeef   ed<   ee	e
ef      ed<   y)ÚPrometheusRangeSamplez7One ``matrix`` series of the Prometheus HTTP query API.ÚmetricÚvaluesN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚdictÚstrÚobjectÚ__annotations__ÚlistÚtupleÚfloat© ó    ú{/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/prometheus_helpers/prometheus_api.pyr   r      s(   … ÙAà��f�ÑÓØ��u˜c�zÑ"Ñ#Ô#r#   r   c                   ó   — e Zd ZU ee   ed<   y)ÚPrometheusQueryDataÚresultN)r   r   r   r   r   r   r"   r#   r$   r&   r&   "   s   … ØÐ&Ñ'Ô'r#   r&   c                   ó   — e Zd ZU eed<   y)ÚPrometheusQueryResponseÚdataN)r   r   r   r&   r   r"   r#   r$   r)   r)   &   s   … Ø
Ôr#   r)   c                   ó.   — e Zd ZU ee   ed<   ee   ed<   y)ÚPrometheusDailySpendÚdateÚspendN)r   r   r   r   r   r   r!   r"   r#   r$   r,   r,   *   s   … Ø
�3‰-ÓØ�E‰?Ôr#   r,   Úmetric_nameÚreturnc              ƒ   óŽ  K  — t         €t        d«      ‚| › d�}t        t        j                  «       «      }t        j                  t         › d�||dœ¬«      ƒ d {  –—† }t        j                  |j                  «       «      }t        j                  d|«       t        j                  |«      j                  j                  }|S 7 Œh­w)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)r   Ú
ValueErrorÚintr4   r   Úgetr   Úvalidate_pythonÚjsonr   Údebugr)   Úmodel_validater*   r'   )r/   r3   ÚnowÚresponseÚ_json_responseÚresultss         r$   Úget_metric_from_prometheusrC   /   s±   è ø€ ô ÐÜÐXÓYÐYà!�] %Ð(€EÜ”T—Y‘Y“[Ó!€CÜ.×2Ñ2ÜÐ
˜-Ð(¸5È#Ñ1Nð 3ó ÷ €Hô .×=Ñ=¸h¿m¹m»oÓN€NÜ×ÑÐFÈÔWÜ,×;Ñ;¸NÓK×PÑP×WÑW€GØ€Nðús   ‚ACÁCÁA)Cc            
   ƒ   ó   K  — d} ddg}|D ]ì  }t        |¬«      ƒ d{  –—† }|r¾t        j                  d|«       |D ]£  }t        j                  d|«       |j                  }|j                  }|d   }t
        �|j                  d	«      t
        k7  rŒUt        t        |d
   «      «      }|j                  dd«      }	|j                  dd«      }
| d|› d|	› d|
› d�z  } | dz  } Œ¥ t        j                  d| «       Œî | S 7 ŒÞ­w)zE
    Gets fallback metrics from prometheus for the last 24 hours
    Ú Ú-litellm_deployment_successful_fallbacks_totalÚ)litellm_deployment_failed_fallbacks_total)r/   Nzresponse json %sz
result= %sr   Úinstanceé   Úprimary_modelÚUnknownÚfallback_modelú`z3 successful fallback requests` with primary model=`z` -> fallback model=`ú
zresponse message %s)	rC   r   r=   r   r   r   r:   r9   r!   )Úresponse_messageÚrelevant_metricsr   Úresponse_jsonr'   Úmetric_labelsÚmetric_valuesÚmost_recent_valueÚvaluerJ   rL   s              r$   Ú#get_fallback_metric_from_prometheusrV   A   sS  è ø€ ð Ðà7Ø3ðÐð #ò FˆÜ8Øô
÷ 
ˆñ Ü× Ñ Ð!3°]ÔCØ'ò )�Ü×$Ñ$ \°6Ô:Ø &§¡�Ø &§¡�Ø$1°!Ñ$4Ð!ä/Ð;Ø$×(Ñ(¨Ó4Ô8TÒTØ äœEÐ"3°AÑ"6Ó7Ó8�Ø -× 1Ñ 1°/À9Ó M�Ø!.×!2Ñ!2Ð3CÀYÓ!O�Ø  a¨ wÐ.aÐboÐapð  qFð  GUð  FVð  VWð  %Xñ  XÐ Ø  DÑ(Ñ ð)ô 	×ÑÐ2Ð4DÕEð-Fð. Ðð-
ús   ‚C>�C<žCC>c                  ó   — t         �yy)NTF)r   r"   r#   r$   Úis_prometheus_connectedrX   d   s   € ÜÐ!ØØr#   rU   c                 ó0   — t        j                  | d¬«      S )aþ  Render ``value`` as a PromQL double-quoted string literal.

    PromQL string literals follow Go's escape rules
    (https://prometheus.io/docs/prometheus/latest/querying/basics/): a
    backslash begins an escape sequence and a bare ``"`` ends the literal.
    Without escaping, callers that accept arbitrary user-supplied values
    (like the ``api_key`` filter on ``/global/spend/logs``) can inject extra
    label matchers or selectors and read cross-tenant metrics.

    JSON's quoting rules are a strict subset of Go's, so ``json.dumps`` of
    a Python string produces a literal Prometheus accepts: ``\``, ``\"``,
    and the standard ``\n`` / ``\t`` / ``\uNNNN`` control-character
    escapes. The returned value already includes the surrounding quotes.
    F)Úensure_ascii)r<   Údumps)rU   s    r$   Ú_quote_promql_string_literalr\   j   s   € ô �:‰:�e¨%Ô0Ð0r#   Úapi_keyc              ƒ   óâ  K  — t         €t        d«      ‚t        j                  «       }|t	        d¬«      z
  }|j                  «       dz   }|j                  «       dz   }t         › d�}| €d}nt        | «      }d|› d	�}|||d
dœ}t        j                  ||¬«      ƒ d{  –—† }	t        j                  |	j                  «       «      }
t        j                  d|
«       t        j                  |
«      j                   j"                  }|D ���cg c]Q  }|j$                  D ]@  \  }}t        j&                  t)        |«      «      j                  «       dz   t)        |«      dœ‘ŒB ŒS }}}}|S 7 ŒÈc c}}}w ­w)z�
    Expected Response Format:
    [
    {
        "date": "2024-08-18T00:00:00+00:00",
        "spend": 1.001818099998933
    },
    ...]
    Nr2   é   )Údaysz+00:00z/api/v1/query_rangez*sum(delta(litellm_spend_metric_total[1d]))z4sum(delta(litellm_spend_metric_total{hashed_api_key=z}[1d]))Ú86400)r3   ÚstartÚendÚstepr5   r7   )r-   r.   )r   r8   r   Úutcnowr   Ú	isoformatr\   r   r:   r   r;   r<   r   r=   r)   r>   r*   r'   r   Úfromtimestampr!   )r]   Úend_dateÚ
start_dateÚ	start_strÚend_strÚurlr3   Úquoted_api_keyr6   r@   rA   rB   r'   Ú	timestamprU   Úformatted_resultss                   r$   Úget_daily_spend_from_prometheusrp   |   s†  è ø€ ô ÐÜÐXÓYÐYô —o‘oÓ'€HØ ¤9°"Ô#5Ñ5€Jð "×+Ñ+Ó-°Ñ8€IØ×'Ñ'Ó)¨HÑ4€Gä"Ð#Ð#6Ð7€Cà€Ø<‰ä <¸WÓ EˆØGÈÐGWÐW_Ð`ˆð ØØØñ	€Fô /×2Ñ2°3¸vÐ2ÓF×F€HÜ-×=Ñ=¸h¿m¹m»oÓN€NÜ×ÑÐFÈÔWÜ,×;Ñ;¸NÓK×PÑP×WÑW€Gð ÷<ð <ð
 Ø &§¡ò<ñ ˆI�uô	 ×*Ñ*¬5°Ó+;Ó<×FÑFÓHÈ8ÑSÜ˜5“\ó	
ð<ð	
ð<Ðò <ð Ðð Gúô<ùs&   ‚BE/ÂE&ÂA,E/Ä
AE(Å E/Å(E/)'r   r<   r4   r   r   Útypingr   Úpydanticr   r   Útyping_extensionsr   r	   Úlitellmr
   Úlitellm._loggingr   Ú&litellm.llms.custom_httpx.http_handlerr   r   r   r   r   r   ÚLoggingCallbackr   r   r   r   r&   r)   r,   r   rC   rV   ÚboolrX   r\   rp   r"   r#   r$   ú<module>ry      s  ðòó Û ß (Ý ç +ß 1å Ý +÷ñ
 %/Ð/?Ó$@€��c˜D‘jÑ!Ó @Ù2<Ð=[Ó2\Ð ˜e C¨$¡JÑ/Ó \Ù2Ð@T×@dÑ@dÔeÐ �EÓ eá& vÓ.Ð �5Ó .ô$˜Iô $ô(˜)ô (ô˜iô ô˜9ô ð
Øðà	Ð
Ñ óð$ °3ó  ðF ó ð1¨ð 1°ó 1ð$1°3¸±:ð 1À$ÐG[ÑB\ô 1r#   