
    )#h              	           d dl Z d dlZd dlmZmZ d dlmZmZmZmZm	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 d dlmZ d d	lmZ erd d
lmZ neZ G d de      Z	 ddee   dedee   defdZdedeeef   fdZy)    N)datetime	timedelta)TYPE_CHECKINGAnyListOptionalcast)print_verboseverbose_logger)CustomLogger)UserAPIKeyAuth)*StandardLoggingPayload)!get_end_user_id_for_cost_tracking)LiteLLM_TeamTablec                      e Zd Zd Zd Zdedee   dee   dee   dee   dee   d	ee   d
ee   defdZ	dee   d	ee   dee   dee   de
f
dZdee   dee   dee   dee   dee   d	ee   d
ee   dedefdZdee   dee   de
de
fdZde
dee   dee   dee   dee   d	ee   defdZd Zde
dedefdZde
defdZde
fdZ	 d:de
dedefdZd ede
defd!Zd ede
defd"Zd#ed$ed%ee   d&ee   d'ef
d(Zd$ed%ed&ed'efd)Zd$ed%ee   d&ee   d'efd*Zd$ed%ee   d&ee   d'efd+Zd$ed%ed&ed'ed,ef
d-Zd.ed/ed0efd1Zd2ee   d/ee   d3efd4Z d5 Z!d6 Z"d7e#e$   fd8Z%y9);PrometheusLoggerc                    	 ddl m}m}m} ddlm}m} |durSt        j                  d|j                  j                           |dd|j                  j                         | _        y  |d	d
t        j                  d	            | _         |ddt        j                  d            | _         |ddt        j                  d      t               | _         |ddt        j                  d      t               | _         |ddg dt               | _         |ddg d      | _         |ddg d      | _         |ddt        j                  d            | _         |d d!t        j                  d"            | _         |d#d$d%d&g      | _         |d'd(d)d*g      | _         |d+d,d%d&g      | _         |d-d.d)d*g      | _         |d/d0g d1      | _         |d2d3g d1      | _         |d4d5g d6      | _         |d7d8g d6      | _         |d9d:g d6t               | _          |d;d<d=g      | _!        tD        jF                  j                  tD        jH                  j                  tD        jJ                  j                  tD        jL                  j                  g}g d>} |d?d@|      | _'         |dAdB|tP        gz         | _)         |dCdDtT        g|z   |z         | _+         |dEdFtT        g|z   tX        z   |z         | _-         |dGdHtD        jT                  j                  tD        j\                  j                  g|z   tX        z         | _/         |dIdJtT        g|z   |z         | _0        g d>} |dKdLt        j                  dK            | _1         |dMdNt        j                  dM            | _2         |dOdPt        j                  dO            | _3         |dQdRg d      | _4         |dSdTt        j                  dS            | _5        | jm                          y # tn        $ r}	tq        dUts        |	              |	d }	~	ww xY w)VNr   )CounterGauge	Histogram)CommonProxyErrorspremium_userTu>   🚨🚨🚨 Prometheus Metrics is on LiteLLM Enterprise
🚨 !litellm_not_a_premium_user_metricu?   🚨🚨🚨 Prometheus Metrics is on LiteLLM Enterprise. 🚨 )namedocumentation$litellm_proxy_failed_requests_metriczjTotal number of failed responses from proxy - the client did not get a success response from litellm proxy
label_name)r   r   
labelnames#litellm_proxy_total_requests_metriczXTotal number of requests made to the proxy server - track number of client side requests$litellm_request_total_latency_metricz0Total latency (seconds) for a request to LiteLLM)r!   bucketslitellm_llm_api_latency_metricz1Total latency (seconds) for a models LLM API call*litellm_llm_api_time_to_first_token_metricz-Time to first token for a models LLM API call)modelhashed_api_keyapi_key_aliasteam
team_aliaslitellm_spend_metriczTotal spend on LLM requests)end_userr(   r)   r'   r*   r+   user)r!   litellm_total_tokensz7Total number of input + output tokens from LLM requestslitellm_input_tokensz.Total number of input tokens from LLM requestslitellm_input_tokens_metriclitellm_output_tokensz/Total number of output tokens from LLM requestslitellm_output_tokens_metric$litellm_remaining_team_budget_metriczRemaining budget for teamteam_idr+   'litellm_remaining_api_key_budget_metriczRemaining budget for api keyr(   r)   litellm_team_max_budget_metriczMaximum budget set for team!litellm_api_key_max_budget_metriczMaximum budget set for api key,litellm_remaining_api_key_requests_for_modelzLRemaining Requests API Key can make for model (model based rpm limit on key))r(   r)   r'   *litellm_remaining_api_key_tokens_for_modelzJRemaining Tokens API Key can make for model (model based tpm limit on key)litellm_remaining_requestszWLLM Deployment Analytics - remaining requests for model, returned from LLM API Provider)model_groupapi_providerapi_baselitellm_model_namer(   r)   litellm_remaining_tokensz:remaining tokens for model, returned from LLM API Providerlitellm_overhead_latency_metricz;Latency overhead (milliseconds) added by LiteLLM processing(litellm_provider_remaining_budget_metriczHRemaining budget for provider - used when you set provider budget limitsr=   )r(   r)   r*   r+   litellm_deployment_statezlLLM Deployment Analytics - The state of the deployment: 0 = healthy, 1 = partial outage, 2 = complete outagelitellm_deployment_cooled_downzLLM Deployment Analytics - Number of times a deployment has been cooled down by LiteLLM load balancing logic. exception_status is the status of the exception that caused the deployment to be cooled down$litellm_deployment_success_responseszOLLM Deployment Analytics - Total number of successful LLM API calls via litellm$litellm_deployment_failure_responseszLLM Deployment Analytics - Total number of failed LLM API calls for a specific LLM deploymeny. exception_status is the status of the exception from the llm api+litellm_deployment_failure_by_tag_responseszZTotal number of failed LLM API calls for a specific LLM deploymeny by custom metadata tags!litellm_deployment_total_requestszXLLM Deployment Analytics - Total number of LLM API calls via litellm - success + failure+litellm_deployment_latency_per_output_tokenz3LLM Deployment Analytics - Latency per output token'litellm_deployment_successful_fallbackszfLLM Deployment Analytics - Number of successful fallback requests from primary model -> fallback model#litellm_deployment_failed_fallbackszbLLM Deployment Analytics - Number of failed fallback requests from primary model -> fallback model&litellm_llm_api_failed_requests_metricz5deprecated - use litellm_proxy_failed_requests_metriclitellm_requests_metriczdeprecated - use litellm_proxy_total_requests_metric. Total number of LLM calls to litellm - track total per API Key, team, userz(Got exception on init prometheus client ):prometheus_clientr   r   r   litellm.proxy.proxy_serverr   r   r   warningnot_premium_uservaluer   PrometheusMetricLabels
get_labelsr   r"   LATENCY_BUCKETSr#   r%   r&   r,   litellm_tokens_metricr1   r3   r4   r6   r7   r8   r9   r:   !litellm_remaining_requests_metriclitellm_remaining_tokens_metricrA   rB   UserAPIKeyLabelNamesv2_LITELLM_MODEL_NAMEMODEL_IDAPI_BASEAPI_PROVIDERrC   EXCEPTION_STATUSrD   REQUESTED_MODELrE   EXCEPTION_LABELSrF   TAGrG   rH   rI   rJ   rK   rL   rM   &_initialize_prometheus_startup_metrics	Exceptionr
   str)
selfkwargsr   r   r   r   r   _logged_llm_labelsteam_and_key_labelses
             \/var/www/html/sandstorm/venv/lib/python3.12/site-packages/litellm/integrations/prometheus.py__init__zPrometheusLogger.__init__   sg   }	CCR4'&&UVgVxVxV~V~U  A :A<$cdu  eG  eG  eM  eM  dN  #O:6 8?; K1<<E = 9D5 8?:x1<<D = 8D4 9B6B1<<E =  (9D5 3<0C1<<? =  (3D/ ?H<? (?D; )0&-)D% *1&I*D& 07&@1<<< = 0D, 18'A1<<= = 1D- 9>6+%|49D5 <A9.,o><D8 380-%|43D/ 6;30,o>6D2 AF>^GAD= ?D<\G?D; 6;,i6D2 49*L4D0 4=1M (4D0 =B:Z*+=D9 %::@@$--33$--33$1177	"# -2*~--D) 3:0 ]-1A0BB3D/ 9@;o+,/AADWW9D5
 9@; @+,$%"# &&9D5 @G=l(88>>(,,22 %	%
 ##	@D< 6=8x+,/AADWW6D2# @IBS1<<L = @D< <C9x&11=<D8 8?5t&1198D4 ;B=U;D7 ,3. a1<<8 = ,D( 779 	DSVHMNG	s   A(P) +N=P) )	Q2QQc                 &  K   ddl m} t        j                  d|        |j	                  d      }|t        |t              st        d|       |j	                  dd      }|j	                  di       xs i }|j	                  d	i       }	t        |d
      }
|d	   d   }|d	   d   }|d	   d   }|d	   d   }|d	   d   }|d   }|d   }|d   }|d	   j	                  d      }|t        |t              r|d   }ng }t        d| d| d| d|
 d| 
       t        d;i d|
d|d|d|d   d |d!|d"|d#d$d|d%|d&|d'|d'   d(|d(   d)|d*   d+d d,d d-t        |d	   j	                  d      xs i .      }|/t        |t              r|j                  d/      rdd0lm}  ||      }| j!                  |
||||||||1	       | j#                  ||
|||||||2	       | j%                  |||||3       | j'                  ||||	4       | j)                  |||||||5       | j+                  |||||       |d6   d7u rLt-        t.        j1                  d89      |:      } | j2                  j4                  d;i |j7                          y y w)<Nr   r   z@prometheus Logging - Enters success logging function for kwargs standard_logging_objectz)standard_logging_object is required, got=r'    litellm_paramsmetadata
prometheusservice_typeuser_api_key_user_iduser_api_key_hashuser_api_key_aliasuser_api_key_team_iduser_api_key_team_aliascompletion_tokenstotal_tokensresponse_costrequester_metadatarequest_tagsz'inside track_prometheus_metrics, model z, response_cost z, tokens_used z, end_user_id z, user_api_key r-   r(   r)   requested_modelr<   r*   r+   r.   status_code200r?   tagsmodel_idr>   r=   custom_llm_providerexception_statusexception_classcustom_metadata_labelsrp   zsk-)
hash_token)	end_user_iduser_api_keyrv   r'   user_api_teamuser_api_team_aliasuser_idr{   enum_values)	standard_logging_payloadr   r   rv   r'   r   r   r   r   )r   r   r   rv   ro   )r   rv   rf   rp   )rf   r'   r   rv   r   r   r   streamTr"   r   supported_enum_labelsr    )litellm.types.utilsr   r   debugget
isinstancedict
ValueErrorr   r
   UserAPIKeyLabelValuesget_custom_labels_from_metadatard   
startswithlitellm.proxy.utilsr   ._increment_top_level_request_and_spend_metrics_increment_token_metrics#_increment_remaining_budget_metrics#_set_virtual_key_rate_limit_metrics_set_latency_metrics"set_llm_deployment_success_metricsprometheus_label_factoryrS   rT   r"   labelsinc)re   rf   response_obj
start_timeend_timer   r   r'   ro   	_metadatar   r   r   rv   r   r   output_tokenstokens_usedr{   _requester_metadata_tagsr   r   _labelss                           rj   async_log_success_eventz(PrometheusLogger.async_log_success_event\  s    >NvhW	

 FLZZ%F
  $+:$d4
 ;<T;UV  

7B'$4b9?R"&&z26	7
 +:67MN/
;<OP5jABVW0<=ST6zB%
 11DE.~>0A6zBFF 
 $/J$d5
 -^<EE5eW<L]O[ijuiv  wE  FQ  ER  Ra  bn  ao  p	
 , 
 
'
 -
 5]C	

 
 +
 
 
 
  %
 
 .j9
 .j9
 22GH
 "
  !!
" $C1*=AABVW $#
0 $<-''.6%l3L 	;;#%1' 3'# 	< 
	
 	%% &>#%1' 3# 	& 	
  	00' 3%1) 	1 	
 	00%1	 	1 	
 	!!%1' 3 $ 	" 	
 	//J+}	

 %X.$6.&<&G&GD 'H ' (	G <D44;;FgFJJL 7s   JJr   r   r   rv   r'   r   r   r   r   c
           	         | j                   j                  |||||||      j                  |d          |t        |t              r|d   }
t        t        j                  d      |	      } | j                  j                  d	i |j                  |d          t        t        j                  d      |	      } | j                  j                  d	i |j                  |d          y )
Nrz   r}   r1   r   r   prompt_tokensr3   ry   r   )
rV   r   r   r   r   r   rS   rT   r1   r3   )re   r   r   r   rv   r'   r   r   r   r   r   r   s               rj   r   z)PrometheusLogger._increment_token_metrics  s    	""))	
 #&~6
7#/J$d5
 -^<E*"8"C"C8 #D # $	
 	0((//:':>>$_5	
 +"8"C"C9 #D # $	
 	1))00;7;??$%89	
    ro   c                    |j                  di       j                  dd       }|j                  di       j                  dd       }| j                  ||      }|j                  di       j                  dd       }	|j                  di       j                  dd       }
| j                  |
|	      }| j                  j                  ||      j	                  |       |+| j
                  j                  ||      j	                  |       | j                  j                  ||      j	                  |       |
,| j                  j                  ||      j	                  |
       y y )Nrp   user_api_key_team_spenduser_api_key_team_max_budget
max_budgetspenduser_api_key_spenduser_api_key_max_budget)r   _safe_get_remaining_budgetr4   r   setr7   r6   r8   )re   r   r   r   rv   ro   _team_spend_team_max_budget_remaining_team_budget_api_key_spend_api_key_max_budget_remaining_api_key_budgets               rj   r   z4PrometheusLogger._increment_remaining_budget_metrics+  s{    %((R8<<%t
 *--j"=AA*D
 "&!@!@'{ "A "
 (++J;?? $
 -00R@DD%t
 %)$C$C*. %D %
! 	1188.	

#$
% '//662c"#44;;,	

#'
( *22990c%& +r   r{   c
           	          t        t        j                  d      |	      }
 | j                  j                  di |
j                          | j                  j	                  |||||||      j                  |       y )NrM   r   r   r   )r   rS   rT   rM   r   r   r,   )re   r   r   rv   r'   r   r   r   r{   r   r   s              rj   r   z?PrometheusLogger._increment_top_level_request_and_spend_metrics[  s     +"8"C"C4 #D # $	
 	,$$++6g6::<!!((	
 #m
r   rf   rp   c                    ddl m}  ||      }d| }d| }|j                  |t        j                        xs t        j                  }	|j                  |t        j                        xs t        j                  }
| j
                  j                  |||      j                  |	       | j                  j                  |||      j                  |
       y )Nr   )#get_model_group_from_litellm_kwargszlitellm-key-remaining-requests-zlitellm-key-remaining-tokens-)	)litellm.proxy.common_utils.callback_utilsr   r   sysmaxsizer9   r   r   r:   )re   r   rv   rf   rp   r   r<    remaining_requests_variable_nameremaining_tokens_variable_nameremaining_requestsremaining_tokenss              rj   r   z4PrometheusLogger._set_virtual_key_rate_limit_metricsy  s    	
 :&A-k]; 	) ,I)V& LL93;;GV3;; 	 LL7ET 	 	99@@,k	

# 
!77>>,k	

#
r   c                    |j                  d      xs t        j                         }|j                  d      }	|j                  dd       }
|j                  dd       }|ft        |t              rV|j                  dd      du rB||
z
  j	                         }| j
                  j                  |||||      j                  |       nt        j                  d       |
qt        |
t              ra||
z
  }|j	                         }t        t        j                  d	
      |      } | j                  j                  di |j                  |       |	st        |	t              rb||	z
  }|j	                         }t        t        j                  d
      |      } | j                  j                  di |j                  |       y y y )Nr   r   api_call_start_timecompletion_start_timer   FTzUTime to first token metric not emitted, stream option in model_parameters is not Truer%   r   r   r#   r   )r   r   nowr   total_secondsr&   r   observer   r   r   rS   rT   r%   r#   )re   rf   r'   r   rv   r   r   r   r   r   r   r   time_to_first_token_secondsapi_call_total_timeapi_call_total_time_secondsr   
total_timetotal_time_secondss                     rj   r   z%PrometheusLogger._set_latency_metrics  s    $ZZ
3Ex||~)/L)A
$jj)>E &

+BD I!-0(;

8U+t3 &(;;mo ( ;;BB"# g12  g *z0
 .68K-K*=*K*K*M'.&<&G&G? 'H ' (	G 7D//66AAII+
 !jX&F$,z$9J!+!9!9!;.&<&G&GE 'H ' (	G =D55<<GwGOO" 'G!r   c           	      R  K   ddl m} t        j                  d|        |j	                  dd      }|j	                  di       }|j	                  di       xs i }t        |d	      }	|d
   d   }
|d
   d   }|d
   d   }|d
   d   }|d
   d   }|j	                  dd        	 | j                  j                  |	||||||
      j                          | j                  |       y # t        $ r7}t        j                  dj                  t        |                   Y d }~y d }~ww xY ww)Nr   r   z@prometheus Logging - Enters failure logging function for kwargs r'   rn   rm   ro   rq   rr   rp   rt   ru   rv   rw   rx   	exception0prometheus Layer Error(): Exception occured - {})r   r   r   r   r   r   rL   r   r   "set_llm_deployment_failure_metricsrc   r   formatrd   )re   rf   r   r   r   r   r'   r   ro   r   r   r   rv   r   r   ri   s                   rj   async_log_failure_eventz(PrometheusLogger.async_log_failure_event  sW    >NvhW	

 

7B';A::%r<
   $4b9?R7
 +:67MN/
;<OP5jABVW0<=ST6zB%
 	

;%	77>>"# ce33F; 	  	$$BII#a&Q 	s1   B D'#A C$ #D'$	D$--DD'D$$D'request_dataoriginal_exceptionuser_api_key_dictc                 b  K   	 t        t        t           |j                  d      xs g       }t	        |j
                  |j                  |j                  |j                  |j                  |j                  |j                  dd      t        t        |dd            t        t        |dd            t        |j                  j                        |      }t        t        j!                  d      |	      } | j"                  j$                  di |j'                          t        t        j!                  d
      |	      } | j(                  j$                  di |j'                          y# t*        $ r7}t-        j.                  dj1                  t        |                   Y d}~yd}~ww xY ww)ar  
        Track client side failures

        Proxy level tracking - failed client side requests

        labelnames=[
                    "end_user",
                    "hashed_api_key",
                    "api_key_alias",
                    REQUESTED_MODEL,
                    "team",
                    "team_alias",
                ] + EXCEPTION_LABELS,
        r   r'   rn   r   N)r-   r.   r(   r)   r*   r+   r~   r   r   r   r   r   r   r   r"   r   r   )r	   r   rd   r   r   r   r   api_key	key_aliasr5   r+   getattr	__class____name__r   rS   rT   r   r   r   r"   rc   r   r   r   )re   r   r   r   r   r   r   ri   s           rj   async_post_call_failure_hookz-PrometheusLogger.async_post_call_failure_hook  s    (#	cL$4$4V$<$BCE/*66&..088/99&..,77 , 0 0" =(:M4 PQ!$W-?PT%U!V #$6$@$@$I$I JK /&<&G&GE 'H ' (	G =D55<<GwGKKM.&<&G&GD 'H ' (	G <D44;;FgFJJL 	$$BII#a&Q 		s/   F/E'E, +F/,	F,5-F'"F/'F,,F/datac           
        K   	 t        |j                  |j                  |j                  |j	                  dd      |j
                  |j                  |j                  d      }t        t        j                  d      |      } | j                  j                  d
i |j                          y	# t        $ r7}t        j                   dj#                  t%        |                   Y d	}~y	d	}~ww xY ww)zp
        Proxy level tracking - triggered when the proxy responds with a success response to the client
        r'   rn   r   )r-   r(   r)   r~   r*   r+   r.   r   r"   r   r   r   Nr   )r   r   r   r   r   r5   r+   r   r   rS   rT   r"   r   r   rc   r   r   r   rd   )re   r   r   responser   r   ri   s          rj   async_post_call_success_hookz-PrometheusLogger.async_post_call_success_hook>  s     	/*66088/99 $" 5&..,77&..!	K /&<&G&GD 'H ' (	G <D44;;FgFJJL 	$$BII#a&Q 		s/   C2B*B/ .C2/	C/8-C*%C2*C//C2request_kwargsc                    	 t        j                  d       |j                  di       }|j                  di       xs i }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d	d      }|j                  d
d      }		 | j                  ||||	       | j                  j                  ||||	t        t        |dd            |j                  j                  ||d   d   |d   d   |d   d   |d   d         j                          |At        |t              r0|d   }
|
D ]%  } | j                  j
                  di t        j                  j                   |t        j"                  j                   |t        j$                  j                   |t        j&                  j                   |t        j(                  j                   |t        j*                  j                   |	t        j,                  j                   |j                  j                  t        j.                  j                   t        t        |dd            ij                          ( | j0                  j                  ||||	||d   d   |d   d   |d   d   |d   d   	      j                          y# t2        $ r7}t        j                  dj5                  t        |                   Y d}~yd}~ww xY w)a  
        Sets Failure metrics when an LLM API call fails

        - mark the deployment as partial outage
        - increment deployment failure responses metric
        - increment deployment total requests metric

        Args:
            request_kwargs: dict

        (setting remaining tokens requests metricrm   ro   r'   Nr<   r>   r   r   r   r?   r   r>   r=   r   rp   ru   rv   rw   rx   )r?   r   r>   r=   r   r   r~   r(   r)   r*   r+   r}   	r?   r   r>   r=   r~   r(   r)   r*   r+   zLPrometheus Error: set_llm_deployment_failure_metrics. Exception occured - {}r   )r   r   r   set_deployment_partial_outagerF   r   rd   r   r   r   r   r   r   rG   rY   r_   rR   ra   rZ   r[   r\   r]   EXCEPTION_CLASSr^   rH   rc   r   )re   r   r   _litellm_paramsr?   r<   r>   r   r   llm_providerr   tagri   s                rj   r   z3PrometheusLogger.set_llm_deployment_failure_metrics]  s    Y	  !KL?M?Q?Q)2@$ -001A2FL"O!/!3!3GT!B266}dKK/33JEH/33JEH#1#5#5k4#HI*../DdKL ..#5!!)	 /  55<<#5!!)!$WYt%L!M ) 3 3 < < +7
C'  7zB( .j9:PQ3J?- = $ ce (3
($9 1@  CKDDDKK 0@@FF044::C0FFLLN`099??099??0==CC\0@@FF	H[H[HdHd0AAGG '	=$ GJ ce  2299#5!!) +7
C'  7zB( .j9:PQ3J?- :   ce 	  ^eeF 	s   KK 	L-K??Lr   c                    	 t        j                  d       |j                  d      }|y |d   }|d   }|j                  d      }	|j                  di       xs i }
|
j                  di       }|j                  dd       }|
j                  d	d       }|j                  d
      xs i }|j                  dd       }d }d }|d   d   x}r$|j                  dd       }|j                  dd       }|d   j                  d      x}r>| j                  j	                  |||||d   d   |d   d         j                  |dz         |r<	 | j                  j	                  |||||d   d   |d   d         j                  |       |r;| j                  j	                  |||||d   d   |d   d         j                  |       	 | j                  ||||       | j                  j	                  ||||||d   d   |d   d   |d   d   |d   d   	      j                          | j                  j	                  ||||||d   d   |d   d   |d   d   |d   d   	      j                          ||z
  }d }|j                  dd       |d   du r|j                  d|      |z
  }|xs |}|j                         }d }|X|dkD  rR||z  }t        t        j!                  d      |      } | j"                  j                  d i |j                  |       y y y # t$        $ r7}t        j&                  dj)                  t+        |                   Y d }~y d }~ww xY w)!Nr   rm   r<   r>   response_headersro   rp   r'   r   
model_infoidhidden_paramsadditional_headersx_ratelimit_remaining_requestsx_ratelimit_remaining_tokenslitellm_overhead_time_msru   rv   i  r   rw   rx   r   r   Tr   r   rI   r   r   zLPrometheus Error: set_llm_deployment_success_metrics. Exception occured - {}r   )r   r   r   rA   r   r   rW   r   rX   set_deployment_healthyrE   r   rH   r   r   rS   rT   rI   rc   errorr   rd   )re   r   r   r   r   r   r   r<   r>   _response_headersr   r   r?   r   _model_infor   r   r   r   r   response_ms!time_to_first_token_response_time_latency_latency_secondslatency_per_tokenr   ri   s                              rj   r   z3PrometheusLogger.set_llm_deployment_success_metrics  sp   ^	  !KL""#<= % (/2=AK/
;H . 2 23E F,001A2FL"O'++J;I!/!3!3GT!B*../DdKL#--5;K"tT2H04.2%=o%N$& !  &8%;%;4d&" $6#9#92D$  ,D,c,-.' . 44;; &,Z89LM,Z89MN ',t3 " 66== &,Z89LM,Z89MN #()44;; &,Z89LM,Z89MN #&' ''#5!!)	 (  55<<#5!!) +7
C'  7zB( .j9:PQ3J?- =   ce2299#5!!) +7
C'  7zB( .j9:PQ3J?- :   ce &.
%:KEI- ""8T2>"8,4 #&&'>IJV 2 #D"R{H'557 !%(]Q->$4}$D!2*@*K*K#P +L + !,	 H@@GG '+, .?(  	  ^eeF
 	s   (L KL 	M-MMoriginal_model_groupc                 @  K   ddl m}m} t        j                  d||       |j                  di       }|j                  |      }|j                  d      }t        t        t           |j                  d      xs g       }	t        |||d   |d	   |d
   |d   t        t        |dd            t        |j                  j                        |		      }
t        t        j!                  d      |
      } | j"                  j$                  di |j'                          yw)zF

        Logs a successful LLM fallback event on prometheus

        r   StandardLoggingMetadataStandardLoggingPayloadSetupzLPrometheus: log_success_fallback_event, original_model_group: %s, kwargs: %srp   r   r'   r   ru   rv   rw   rx   r   N	r~   fallback_modelr(   r)   r*   r+   r   r   r   rJ   r   r   r   )*litellm.litellm_core_utils.litellm_loggingr  r  r   r   r   get_standard_logging_metadatar	   r   rd   r   r   r   r   r   rS   rT   rJ   r   r   )re   r	  rf   r   r  r  r   standard_metadata
_new_modelr   r   r   s               rj   log_success_fallback_eventz+PrometheusLogger.log_success_fallback_eventl  s*    	

 	Z 	

 JJz2.	'EE" F  	
 ZZ(
T#Y

6 2 8b9+0%,-@A+,@A"#9:()BC );]D!QR 2 < < E EF

 +"8"C"CD #D # $	
 	<44;;FgFJJL   DDc                 @  K   ddl m}m} t        j                  d||       |j                  d      }|j                  di       }t        t        t           |j                  d      xs g       }|j                  |      }	t        |||	d   |	d	   |	d
   |	d   t        t        |dd            t        |j                  j                        |	      }
t        t        j!                  d      |
      } | j"                  j$                  di |j'                          yw)z@
        Logs a failed LLM fallback event on prometheus
        r   r  zLPrometheus: log_failure_fallback_event, original_model_group: %s, kwargs: %sr'   rp   r   r   ru   rv   rw   rx   r   Nr  rK   r   r   r   )r  r  r  r   r   r   r	   r   rd   r  r   r   r   r   r   rS   rT   rK   r   r   )re   r	  rf   r   r  r  r  r   r   r  r   r   s               rj   log_failure_fallback_eventz+PrometheusLogger.log_failure_fallback_event  s*    	

 	Z 	

 ZZ(
JJz2.	T#Y

6 2 8b9'EE" F  	 ,0%,-@A+,@A"#9:()BC );]D!QR 2 < < E EF

 +"8"C"C@ #D # $	
 	80077B'BFFHr  stater?   r   r>   r=   c                 ^    | j                   j                  ||||      j                  |       y N)rC   r   r   )re   r  r?   r   r>   r=   s         rj   set_litellm_deployment_statez-PrometheusLogger.set_litellm_deployment_state  s*     	%%,,(L	

#e*r   c                 .    | j                  d||||       y )Nr   r  re   r?   r   r>   r=   s        rj   r   z'PrometheusLogger.set_deployment_healthy       	))!8X|	
r   c                 .    | j                  d||||       y )N   r  r  s        rj   r   z.PrometheusLogger.set_deployment_partial_outage  r  r   c                 .    | j                  d||||       y )N   r  r  s        rj   set_deployment_complete_outagez/PrometheusLogger.set_deployment_complete_outage  r  r   r   c                 ^    | j                   j                  |||||      j                          y)zn
        increment metric when litellm.Router / load balancing logic places a deployment in cool down
        N)rD   r   r   )re   r?   r   r>   r=   r   s         rj    increment_deployment_cooled_downz1PrometheusLogger.increment_deployment_cooled_down  s+     	++22(LBR	

#%r   providerr   budget_limitc                 z    | j                   j                  |      j                  | j                  ||             y)z?
        Track provider remaining budget in Prometheus
        r   N)rB   r   r   r   )re   r'  r   r(  s       rj   track_provider_remaining_budgetz0PrometheusLogger.track_provider_remaining_budget  s<     	55<<XFJJ++' , 	
r   r   returnc                 .    |t        d      S ||S ||z
  S )Ninf)float)re   r   r   s      rj   r   z+PrometheusLogger._safe_get_remaining_budget  s*     <=E!!r   c                     	 t        j                         r$t        j                  | j                                yy# t        $ r+}t        j                  dt        |              Y d}~yd}~ww xY w)z
        Initialize prometheus startup metrics

        Helper to create tasks for initializing metrics that are required on startup - eg. remaining budget metrics
        z@No running event loop - skipping budget metrics initialization: N)asyncioget_running_loopcreate_task$_initialize_remaining_budget_metricsRuntimeErrorr   r   rd   )re   ri   s     rj   rb   z7PrometheusLogger._initialize_prometheus_startup_metrics  sd    	'')##D$M$M$OP * 	$$RSVWXSYRZ[ 	s   7; 	A/!A**A/c                   K   ddl m} ddlm} |y	 d}d} ||||       d{   \  }}||z   dz
  |z  }| j	                  |       d{    t        d|dz         D ]1  } ||||       d{   \  }}| j	                  |       d{    3 y7 o7 J7 '7 # t        $ r+}	t        j                  d	t        |	              Y d}	~	yd}	~	ww xY ww)
z
        Initialize remaining budget metrics for all teams to avoid metric discrepancies.

        Runs when prometheus logger starts up.
        r   )get_paginated_teams)prisma_clientNr!  2   )r7  	page_sizepager#  z(Error initializing team budget metrics: )
1litellm.proxy.management_endpoints.team_endpointsr6  rO   r7  _set_team_budget_metricsrangerc   r   r   rd   )
re   r6  r7  r:  r9  teamstotal_counttotal_pages_ri   s
             rj   r3  z5PrometheusLogger._initialize_remaining_budget_metrics)  s    	
 	= 	DI':+yt( "E;
 '2Q69DK //666 aq1 ;!4"/94" q 33E:::	;" 7 ; 	$$:3q6(C 	st   CB B&B B$B 1B2B BB CB B B B 	C&!CCCCr>  c                   K   |D ]w  }|j                   | j                  j                  |j                  |j                  xs d      j                  | j                  |j                   |j                               y yw)z9Helper function to set budget metrics for a list of teamsNrn   r   )r   r4   r   r5   r+   r   r   r   )re   r>  r*   s      rj   r<  z)PrometheusLogger._set_team_budget_metricsP  ss      
	D*99@@LLOO)r #33#'??"jj 4 
	s   B A+B N)g      ?)&r   
__module____qualname__rk   r   r   r   rd   r   r   r   r   r.  r   r   r   r   rc   r   r   r   r   r   r  r  intr  r   r   r$  r&  r*  r   rb   r3  r   r   r<  r   r   rj   r   r      s   AF
\M|/
"8/
 c]/
 sm	/

 %SM/
 }/
  }/
 &c]/
 #/
 +/
b.'}.' &c].' sm	.'
 %SM.' .'`c] sm %SM	
 }  } &c] #  +<  sm   %SM   	  
   D== }= sm	=
 %SM=  }= &c]= +=~)V77 &7 *	7r-;>e eZ  #ff
 +f fP,M$',M15,MKT,M\+I$'+I15+IKT+IZ

  
 3-	

 3-
 
	
	
 	
 		

 	
	
	
 3-	
 3-		

 	
	
	
 3-	
 3-		

 	
  	
  

$)
9>
	""5/	"2:5/	"		"%ND9J4K r   r   r   r   r   r+  c                    |j                         }|j                         D ci c]  \  }}|| v r|| }}}t        j                  j                  |v rt        d|j                  id      |d<   |j                  ,|j                  j                         D ]  \  }}|| v s|||<    | D ]  }||vsd||<    |S c c}}w )z
    Returns a dictionary of label + values for prometheus.

    Ensures end_user param is not sent to prometheus if it is not supported.
    user_api_key_end_user_idrq   )ro   rs   r-   N)
model_dumpitemsrY   END_USERrR   r   r-   r   )r   r   r   	enum_dictlabelrR   filtered_labelskeys           rj   r   r   _  s     &&(I
 &OO-E5)) 	uO  $$**o=&G68L8LM%'

#
 ))5%<<BBD 	-JC++',$	- ' *'%)OE"* +s   B;rp   c                 ^   t         j                  }|t        |      dk(  ri S i }|D ]  }|}|j                  d      r|j	                  ddd      n|}|j                  d      }| }|D ]  }|j                  |d      }| n |^t        |t              so|||j	                  dd      <    |S )z)
    Get custom labels from metadata
    Nr   z	metadata.rn   r!  .rA  )	litellm!custom_prometheus_metadata_labelslenr   replacesplitr   r   rd   )rp   keysresultrN  original_key
keys_partsrR   parts           rj   r   r     s     44D|s4yA~	F ;141Lckk+r1-RUYYs^
 	DIIdD)E}	
 E3!75:F<''S12;  Mr   r  )r0  r   r   r   typingr   r   r   r   r	   rQ  litellm._loggingr
   r   "litellm.integrations.custom_loggerr   litellm.proxy._typesr   %litellm.types.integrations.prometheusr   r   litellm.utilsr   r   r   rd   r   r   r   Dictr   r   r   rj   <module>rb     s     
 ( ; ;  : ; / 3 6 ;6E| EV* #9#&# 
## 
	#Ld tCH~ r   