Ë
    tPêjÆ(  ã                   óÎ   — 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 d dlmZ d dl	m
Z
 d dlmZ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)ÚFinal)Úverbose_logger)ÚCustomBatchLogger)Úget_datadog_envÚget_datadog_hostnameÚget_datadog_pod_nameÚget_datadog_serviceÚnormalize_datadog_tag_value)Ú
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z  dz  dee   fd„Z		 ddede
deez  fd	„Zd
„ Zd„ Zd„ Zdefd„Zdefd„Zdededz  dedz  de
dz  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      €úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/datadog/datadog_metrics.pyr,   zDatadogMetricsLogger.__init__    sà   ø€ ÜŸ)™) LÓ1ˆŒÜŸ)™) LÓ1ˆŒÜ—y‘y ¨OÓ<ˆŒà�ŠÜ×"Ñ"Ð#hÔià(¨¯©¨°nÐEˆŒä2Ô@T×@dÑ@dÔeˆÔô "Ÿ,™,›.ˆŒð ˜vÑ%Ø#'§?¡?ˆF�<Ñ ð  6Ñ)Ø'(ˆFÐ#Ñ$ä‰ÑÑ"˜6Ò"ñ  Ü×Ñ × 3Ñ 3Ó 5Õ6ð  ó    NÚ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t        |«      › �«       |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Úappendr   )	r/   r4   r5   ÚtagsÚproviderr;   r<   r=   Úteam_tags	            r2   Ú_extract_tagsz"DatadogMetricsLogger._extract_tags=   sp  € ð ”?Ó$Ð%Ð&ØÔ*Ó,Ð-Ð.Ø”r—y‘y ¨yÓ9Ð:Ð;ØÔ,Ó.Ð/Ð0ØÔ,Ó.Ð/Ð0ð
ˆð —w‘wÐ4Ó5Ð5ˆ8Ð5Ø�K‰K˜) H :Ð.Ô/à—G‘G˜GÓ$Ð$ˆ5Ð$Ø�K‰K˜+ e WÐ-Ô.àŸ'™' -Ó0Ð0ˆ;Ð0Ø�K‰K˜, { mÐ4Ô5àÐ"Ø�K‰K˜, { mÐ4Ô5ð Ÿ'™' *¨bÓ1Ò7°Rˆà�L‰LÐ2Ó3ò 'Ø�|‰|˜LÓ)ò'à�|‰|Ð2Ó3ò'ð �|‰|˜IÓ&ð	 	ñ Ø�K‰K˜%Ô ;¸HÓ EÐFÐGÔHàˆr3   r0   c                 ó
  — | 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                  |«       |j                  d
i «      xs i }|j                  d«      }|�:| j                  |«      }dd||dz  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
        )r5   Úend_timeÚ
start_timezlitellm.request.total_latencyé   ©Ú	timestampÚvalue©ÚmetricÚtypeÚpointsrD   Úapi_call_start_timezlitellm.llm_api.latencyÚhidden_paramsÚlitellm_overhead_time_msNzlitellm.overhead.latencyiè  zlitellm.llm_api.request_counté   ç      ð?)rP   rQ   rR   rD   Úinterval)
rG   rB   r   ÚnowÚintrM   Útotal_secondsÚ	log_queuerC   r   )r/   r4   r0   r5   rD   Úend_time_dtrM   Ústart_time_dtÚtotal_durationÚseries_total_latencyrS   Úllm_api_durationÚseries_llm_latencyrT   rU   Úoverhead_tagsÚseries_overheadÚseries_counts                     r2   Ú_add_metrics_from_logz*DatadogMetricsLogger._add_metrics_from_logi   sµ  € ð ×(Ñ(¨¸+Ð(ÓFˆð $ŸZ™Z¨
Ó3ÒE´x·|±|³~ˆÜ˜{×4Ñ4Ó6Ó7ˆ	ð  &Ÿz™z¨,Ó7ˆÙ™[Ø%0°=Ñ%@×$OÑ$OÓ$QˆNà9ØØ)2¸^ÑLÐMØñ	@Ð ð �N‰N×!Ñ!Ð"6Ô7ð &,§Z¡ZÐ0EÓ%FÐÙ¡;Ø'2Ð5HÑ'H×&WÑ&WÓ&YÐà3ØØ)2Ð=MÑNÐOØñ	>Ðð �N‰N×!Ñ!Ð"4Ô5ð  #Ÿw™w ¸Ó;ÒA¸rˆØ*7×*;Ñ*;Ð<VÓ*WÐ Ø#Ð/Ø#'×#5Ñ#5°cÓ#:ˆMà4Øð &/Ø!9¸DÑ!@ñðð &ñ
;ˆOð �N‰N×!Ñ! /Ô2ð 6ØØ%.¸Ñ=Ð>ØØ×+Ñ+ñ4
ˆð 	�‰×Ñ˜lÕ+r3   c              ƒ   ó2  K  — 	 |j                  dd «      }|€y | j                  ||d¬«       t        | j                  «      | j                  k\  r| j                  «       ƒ d {  –—†  y y 7 Œ# t        $ r }t        j                  d|«       Y d }~y d }~ww xY w­w)NÚstandard_logging_objectÚ200©r4   r0   r5   z5Datadog Metrics: Error in async_log_success_event: %s)	rB   rf   Úlenr\   Ú
batch_sizeÚflush_queueÚ	Exceptionr   Ú	exception)r/   r0   Úresponse_objrJ   rI   rh   Úes          r2   Úasync_log_success_eventz,DatadogMetricsLogger.async_log_success_event¬   s”   è ø€ ð	aØLRÏJÉJÐWpÐrvÓLwÐ#à&Ð.Øà×&Ñ&Ð+BÈ6Ð_dÐ&Ôeä�4—>‘>Ó" d§o¡oÒ5Ø×&Ñ&Ó(×(Ñ(ð 6Ø(ùäò 	aÜ×$Ñ$Ð%\Ð^_×`Ñ`ûð	aü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|	«       Y d }	~	y d }	~	ww xY w­w)Nrh   Ú500Úerror_informationÚ
error_coderj   z5Datadog Metrics: Error in async_log_failure_event: %s)
rB   Ústrrf   rk   r\   rl   rm   rn   r   ro   )
r/   r0   rp   rJ   rI   rh   r5   ru   rv   rq   s
             r2   Úasync_log_failure_eventz,DatadogMetricsLogger.async_log_failure_event»   sÕ   è ø€ ð	aØLRÏJÉJÐWpÐrvÓLwÐ#à&Ð.Øð  ˆKØ'>×'BÑ'BÐCVÐXZÓ'[Ò'aÐ_aÐØ 1× 5Ñ 5°lÓ CˆJØÐ%Ü! *›o�à×&Ñ&Ð+BÈ6Ð_jÐ&Ôkä�4—>‘>Ó" d§o¡oÒ5Ø×&Ñ&Ó(×(Ñ(ð 6Ø(ùäò 	aÜ×$Ñ$Ð%\Ð^_×`Ñ`ûð	aü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|«       ‚ d }~ww xY w­w)NÚseriesz.Datadog Metrics: Error in async_send_batch: %s)r\   ÚcopyÚ_upload_to_datadogrn   r   ro   )r/   ÚbatchÚpayload_datarq   s       r2   Úasync_send_batchz%DatadogMetricsLogger.async_send_batchÑ   si   è ø€ Ø�~Š~Øà—~‘~×*Ñ*Ó,ˆØ6>ÀÐ5Fˆð	Ø×)Ñ)¨,Ó7×7Ò7ùÜò 	Ü×$Ñ$Ð%UÐWXÔYØûð	üs:   ‚,A3¯A ÁA	ÁA ÁA3Á	A Á	A0ÁA+Á+A0Á0A3Ú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	   «      |j                  «       y 7 ŒB­w)
Nzapplication/json)zContent-Typez
DD-API-KEYzDD-APPLICATION-KEYzutf-8ÚgzipzContent-Encoding)ÚcontentÚheadersz6Datadog Metrics: Uploaded %s metric points. Status: %srz   )r"   r#   r   r‚   ÚcompressÚencoder(   Úpostr&   Úraise_for_statusr   Údebugrk   r5   )r/   r€   r„   Ú	json_dataÚcompressed_dataÚresponses         r2   r|   z'DatadogMetricsLogger._upload_to_datadogÞ   sÐ   è ø€ Ø�ŠØð /ØŸ/™/ñ
ˆð
 �?Š?Ø,0¯O©OˆGÐ(Ñ)ä% gÓ.ˆ	Ü!%§¡¨y×/?Ñ/?ÀÓ/HÓ!IˆØ&,ˆÐ"Ñ#à $× 1Ñ 1× 6Ñ 6Ø�O‰OØ#Øð !7ó !
÷ 
ˆð 	×!Ñ!Ô#ä×ÑØDÄcÈ'ÐRZÑJ[ÓF\Ð^f×^rÑ^rõ	
ð
ú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
        rW   rL   zlitellm.health_checkrK   zenv:health_checkrO   rz   NÚhealthy)ÚstatusÚerror_messageÚ	unhealthy)rZ   Útimer|   r   rn   rw   )r/   Útest_metric_pointÚtest_metric_seriesr~   rq   s        r2   Úasync_health_checkz'DatadogMetricsLogger.async_health_checkú   s§   è ø€ ð	ô !¤§¡£Ó-Øñ<Ðð
 1ØØ,Ð-Ø+Ð,ñ	>Ðð ;CÐEWÐDXÐ9YˆLà×)Ñ)¨,Ó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   )r/   r–   r—   r˜   s       r2   Úget_request_response_payloadz1DatadogMetricsLogger.get_request_response_payload  s   è ø€ ð 	ùs   ‚)Trš   )ri   )Ú__name__Ú
__module__Ú__qualname__Úboolr,   r   rw   rZ   ÚlistrG   Údictrf   rr   rx   r   r   r|   r   r•   r   r›   Ú__classcell__)r1   s   @r2   r   r      sÕ   ø„ ñ7¨Tõ 7ð@ )-ñ*à#ð*ð ˜3‘Y Ñ%ð*ð 
ˆc‰ó	*ð` "'ñ	A,à#ðA,ð ðA,ð ˜3‘Yó	A,òFaòaò,ð
Ð0Eó 
ð8Ð*Fó ð>àðð ! 4™ðð  ‘oð	ð
 
�‰÷r3   r   )r)   r‚   r    r’   r   Útypingr   Úlitellm._loggingr   Ú(litellm.integrations.custom_batch_loggerr   Ú,litellm.integrations.datadog.datadog_handlerr   r   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   r3   r2   ú<module>r¬      sV   ðÛ Û Û 	Û Ý Ý å +Ý F÷õ õ B÷õ V÷ñ õ
 7ô@Ð,õ @r3   