o
    ưi&                     @   s   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 deZdS )    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                	       s   e Zd Zddef fddZ	d dedeeee	f  de
e fd	d
Z	d!dededeee	f fddZdd Zdd Zdd ZdefddZdefddZdedee dee dee fddZ  ZS )"DatadogMetricsLoggerTstart_periodic_flushc                    s   t d| _t d| _t dd| _| jstd d| j d| _tt	j
d| _t | _d	|vr8| j|d	< d
|vr@d|d
< t jdi | |rTt|   d S d S )NZ
DD_API_KEYZ
DD_APP_KEYZDD_SITEzdatadoghq.comzCDatadog Metrics: DD_API_KEY is required. Integration will not work.zhttps://api.z/api/v2/series)Zllm_provider
flush_lockflush_interval    )osgetenv
dd_api_key
dd_app_keyZdd_siter   warning
upload_urlr   r   ZLoggingCallbackasync_clientasyncioLockr   super__init__create_taskZperiodic_flush)selfr   kwargs	__class__r   c/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/datadog/datadog_metrics.pyr$      s(   

zDatadogMetricsLogger.__init__Nlogstatus_codereturnc           	      C   s   dt   dt  dtdd dt  dt  g}|d }r-|d	|  |d
 }r<|d|  |d }rK|d|  |durW|d|  |di p^i }|dpr|dpr|dpr|d}|r}|d|  |S )zD
        Builds the list of tags for a Datadog metric point
        zenv:zservice:zversion:Z
DD_VERSIONunknownz	HOSTNAME:z	POD_NAME:Zcustom_llm_providerz	provider:modelzmodel_name:model_groupzmodel_group:Nzstatus_code:metadataZuser_api_key_team_aliasZ
team_aliasZuser_api_key_team_idZteam_idzteam:)r   r   r   r   r	   r
   getappend)	r&   r+   r,   tagsproviderr/   r0   r1   Zteam_tagr   r   r*   _extract_tags@   s2   




	
z"DatadogMetricsLogger._extract_tags200r'   c                 C   s   | j ||d}|dpt }t| }|d}|r6|r6||  }dd||dg|d}	| j|	 |d}
|
rV|rV||
  }d	d||dg|d}| j| d
d|ddg|| j	d}| j| dS )zS
        Extracts latencies and appends Datadog metric series to the queue
        )r,   end_time
start_timezlitellm.request.total_latency   	timestampvaluemetrictypepointsr4   api_call_start_timezlitellm.llm_api.latencyzlitellm.llm_api.request_count         ?)r?   r@   rA   r4   intervalN)
r6   r2   r   nowintr<   total_seconds	log_queuer3   r   )r&   r+   r'   r,   r4   Zend_time_dtr<   Zstart_time_dtZtotal_durationZseries_total_latencyrB   Zllm_api_durationZseries_llm_latencyZseries_countr   r   r*   _add_metrics_from_logl   s8   	




z*DatadogMetricsLogger._add_metrics_from_logc              
      s   z*| dd }|d u rW d S | j||dd t| j| jkr)|  I d H  W d S W d S  tyH } ztdt	|  W Y d }~d S d }~ww )Nstandard_logging_objectr7   r+   r'   r,   z3Datadog Metrics: Error in async_log_success_event: )
r2   rJ   lenrI   
batch_sizeflush_queue	Exceptionr   	exceptionstr)r&   r'   response_objr9   r8   rK   er   r   r*   async_log_success_event   s&   z,DatadogMetricsLogger.async_log_success_eventc           
   
      s   zA| dd }|d u rW d S d}| di pi }| d}|d ur&t|}| j|||d t| j| jkr@|  I d H  W d S W d S  ty_ }	 zt	dt|	  W Y d }	~	d S d }	~	ww )NrK   500error_information
error_coderL   z3Datadog Metrics: Error in async_log_failure_event: )
r2   rR   rJ   rM   rI   rN   rO   rP   r   rQ   )
r&   r'   rS   r9   r8   rK   r,   rW   rX   rT   r   r   r*   async_log_failure_event   s2   
z,DatadogMetricsLogger.async_log_failure_eventc              
      sd   | j sd S | j  }d|i}z| |I d H  W d S  ty1 } ztdt|   d }~ww )Nseriesz,Datadog Metrics: Error in async_send_batch: )rI   copy_upload_to_datadogrP   r   rQ   rR   )r&   batchpayload_datarT   r   r   r*   async_send_batch   s   
z%DatadogMetricsLogger.async_send_batchpayloadc                    s   | j sd S d| j d}| jr| j|d< t|}t|d}d|d< | jj| j||dI d H }|	  t
dt|d	  d
|j  d S )Nzapplication/json)zContent-Typez
DD-API-KEYzDD-APPLICATION-KEYzutf-8gzipzContent-Encoding)contentheaderszDatadog Metrics: Uploaded rZ   z metric points. Status: )r   r   r   ra   compressencoder    postr   raise_for_statusr   debugrM   r,   )r&   r`   rc   Z	json_dataZcompressed_dataresponser   r   r*   r\      s$   
z'DatadogMetricsLogger._upload_to_datadogc              
      s   z&t t dd}dd|gdgd}d|gi}| |I dH  td	dd
W S  tyA } ztdt|d
W  Y d}~S d}~ww )z1
        Check if the service is healthy
        rD   r;   zlitellm.health_checkr:   zenv:health_checkr>   rZ   NZhealthy)statuserror_messageZ	unhealthy)rG   timer\   r   rP   rR   )r&   Ztest_metric_pointZtest_metric_seriesr^   rT   r   r   r*   async_health_check   s.   

z'DatadogMetricsLogger.async_health_check
request_idstart_time_utcend_time_utcc                    s   d S Nr   )r&   rn   ro   rp   r   r   r*   get_request_response_payload  s   z1DatadogMetricsLogger.get_request_response_payload)Trq   )r7   )__name__
__module____qualname__boolr$   r   r   r   rR   rG   r   r6   dictrJ   rU   rY   r_   r   r\   r   rm   r   rr   __classcell__r   r   r(   r*   r      s@    $
0

1r   ) r!   ra   r   rl   r   typingr   r   r   Zlitellm._loggingr   Z(litellm.integrations.custom_batch_loggerr   Z,litellm.integrations.datadog.datadog_handlerr   r	   r
   r   Z*litellm.litellm_core_utils.safe_json_dumpsr   Z&litellm.llms.custom_httpx.http_handlerr   r   Z,litellm.types.integrations.base_health_checkr   Z*litellm.types.integrations.datadog_metricsr   r   r   Zlitellm.types.utilsr   r   r   r   r   r*   <module>   s    