
    i&                         d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZmZ d dlmZ  G d de      Zy)    N)datetime)ListOptionalUnion)verbose_logger)CustomBatchLogger)get_datadog_envget_datadog_hostnameget_datadog_pod_nameget_datadog_service)
safe_dumps)get_async_httpx_clienthttpxSpecialProvider)IntegrationHealthCheckStatus)DatadogMetricPointDatadogMetricSeriesDatadogMetricsPayload)StandardLoggingPayloadc            	            e Zd Zddef fdZ	 ddedeeee	f      de
e   fdZ	 ddededeee	f   fdZd	 Zd
 Zd ZdefdZdefdZdedee   dee   dee   fdZ xZS )DatadogMetricsLoggerstart_periodic_flushc                 "   t        j                  d      | _        t        j                  d      | _        t        j                  dd      | _        | j                  st        j                  d       d| j                   d| _        t        t        j                        | _        t        j                         | _        d	|vr| j                  |d	<   d
|vrd|d
<   t        | @  di | |r$t        j"                  | j%                                y y )N
DD_API_KEY
DD_APP_KEYDD_SITEzdatadoghq.comzCDatadog Metrics: DD_API_KEY is required. Integration will not work.zhttps://api.z/api/v2/series)llm_provider
flush_lockflush_interval    )osgetenv
dd_api_key
dd_app_keydd_siter   warning
upload_urlr   r   LoggingCallbackasync_clientasyncioLockr   super__init__create_taskperiodic_flush)selfr   kwargs	__class__s      }/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/integrations/datadog/datadog_metrics.pyr-   zDatadogMetricsLogger.__init__   s    ))L1))L1yyO<""U )nE2-==

 ",,. v%#'??F<  6)'(F#$"6"   3 3 56      logstatus_codereturnc                    dt                dt                dt        j                  dd       dt	                dt                g}|j                  d      x}r|j                  d	|        |j                  d
      x}r|j                  d|        |j                  d      x}r|j                  d|        ||j                  d|        |j                  di       xs i }|j                  d      xs7 |j                  d      xs$ |j                  d      xs |j                  d      }|r|j                  d|        |S )zD
        Builds the list of tags for a Datadog metric point
        zenv:zservice:zversion:
DD_VERSIONunknownz	HOSTNAME:z	POD_NAME:custom_llm_providerz	provider:modelzmodel_name:model_groupzmodel_group:zstatus_code:metadatauser_api_key_team_alias
team_aliasuser_api_key_team_idteam_idzteam:)r	   r   r!   r"   r
   r   getappend)	r0   r5   r6   tagsproviderr<   r=   r>   team_tags	            r3   _extract_tagsz"DatadogMetricsLogger._extract_tags@   si    ?$%&*,-.ryyy9:;,./0,./0
 ww45585KK)H:./GGG$$5$KK+eW-.''-00;0KK,{m45"KK,{m45 77:r*0bLL23 '||L)'||23' ||I&	 	 KK%z*+r4   r1   c                 D   | j                  ||      }|j                  d      xs t        j                         }t	        |j                               }|j                  d      }|r;|r9||z
  j                         }dd||dg|d}	| j                  j                  |	       |j                  d      }
|
r;|r9||
z
  j                         }d	d||dg|d}| j                  j                  |       d
d|ddg|| j                  d}| j                  j                  |       y)zS
        Extracts latencies and appends Datadog metric series to the queue
        )r6   end_time
start_timezlitellm.request.total_latency   	timestampvaluemetrictypepointsrE   api_call_start_timezlitellm.llm_api.latencyzlitellm.llm_api.request_count         ?)rQ   rR   rS   rE   intervalN)
rH   rC   r   nowintrN   total_seconds	log_queuerD   r   )r0   r5   r1   r6   rE   end_time_dtrN   start_time_dttotal_durationseries_total_latencyrT   llm_api_durationseries_llm_latencyseries_counts                 r3   _add_metrics_from_logz*DatadogMetricsLogger._add_metrics_from_logl   s8    !!#;!? jj,>--/0	 

<0[)M9HHJN9)2^LM	9  NN!!"67 %jj)>?; +.A APPR3)2=MNO	7 NN!!"45 6%.=>++-
 	l+r4   c                 H  K   	 |j                  dd       }|y | j                  ||d       t        | j                        | j                  k\  r| j                          d {    y y 7 # t        $ r+}t        j                  dt        |              Y d }~y d }~ww xY ww)Nstandard_logging_object200r5   r1   r6   z3Datadog Metrics: Error in async_log_success_event: )
rC   rc   lenr[   
batch_sizeflush_queue	Exceptionr   	exceptionstr)r0   r1   response_objrK   rJ   re   es          r3   async_log_success_eventz,DatadogMetricsLogger.async_log_success_event   s     	HN

)4I# '.&&+F '  4>>"doo5&&((( 6( 	$$Ec!fXN 	sK   B"A+ B"A	A+ "A)#A+ 'B")A+ +	B4!BB"BB"c                   K   	 |j                  dd       }|y d}|j                  di       xs i }|j                  d      }|t        |      }| j                  |||       t        | j                        | j
                  k\  r| j                          d {    y y 7 # t        $ r+}	t        j                  dt        |	              Y d }	~	y d }	~	ww xY ww)Nre   500error_information
error_coderg   z3Datadog Metrics: Error in async_log_failure_event: )
rC   rm   rc   rh   r[   ri   rj   rk   r   rl   )
r0   r1   rn   rK   rJ   re   r6   rs   rt   ro   s
             r3   async_log_failure_eventz,DatadogMetricsLogger.async_log_failure_event   s     	HN

)4I# '.  K'++,?DJ  +..|<J%!*o&&+F '  4>>"doo5&&((( 6( 	$$Ec!fXN 	sK   CB! CA?B! BB! CB! !	C*!CCCCc                    K   | j                   sy | j                   j                         }d|i}	 | j                  |       d {    y 7 # t        $ r'}t	        j
                  dt        |               d }~ww xY ww)Nseriesz,Datadog Metrics: Error in async_send_batch: )r[   copy_upload_to_datadogrk   r   rl   rm   )r0   batchpayload_dataro   s       r3   async_send_batchz%DatadogMetricsLogger.async_send_batch   su     ~~##%/7.?	)),777 	$$>s1vhG 		s:   ,A>A A	A A>	A 	A;"A66A;;A>payloadc                   K   | j                   sy d| j                   d}| j                  r| j                  |d<   t        |      }t        j                  |j                  d            }d|d<   | j                  j                  | j                  ||       d {   }|j                          t        j                  dt        |d	          d
|j                          y 7 Fw)Nzapplication/json)zContent-Typez
DD-API-KEYzDD-APPLICATION-KEYzutf-8gzipzContent-Encoding)contentheaderszDatadog Metrics: Uploaded rw   z metric points. Status: )r#   r$   r   r   compressencoder)   postr'   raise_for_statusr   debugrh   r6   )r0   r}   r   	json_datacompressed_dataresponses         r3   ry   z'DatadogMetricsLogger._upload_to_datadog   s      ///

 ??,0OOG()w'	--	(8(8(AB&,"#**//OO_g 0 
 
 	!!#(WX->)?(@@XYaYmYmXno	

s   BC"C AC"c                   K   	 t        t        j                               dd}dd|gdgd}d|gi}| j                  |       d{    t        d	d
      S 7 # t        $ r }t        dt        |      
      cY d}~S d}~ww xY ww)z1
        Check if the service is healthy
        rV   rM   zlitellm.health_checkrL   zenv:health_checkrP   rw   Nhealthy)statuserror_message	unhealthy)rY   timery   r   rk   rm   )r0   test_metric_pointtest_metric_seriesr{   ro   s        r3   async_health_checkz'DatadogMetricsLogger.async_health_check   s     	 !-5
 1,-+,	7 4<>P=Q2RL)),777/ "  8  	/"!!f 	sG   BAA AA BA 	B#A>8B9B>BB
request_idstart_time_utcend_time_utcc                    K   y wNr    )r0   r   r   r   s       r3   get_request_response_payloadz1DatadogMetricsLogger.get_request_response_payload  s      	s   )Tr   )rf   )__name__
__module____qualname__boolr-   r   r   r   rm   rY   r   rH   dictrc   rp   ru   r|   r   ry   r   r   r   r   __classcell__)r2   s   @r3   r   r      s    7T 7H 26*#* eCHo.* 
c	*` (-	/,#/, /, 38_	/,b*<
0E 
4*F > !* x(	
 
$r4   r   ) r*   r   r!   r   r   typingr   r   r   litellm._loggingr   (litellm.integrations.custom_batch_loggerr   ,litellm.integrations.datadog.datadog_handlerr	   r
   r   r   *litellm.litellm_core_utils.safe_json_dumpsr   &litellm.llms.custom_httpx.http_handlerr   r   ,litellm.types.integrations.base_health_checkr   *litellm.types.integrations.datadog_metricsr   r   r   litellm.types.utilsr   r   r    r4   r3   <module>r      sY      	   ( ( + F  B V 
 7@, @r4   