Ë
    tPêj2)  ã                   óà   — U 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mZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ  eh d£«      Zee   ed<    G d„ de«      Zy)é    N)Údatetime)ÚAnyÚFinalÚcast)Ú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)ÚDatadogFOCUSCostEntry)ÚStandardLoggingPayload>
   ÚenvÚhostÚteamÚuserÚmodelÚserviceÚmodel_idÚpod_nameÚproviderÚmodel_groupÚ_RESERVED_TAG_KEYSc            	       óÞ   ‡ — e Zd Zddee   dz  fˆ fd„Zd„ Zd„ Zdee   dee	   fd„Z
d	edeeef   fd
„Zedeeef   dededdfd„«       Zedeeef   dededdfd„«       Zdee   fd„Zˆ xZS )ÚDatadogCostManagementLoggerNÚcost_tag_keysc                 óJ  •— |rt        |«      ng | _        t        j                  d«      | _        t        j                  d«      | _        t        j                  dd«      | _        | j                  r| j
                  st        j                  d«       d| j                  › d�| _	        t        t        j                  ¬«      | _        t        j                  «       | _        t        j"                  | j%                  «       «       d	|vr| j                   |d	<   t'        ‰| �P  d
i |¤Ž y )NÚ
DD_API_KEYÚ
DD_APP_KEYÚDD_SITEzdatadoghq.comz[Datadog Cost Management: DD_API_KEY and DD_APP_KEY are required. Integration will not work.zhttps://api.z/api/v2/cost/custom_costs)Úllm_providerÚ
flush_lock© )Úlistr    ÚosÚgetenvÚ
dd_api_keyÚ
dd_app_keyÚdd_siter   ÚwarningÚ
upload_urlr   r   ÚLoggingCallbackÚasync_clientÚasyncioÚLockr&   Úcreate_taskÚperiodic_flushÚsuperÚ__init__)Úselfr    ÚkwargsÚ	__class__s      €úy/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/datadog/datadog_cost_management.pyr7   z$DatadogCostManagementLogger.__init__0   sÞ   ø€ Ù?L¬¨]Ô(;ÐRTˆÔÜŸ)™) LÓ1ˆŒÜŸ)™) LÓ1ˆŒÜ—y‘y ¨OÓ<ˆŒà�Š d§o¢oÜ×"Ñ"Ømôð )¨¯©¨Ð6OÐPˆŒä2Ô@T×@dÑ@dÔeˆÔô "Ÿ,™,›.ˆŒÜ×Ñ˜D×/Ñ/Ó1Ô2ð ˜vÑ%Ø#'§?¡?ˆF�<Ñ ä‰ÑÑ"˜6Ó"ó    c              ƒ   ól  K  — 	 |j                  dd «      }|€y |j                  dd«      dkD  rW| j                  j                  |«       t        | j                  «      | j                  k\  r| j                  «       ƒ d {  –—†  y y y 7 Œ# t        $ r }t        j                  d|«       Y d }~y d }~ww xY w­w)NÚstandard_logging_objectÚresponse_costr   z=Datadog Cost Management: Error in async_log_success_event: %s)	ÚgetÚ	log_queueÚappendÚlenÚ
batch_sizeÚasync_send_batchÚ	Exceptionr   Ú	exception)r8   r9   Úresponse_objÚ
start_timeÚend_timer>   Úes          r;   Úasync_log_success_eventz3DatadogCostManagementLogger.async_log_success_eventI   s¯   è ø€ ð	iØLRÏJÉJÐWpÐrvÓLwÐ#à&Ð.Øð '×*Ñ*¨?¸AÓ>ÀÒBØ—‘×%Ñ%Ð&=Ô>ä�t—~‘~Ó&¨$¯/©/Ò9Ø×/Ñ/Ó1×1Ñ1ð :ð Cð 2ùäò 	iÜ×$Ñ$Ð%dÐfg×hÑhûð	iüsK   ‚B4„B ˜B4™A%B Á>BÁ?B ÂB4ÂB Â	B1ÂB,Â'B4Â,B1Â1B4c              ƒ   óp  K  — | j                   sy | j                   d d  }g | _         	 | j                  |«      }|s t        j                  dt	        |«      «       y | j                  |«      ƒ d {  –—†  y 7 Œ# t        $ r4}|| j                   z   | _         t        j                  d|«       Y d }~y d }~ww xY w­w)Nz]Datadog Cost Management: batch produced no aggregable entries; dropping %d log(s) from queue.z6Datadog Cost Management: Error in async_send_batch: %s)rA   Ú_aggregate_costsr   ÚdebugrC   Ú_upload_to_datadogrF   rG   )r8   Úbatch_to_sendÚaggregated_entriesrK   s       r;   rE   z,DatadogCostManagementLogger.async_send_batchZ   s¨   è ø€ Ø�~Š~Øà#Ÿ~™~©aÐ0ˆØˆŒð	bØ(,×(=Ñ(=¸mÓ(LÐÙ%Ü×$Ñ$ØsÜ˜Ó&ôð Ø×)Ñ)Ð*<Ó=×=Ò=ùÜò 	bØ*¨T¯^©^Ñ;ˆDŒNÜ×$Ñ$Ð%]Ð_`×aÑaûð	büsL   ‚$B6§2A6 ÁB6ÁA6 Á.A4Á/A6 Á3B6Á4A6 Á6	B3Á?*B.Â)B6Â.B3Â3B6ÚlogsÚreturnc           	      óŠ  — i }|D ]÷  }	 |j                  d«      xs d}|j                  d«      xs d}|j                  dd«      }|dk(  rŒF|j                  d«      xs t        j                  «       }t        j                  |«      }|j	                  d«      }	| j                  |«      }
|
r"t        t        |
j                  «       «      «      nd}|||	|f}||vr|d	|› �|	|	d
d|
r|
nddœ||<   ||   dxx   |z  cc<   Œù t        |j                  «       «      S # t        $ r!}t        j                  d|«       Y d}~�Œ8d}~ww xY w)zq
        Aggregates costs by Provider, Model, and Date.
        Returns a list of DatadogFOCUSCostEntry.
        Úcustom_llm_providerÚunknownr   r?   r   Ú	startTimez%Y-%m-%dr'   zLLM Usage for g        ÚUSDN)ÚProviderNameÚChargeDescriptionÚChargePeriodStartÚChargePeriodEndÚ
BilledCostÚBillingCurrencyÚTagsr^   z-Error processing log for cost aggregation: %s)r@   Útimer   ÚfromtimestampÚstrftimeÚ_extract_tagsÚtupleÚsortedÚitemsrF   r   r.   r(   Úvalues)r8   rS   Ú
aggregatorÚlogr   r   ÚcostÚtsÚdtÚdate_strÚtagsÚtags_keyÚkeyrK   s                 r;   rN   z,DatadogCostManagementLogger._aggregate_costsn   sZ  € ð
 moˆ
àò /	ˆCð.àŸ7™7Ð#8Ó9ÒF¸Y�ØŸ™ Ó(Ò5¨I�Ø—w‘w˜°Ó2�à˜1’9Øð
 —W‘W˜[Ó)Ò8¬T¯Y©Y«[�Ü×+Ñ+¨BÓ/�ØŸ;™; zÓ2�ð ×)Ñ)¨#Ó.�Ù:>œ5¤¨¯
©
«Ó!5Ô6ÀB�à ¨°(Ð;�à˜jÑ(à(0Ø/=¸e¸WÐ-EØ-5Ø+3Ø&)Ø+0Ù(,¡°$ñ'�J˜s‘Oð ˜3‘ Ó-°Ñ5Ô-ðW/	ôb �J×%Ñ%Ó'Ó(Ð(øô	 ò Ü×&Ñ&Ð'VÐXYÔZÝûðús   ‰ADÁB2DÄ	EÄ!D=Ä=Erj   c           	      ó\  — t        «       t        «       t        «       t        «       dœ}| j	                  |d|j                  d«      «       | j	                  |d|j                  d«      «       | j	                  |d|j                  d«      «       t        t        t        t        f   |j                  d«      xs i «      }|j                  d«      rt        |d   «      |d<   |j                  d	«      xs7 |j                  d
«      xs$ |j                  d«      xs |j                  d«      }|rt        |«      |d<   |j                  d«      rt        |d   «      |d<   | j                  �rCt        | j                  «      }|j                  d«      xs g D ]G  }t        |t        «      rd|vrŒ|j                  d«      \  }}}	||v sŒ2|	sŒ5| j                  |||	«       ŒI |j!                  «       D ]@  \  }}	||v sŒ|	€Œt        |	t        t"        f«      rŒ%| j                  ||t        |	«      «       ŒB dD ]w  }
|j                  |
«      }t        |t        «      sŒ%|j!                  «       D ]@  \  }}	||v sŒ|	€Œt        |	t        t"        f«      rŒ%| j                  ||t        |	«      «       ŒB Œy |S )N)r   r   r   r   r   rV   r   r   ÚmetadataÚuser_api_key_aliasr   Úuser_api_key_team_aliasÚ
team_aliasÚuser_api_key_team_idÚteam_idr   r   Úrequest_tagsú:)Úspend_logs_metadataÚrequester_metadata)r	   r   r
   r   Ú_add_tagr@   r   ÚdictÚstrr   r   r    ÚsetÚ
isinstanceÚ	partitionÚ_set_custom_tagrg   r(   )r8   rj   ro   rs   Úteam_tagÚallowÚrtÚkÚ_ÚvÚ
nested_keyÚnesteds               r;   rd   z)DatadogCostManagementLogger._extract_tags¨   ss  € ä"Ó$Ü*Ó,Ü(Ó*Ü,Ó.ñ	'
ˆð 	�‰�d˜J¨¯©Ð0EÓ(FÔGØ�‰�d˜G S§W¡W¨WÓ%5Ô6Ø�‰�d˜J¨¯©°
Ó(;Ô<ô +/¬t´C¼°H©~¸s¿w¹wÀzÓ?RÒ?XÐVXÓ*Yˆð �<‰<Ð,Ô-Ü6°xÐ@TÑ7UÓVˆD�‰Là�L‰LÐ2Ó3ò 'Ø�|‰|˜LÓ)ò'à�|‰|Ð2Ó3ò'ð �|‰|˜IÓ&ð	 	ñ Ü6°xÓ@ˆD�‰LØ�<‰<˜Ô&Ü"% h¨}Ñ&=Ó">ˆD�Ñð
 ×ÓÜ˜t×1Ñ1Ó2ˆEØ—g‘g˜nÓ-Ò3°ò 5�Ü! "¤cÔ*¨c¸©mØØŸ,™, sÓ+‘��1�aØ˜’:¢!Ø×(Ñ(¨¨q°!Õ4ð5ð !Ÿ™Ó(ò :‘��1Ø˜’: !¡-¼
À1ÄtÌTÀlÕ8SØ×(Ñ(¨¨q´#°a³&Õ9ð:ð Lò B�
Ø!Ÿ™ jÓ1�Ü˜f¤dÕ+Ø &§¡£ò B™˜˜1Ø š:¨!©-Ä
È1ÌtÔUYÈlÕ@[Ø ×0Ñ0°°q¼#¸a»&ÕAñBðBð ˆr<   ro   rq   Úvaluec                 ó`   — |t         v rt        j                  d||«       y t        |«      | |<   y )Nuk   Datadog Cost Management: dropping user-supplied tag %r=%r â€” key is reserved for trusted cost attribution.)r   r   rO   r   ©ro   rq   rŒ   s      r;   rƒ   z+DatadogCostManagementLogger._set_custom_tagß   s8   € àÔ$Ñ$Ü× Ñ ð@àØô	ð Ü/°Ó6ˆˆSŠ	r<   c                 ó&   — |rt        |«      | |<   y y ©N)r   rŽ   s      r;   r}   z$DatadogCostManagementLogger._add_tagë   s   € áÜ˜E›
ˆD�ŠIð r<   Úpayloadc              ƒ   ó`  K  — | j                   r| j                  sy d| j                   | j                  dœ}t        |«      }| j                  j	                  | j
                  ||¬«      ƒ d {  –—† }|j                  «        t        j                  dt        |«      |j                  «       y 7 Œ?­w)Nzapplication/json)zContent-Typez
DD-API-KEYzDD-APPLICATION-KEY)ÚcontentÚheadersz=Datadog Cost Management: Uploaded %s cost entries. Status: %s)r+   r,   r   r1   Úputr/   Úraise_for_statusr   rO   rC   Ústatus_code)r8   r‘   r”   Ú	data_jsonÚresponses        r;   rP   z.DatadogCostManagementLogger._upload_to_datadogð   s”   è ø€ Ø�Š d§o¢oØð /ØŸ/™/Ø"&§/¡/ñ
ˆô & gÓ.ˆ	à $× 1Ñ 1× 5Ñ 5°d·o±oÈyÐbiÐ 5Ó j×jˆà×!Ñ!Ô#ä×ÑØKÌSÐQXË\Ð[c×[oÑ[oõ	
ð	 kús   ‚A*B.Á,B,Á-A B.r�   )Ú__name__Ú
__module__Ú__qualname__r(   r   r7   rL   rE   r   r   rN   r~   rd   Ústaticmethodrƒ   r   r}   rP   Ú__classcell__)r:   s   @r;   r   r   /   sá   ø„ ñ# d¨3¡i°$Ñ&6õ #ò2iò"bð(8) TÐ*@Ñ%Að 8)ÀdÐK`ÑFaó 8)ðt5Ð!7ð 5¸DÀÀcÀ¹Nó 5ðn ð	7˜d 3¨ 8™nð 	7°3ð 	7¸sð 	7Àtò 	7ó ð	7ð ð#�t˜C ˜H‘~ð #¨Cð #¸ð #Àò #ó ð#ð
°°T±
÷ 
r<   r   )r2   r)   ra   r   Útypingr   r   r   Ú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   Ú2litellm.types.integrations.datadog_cost_managementr   Úlitellm.types.utilsr   Ú	frozensetr   Ú__annotations__r   r'   r<   r;   ú<module>r©      si   ðÜ Û 	Û Ý ß #Ñ #å +Ý F÷õ õ B÷õõ 7ñ (1òó(Ð �E˜)Ñ$ó ô T
Ð"3õ T
r<   