o
    i                     @  st  d dl mZ d dlmZ d dlmZ d dlm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 d dlmZ erHd dlm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 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  ddlm!Z! ddlm"Z" ee#Z$e%di  dd Z&dd Z'd5d%d&Z(d6d-d.Z)d/d0 Z*d1d2 Z+d3d4 Z,dS )7    )annotations)TYPE_CHECKING)Any)OptionalN)config)unwrap)wrap)
get_logger)VLLMIntegration)tracer)OutputProcessor   )ARG_POSITION_LOG_STATS)ARG_POSITION_TRACE_HEADERS)ATTR_DATADOG_INTEGRATION)ATTR_DATADOG_PATCH)ATTR_MODEL_NAME)MIN_VERSION)extract_latency_metrics)extract_request_data)get_model_name)create_span)inject_trace_context)set_latency_metricsvllmc                 C  s|   t |tkr|dt d |td d  }nd|d< | |i |}t|dr<t|dr<t|jdd}|r<t|jt| |S )	zJInject model name into OutputProcessor and force-enable stats for tracing.N)Tr   T	log_statsmodel_configoutput_processormodel)lenr   hasattrgetattrr   setattrr   r   )funcinstanceargskwargsresult
model_name r)   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/vllm/patch.pytraced_engine_init'   s   "r+   c                 C  sh   t |tkr!|t }tt|}|dt |f |td d  }n|d}tt||d< | |i |S )z@Inject Datadog trace context into trace_headers for propagation.Nr   trace_headers)r   r   r   r   get)r#   r$   r%   r&   r,   injected_headersr)   r)   r*   traced_processor_process_inputs<   s   
$
r/   r$   'OutputProcessor'engine_core_outputsr   returndict[str, dict[str, Any]]c                 C  sT   i }|D ]#}|j }| j|}|sq|j|jr|jjndt|||jd||< q|S )z}Capture request state data before original function removes them.

    Returns dict mapping request_id -> captured_data.
    N)r,   arrival_timedatastats)
request_idrequest_statesr-   r,   r6   r4   r   )r$   r1   
spans_dataengine_core_outputreq_id	req_stater)   r)   r*   _capture_request_statesJ   s   r=   integrationr
   r(   Optional[str]r9   Nonec           
      C  s   |  D ]M\}}||jv rqt| ||d |d d}|d }|jdur%dnd}|dkr5|d r5|d j|_t|d }	| j|g ||	d	d|d
 t||	 |	  qdS )z/Create and finish spans for completed requests.r,   r4   )r>   r(   r,   r4   r5   N	embedding
completionr6   )request_datalatency_metrics)r%   r&   response	operation)
itemsr8   r   embedding_dimnum_generation_tokensoutput_tokensr   llmobs_set_tagsr   finish)
r>   r(   r$   r9   r;   	span_infospanr5   rF   rD   r)   r)   r*   _create_finished_spansd   s4   


rO   c           	      C  sd   t tt}|r|d n|d}|s| |i |S t|}t||}| |i |}t|||| |S )z+Create Datadog spans for finished requests.r   r1   )r!   r   r   r-   r   r=   rO   )	r#   r$   r%   r&   r>   r1   r(   r9   r'   r)   r)   r*   'traced_output_processor_process_outputs   s   

rP   c               
   C  s  t ttdrdS z%ddlm}  t tdd}| |j}| || tk r,tdt| W dS W n4 t	t
fyH } ztd|t W Y d}~nd}~w tya } ztjd	|d
d W Y d}~nd}~ww tttd
 ttjd}ttt| tddt tddt tddt tddt dS )z*Patch vLLM V1 library for Datadog tracing.FNr   )parse__version__z0.0.0zgvLLM integration requires vLLM >= %s for V1 engine support. Found version %s. Skipping instrumentation.zCould not verify vLLM version (missing packaging library or __version__): %s. Proceeding with instrumentation - may fail if version < %szqUnexpected error verifying vLLM version: %s. Proceeding with instrumentation, but compatibility issues may occur.T)exc_info)integration_configzvllm.v1.engine.llm_enginezLLMEngine.__init__zvllm.v1.engine.async_llmzAsyncLLM.__init__zvllm.v1.engine.processorzProcessor.process_inputszvllm.v1.engine.output_processorzOutputProcessor.process_outputs)r!   r   r   packaging.versionrQ   base_versionr   loggerwarningImportErrorAttributeErrordebug	Exceptionr"   r
   r   r   r   r+   r/   rP   )parse_versionversion_strrV   er>   r)   r)   r*   patch   sP   
r`   c                   C  sr   t ttdsd S tttd ttjjjjd ttjjj	j
d ttjjjjd ttjjjjd ttt d S )NF__init__process_inputsprocess_outputs)r!   r   r   r"   r   v1engine
llm_engine	LLMEngine	async_llmAsyncLLM	processor	Processorr   r   delattrr   r)   r)   r)   r*   unpatch   s   rm   )r$   r0   r1   r   r2   r3   )
r>   r
   r(   r?   r$   r0   r9   r3   r2   r@   )-
__future__r   typingr   r   r   r   ddtracer   ddtrace.contrib.trace_utilsr   r   ddtrace.internal.loggerr	   !ddtrace.llmobs._integrations.vllmr
   ddtrace.tracer   vllm.v1.engine.output_processorr   
_constantsr   r   r   r   r   r   
extractorsr   r   r   utilsr   r   r   __name__rW   _addr+   r/   r=   rO   rP   r`   rm   r)   r)   r)   r*   <module>   sD    

)0