o
    ưi                     @   s   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mZ d dl	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ G d	d
 d
eZdS )    N)datetime)DictListOptionalTuple)verbose_logger)CustomBatchLogger)get_async_httpx_clienthttpxSpecialProvider)DatadogFOCUSCostEntry)StandardLoggingPayloadc                       sr   e Zd Z fddZdd Zdd Zdee dee fd	d
Z	dede
eef fddZdee
 fddZ  ZS )DatadogCostManagementLoggerc                    s   t d| _t d| _t dd| _| jr| jstd d| j d| _tt	j
d| _t | _t|   d	|vrB| j|d	< t jd
i | d S )NZ
DD_API_KEYZ
DD_APP_KEYZ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)Zllm_provider
flush_lock )osgetenv
dd_api_key
dd_app_keyZdd_siter   warning
upload_urlr	   r
   ZLoggingCallbackasync_clientasyncioLockr   create_taskZperiodic_flushsuper__init__)selfkwargs	__class__r   k/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/datadog/datadog_cost_management.pyr      s    

z$DatadogCostManagementLogger.__init__c              
      s   z3| dd }|d u rW d S | dddkr/| j| t| j| jkr2|  I d H  W d S W d S W d S  tyQ } ztdt	|  W Y d }~d S d }~ww )Nstandard_logging_objectresponse_costr   z;Datadog Cost Management: Error in async_log_success_event: )
get	log_queueappendlenZ
batch_sizeasync_send_batch	Exceptionr   	exceptionstr)r   r   Zresponse_obj
start_timeend_timer!   er   r   r    async_log_success_event.   s&   z3DatadogCostManagementLogger.async_log_success_eventc              
      st   | j sd S z| | j }|sW d S | |I d H  W d S  ty9 } ztdt|  W Y d }~d S d }~ww )Nz4Datadog Cost Management: Error in async_send_batch: )r$   _aggregate_costs_upload_to_datadogr(   r   r)   r*   )r   Zaggregated_entriesr-   r   r   r    r'   C   s   z,DatadogCostManagementLogger.async_send_batchlogsreturnc                 C   s  i }|D ]}zg| dpd}| dpd}| dd}|dkr!W q| dp)t }t|}|d}	| |}
|
rCtt|
 nd}|||	|f}||vrb|d	| |	|	d
d|
r\|
ndd||< || d  |7  < W q t	y } zt
d|  W Y d}~qd}~ww t| S )zq
        Aggregates costs by Provider, Model, and Date.
        Returns a list of DatadogFOCUSCostEntry.
        Zcustom_llm_providerunknownmodelr"   r   Z	startTimez%Y-%m-%dr   zLLM Usage for g        USDN)ZProviderNameZChargeDescriptionZChargePeriodStartZChargePeriodEnd
BilledCostZBillingCurrencyZTagsr6   z+Error processing log for cost aggregation: )r#   timer   fromtimestampstrftime_extract_tagstuplesorteditemsr(   r   r   listvalues)r   r1   Z
aggregatorlogproviderr4   ZcosttsdtZdate_strtagsZtags_keykeyr-   r   r   r    r/   Y   sB   	





z,DatadogCostManagementLogger._aggregate_costsr@   c           
      C   s   ddl m}m}m}m} | | | | d}|di }|rU|dr,t|d |d< |dp?|dp?|d	p?|d
}|rHt||d< |d}	|	rUt|	|d< |S )Nr   )get_datadog_envget_datadog_hostnameget_datadog_pod_nameget_datadog_service)envZservicehostZpod_namemetadataZuser_api_key_aliasuserZuser_api_key_team_aliasZ
team_aliasZuser_api_key_team_idZteam_idZteammodel_group)Z,litellm.integrations.datadog.datadog_handlerrF   rG   rH   rI   r#   r*   )
r   r@   rF   rG   rH   rI   rD   rL   Zteam_tagrN   r   r   r    r:      s.   


z)DatadogCostManagementLogger._extract_tagspayloadc                    sx   | j r| js	d S d| j | jd}ddlm} ||}| jj| j||dI d H }|  t	dt
| d|j  d S )Nzapplication/json)zContent-Typez
DD-API-KEYzDD-APPLICATION-KEYr   )
safe_dumps)contentheadersz"Datadog Cost Management: Uploaded z cost entries. Status: )r   r   Z*litellm.litellm_core_utils.safe_json_dumpsrP   r   putr   raise_for_statusr   debugr&   status_code)r   rO   rR   rP   Z	data_jsonresponser   r   r    r0      s    z.DatadogCostManagementLogger._upload_to_datadog)__name__
__module____qualname__r   r.   r'   r   r   r   r/   r   r*   r:   r0   __classcell__r   r   r   r    r      s    
@(r   )r   r   r7   r   typingr   r   r   r   Zlitellm._loggingr   Z(litellm.integrations.custom_batch_loggerr   Z&litellm.llms.custom_httpx.http_handlerr	   r
   Z2litellm.types.integrations.datadog_cost_managementr   Zlitellm.types.utilsr   r   r   r   r   r    <module>   s    