
    g              	           d dl Z d dlmZmZ d dl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  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)ListOptionalcast)print_verboseverbose_logger)CustomLogger)UserAPIKeyAuth)*StandardLoggingPayload)!get_end_user_id_for_cost_trackingc                      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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	 d6d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 y5)7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,g d-      | _         |d.d/g d-      | _         |d0d1g d2      | _         |d3d4g d2      | _         |d5d6d7g      | _        t>        j@                  j                  t>        jB                  j                  t>        jD                  j                  t>        jF                  j                  g}g d8} |d9d:|      | _$         |d;d<|tJ        gz         | _&         |d=d>tN        g|z   |z         | _(         |d?d@tN        g|z   tR        z   |z         | _*         |dAdBt>        jN                  j                  t>        jV                  j                  g|z   tR        z         | _,         |dCdDtN        g|z   |z         | _-        g d8} |dEdFt        j                  dE            | _.         |dGdHt        j                  dG            | _/         |dIdJt        j                  dI            | _0         |dKdLg d      | _1         |dMdNt        j                  dM            | _2        y # tf        $ r}	ti        dOtk        |	              |	d }	~	ww xY w)PNr   )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_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_provider_remaining_budget_metriczHRemaining budget for provider - used when you set provider budget limitsr8   )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 )6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_metricr.   r0   r1   r3   r4   r5   !litellm_remaining_requests_metriclitellm_remaining_tokens_metricr<   UserAPIKeyLabelNamesv2_LITELLM_MODEL_NAMEMODEL_IDAPI_BASEAPI_PROVIDERr=   EXCEPTION_STATUSr>   REQUESTED_MODELr?   EXCEPTION_LABELSr@   TAGrA   rB   rC   rD   rE   rF   rG   	Exceptionr   str)
selfkwargsr   r   r   r   r   _logged_llm_labelsteam_and_key_labelses
             T/var/www/openai/venv/lib/python3.12/site-packages/litellm/integrations/prometheus.py__init__zPrometheusLogger.__init__   s   `	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 AF>^GAD= ?D<\G?D; 6;,i6D2 49*L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(  	DSVHMNG	s   A(O +M2O 	P'P  P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_modelr7   r'   r(   r+   status_code200r:   tagsmodel_idr9   r8   custom_llm_providerexception_statusexception_classcustom_metadata_labelsri   zsk-)
hash_token)	end_user_iduser_api_keyro   r$   user_api_teamuser_api_team_aliasuser_idrt   enum_values)	standard_logging_payloadr   r   ro   r$   r   r   r   r   )r   r   r   ro   rh   )r   ro   r_   ri   )r_   r$   r   ro   r   r   r   r   streamTr   r   supported_enum_labelsr    )litellm.types.utilsr   r	   debugget
isinstancedict
ValueErrorr   r   UserAPIKeyLabelValuesget_custom_labels_from_metadatar]   
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_factoryrM   rN   r   labelsinc)r^   r_   response_obj
start_timeend_timer   r   r$   rh   	_metadatar   r   r   ro   r   r   output_tokenstokens_usedrt   _requester_metadata_tagsr   r   _labelss                           rc   async_log_success_eventz(PrometheusLogger.async_log_success_event9  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   ro   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 )
Nrs   rv   r.   r   r   prompt_tokensr0   rr   r   )
rP   r   r   r   r   r   rM   rN   r.   r0   )r^   r   r   r   ro   r$   r   r   r   r   r   r   s               rc   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	
    rh   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	                  |       y )Nri   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_budgetr1   r   setr3   )r^   r   r   r   ro   rh   _team_spend_team_max_budget_remaining_team_budget_api_key_spend_api_key_max_budget_remaining_api_key_budgets               rc   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.	

#$
%44;;,	

#'
(r   rt   c
           	          t        t        j                  d      |	      }
 | j                  j                  di |
j                          | j                  j	                  |||||||      j                  |       y )NrG   r   r   r   )r   rM   rN   rG   r   r   r)   )r^   r   r   ro   r$   r   r   r   rt   r   r   s              rc   r   z?PrometheusLogger._increment_top_level_request_and_spend_metrics-  s     +"8"C"C4 #D # $	
 	,$$++6g6::<!!((	
 #m
r   r_   ri   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maxsizer4   r   r   r5   )r^   r   ro   r_   ri   r   r7    remaining_requests_variable_nameremaining_tokens_variable_nameremaining_requestsremaining_tokenss              rc   r   z4PrometheusLogger._set_virtual_key_rate_limit_metricsK  s    	
 :&A-k]; 	) ,I)V& LL93;;GV3;; 	 LL7ET 	 	99@@,k	

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

#
r   c	                    |d   }	|j                  d      xs t        j                         }
|j                  d      }|j                  dd       }|j                  dd       }|et        |t              rU|	j                  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 )Nmodel_parametersr   r   api_call_start_timecompletion_start_timer   TzUTime 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   rM   rN   r"   r    )r^   r_   r$   r   ro   r   r   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                       rc   r   z%PrometheusLogger._set_latency_metricsm  s    "::L!M#ZZ
3Ex||~)/L)A
$jj)>E &

+BD I "-0(; $$X. &(;;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$   rg   rf   rh   rj   rk   ri   rm   rn   ro   rp   rq   	exception0prometheus Layer Error(): Exception occured - {})r   r   r	   r   r   r   rF   r   r   "set_llm_deployment_failure_metricsr\   r   formatr]   )r^   r_   r   r   r   r   r$   r   rh   r   r   r   ro   r   r   rb   s                   rc   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,
        rz   r$   rg   rx   N)r*   r+   r%   r&   r'   r(   rw   rx   r}   r~   rz   r   r   r   r   r   r   )r   r   r]   r   r   r   r   api_key	key_aliasr2   r(   getattr	__class____name__r   rM   rN   r   r   r   r   r\   r	   r   r   )r^   r   r   r   r   r   r   rb   s           rc   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$   rg   ry   )r*   r%   r&   rw   r'   r(   r+   rx   r   r   r   r   Nr   )r   r   r   r   r   r2   r(   r   r   rM   rN   r   r   r   r\   r	   r   r   r]   )r^   r   r   responser   r   rb   s          rc   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 metricrf   rh   r$   Nr7   r9   r{   r   r|   r:   r{   r9   r8   rx   ri   rn   ro   rp   rq   )r:   r{   r9   r8   r}   r~   rw   r%   r&   r'   r(   rv   	r:   r{   r9   r8   rw   r%   r&   r'   r(   zLPrometheus Error: set_llm_deployment_failure_metrics. Exception occured - {}r   )r	   r   r   set_deployment_partial_outager@   r   r]   r   r   r   r   r   r   rA   rS   rY   rL   r[   rT   rU   rV   rW   EXCEPTION_CLASSrX   rB   r\   r   )r^   r   r   _litellm_paramsr:   r7   r9   r{   r   llm_providerr   tagrb   s                rc   r   z3PrometheusLogger.set_llm_deployment_failure_metrics4  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       }|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   rf   r7   r9   response_headersrh   ri   r$   r|   
model_infoidhidden_paramsadditional_headersx_ratelimit_remaining_requestsx_ratelimit_remaining_tokensrn   ro   r   rp   rq   r   r   Tr   r   rC   r   r   zLPrometheus Error: set_llm_deployment_success_metrics. Exception occured - {}r   )r	   r   r   rQ   r   r   rR   set_deployment_healthyr?   r   rB   r   r   rM   rN   rC   r   r\   errorr   r]   )r^   r   r   r   r   r   r   r7   r9   _response_headersr   r   r:   r   _model_infor{   r   r   r   response_ms!time_to_first_token_response_time_latency_latency_secondslatency_per_tokenr   rb   s                             rc   r   z3PrometheusLogger.set_llm_deployment_success_metrics  s   P	  !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$  " 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   (J8 J
J8 8	K8-K33K8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: %sri   r   r$   rz   rn   ro   rp   rq   rx   N	rw   fallback_modelr%   r&   r'   r(   r}   r~   rz   rD   r   r   r   )*litellm.litellm_core_utils.litellm_loggingr  r  r	   r   r   get_standard_logging_metadatar   r   r]   r   r   r   r   r   rM   rN   rD   r   r   )r^   r  r_   r   r  r  r   standard_metadata
_new_modelr   r   r   s               rc   log_success_fallback_eventz+PrometheusLogger.log_success_fallback_event5  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$   ri   rz   r   rn   ro   rp   rq   rx   Nr  rE   r   r   r   )r	  r  r  r	   r   r   r   r   r]   r
  r   r   r   r   r   rM   rN   rE   r   r   )r^   r  r_   r   r  r  r  r   r   r  r   r   s               rc   log_failure_fallback_eventz+PrometheusLogger.log_failure_fallback_eventc  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{   r9   r8   c                 ^    | j                   j                  ||||      j                  |       y N)r=   r   r   )r^   r  r:   r{   r9   r8   s         rc   set_litellm_deployment_statez-PrometheusLogger.set_litellm_deployment_state  s*     	%%,,(L	

#e*r   c                 .    | j                  d||||       y )Nr   r  r^   r:   r{   r9   r8   s        rc   r   z'PrometheusLogger.set_deployment_healthy       	))!8X|	
r   c                 .    | j                  d||||       y )N   r  r  s        rc   r   z.PrometheusLogger.set_deployment_partial_outage  r  r   c                 .    | j                  d||||       y )N   r  r  s        rc   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)r>   r   r   )r^   r:   r{   r9   r8   r}   s         rc    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)r<   r   r   r   )r^   r   r   r!  s       rc   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)r^   r   r   s      rc   r   z+PrometheusLogger._safe_get_remaining_budget  s*     <=E!!r   N)g      ?)!r   
__module____qualname__rd   r   r   r   r]   r   r   r   r   r'  r   r   r   r   r\   r   r   r   r   r   r  r  intr  r   r   r  r  r#  r   r   r   rc   r   r      s   dL	]M~/
"8/
 c]/
 sm	/

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

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

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

 	
  	
  

$)
9>
	""5/	"2:5/	"		"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_idrj   )rh   rl   r*   N)
model_dumpitemsrS   END_USERrL   r   r*   r   )r   r   r   	enum_dictlabelrL   filtered_labelskeys           rc   r   r     s     &&(I
 &OO--LE5)) 	u-   $$**o=&G68L8LM%'

#
 ))5%<<BBDJC++',$ E ''%)OE" ' +s   B;ri   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.rg   r  ._)	litellm!custom_prometheus_metadata_labelslenr   replacesplitr   r   r]   )ri   keysresultr3  original_key
keys_partsrL   parts           rc   r   r     s     44D|s4yA~	F141Lckk+r1-RUYYs^
DIIdD)E} 
 E3!75:F<''S12   Mr   r  )r   r   r   typingr   r   r   r7  litellm._loggingr   r	   "litellm.integrations.custom_loggerr
   litellm.proxy._typesr   %litellm.types.integrations.prometheusr   r   litellm.utilsr   r   r]   r   r   r   Dictr   r   r   rc   <module>rH     s     ( ' '  : ; / 3 6 ;Q"| Q"n& #9#&# 
## 
	#Ld tCH~ r   