o
    i&                     @   s8  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
 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 G dd dZdd ZdefddZdee fddZdee dededededeee  dee fd d!Zd"d# Zd$efd%d&Z d'efd(d)Z!ded*efd+d,Z"ded-efd.d/Z#d0ed1edefd2d3Z$d$ee dee fd4d5Z%ded6dfd7d8Z&d9e'eef d:edee fd;d<Z(d$ee dee fd=d>Z)dee fd?d@Z*dee fdAdBZ+dee fdCdDZ,dEefdFdGZ-dHefdIdJZ.dS )K    N)Any)Optional)telemetry_writer)TELEMETRY_NAMESPACE)	DECORATOR)DROPPED_IO_COLLECTION_ERROR)INTEGRATION)PARENT_ID_KEY)ROOT_PARENT_ID)
SESSION_ID)	SPAN_KIND)_get_ml_app)LLMObsSpanEvent)Spanc                   @   sP   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdS )LLMObsTelemetryMetrics	init_timeproduct_enabledzspan.raw_sizez	span.sizez
span.startzspan.finisheddropped_span_eventsdropped_eval_eventsannotationsevals_submittedspans_exported
user_flushinject_distributed_headersactivate_distributed_headersuser_processor_calledzprompt.sourcezprompt.fetch.errorN)__name__
__module____qualname__	INIT_TIMEENABLEDRAW_SPAN_SIZE	SPAN_SIZESPAN_STARTEDSPAN_FINISHEDDROPPED_SPAN_EVENTSDROPPED_EVAL_EVENTSANNOTATIONSEVALS_SUBMITTEDSPANS_EXPORTEDUSER_FLUSHESINJECT_HEADERSACTIVATE_HEADERSUSER_PROCESSOR_CALLEDPROMPT_SOURCEPROMPT_FETCH_ERROR r0   r0   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/llmobs/_telemetry.pyr      s$    r   c                    s4   t  fdd| D d }|sd S |  dd S )Nc                 3   s$    | ]}|   d r|V  qdS ):N)
startswith.0tagtag_keyr0   r1   	<genexpr>(   s   " z,_find_tag_value_from_tags.<locals>.<genexpr>r2   )nextsplit)tagsr8   
tag_stringr0   r7   r1   _find_tag_value_from_tags'   s   r?   eventc                 C   s   |  di  di  dd}t|  dg d}t|  dg d}|d u}|  dd	k}d
|fdtt|fd	tt|fd|rA|ndfd|rJ|fgS dfgS )Nmetaspankind r=   integrationml_appstatuserror	span_kindautoinstrumentedN/A)getr?   strint)r@   rI   rE   rF   rJ   rH   r0   r0   r1   _get_tags_from_span_event.   s   
rO   rH   c                 C   s(   d| rdndfg}| r| d| f |S )NrH   10
error_type)appendrH   r=   r0   r0   r1   
_base_tags=   s   rU   agentless_enabledsitestart_nsautoinstrumented_proxy_urlsrF   c           	      C   s   t | }|dt|d urt|ndfd|fdtt|fd|r"dndfd|p(dfg t | d	 }tjtj	t
j|t|d
 tjtj	t
jdt|d
 d S )N	agentlessrK   rW   rY   rZ   truefalserF   g    .A	namespacenamevaluer=      )rU   extendrM   rN   timetime_nsr   add_distribution_metricr   MLOBSr   r   tupleadd_count_metricr    )	rH   rV   rW   rX   rY   rZ   rF   r=   init_time_msr0   r0   r1   record_llmobs_enabledD   s    	
	
rk   c                   C   s   t jtjtjdd d S )Nrb   )r_   r`   ra   )r   ri   r   rg   r   r#   r0   r0   r0   r1   record_span_started`   s   

rl   rB   c           
   	   C   s   |  ttk}|  td u}|  t}|d u}|  tdu }|  t}|  d}t| }dtt	|fdtt	|fdtt	|fd|pEdfd|pJdfd	|pOdfd
t| j
fg}	|se|	dtt	|f |rn|	d|f tjtjtjdt|	d d S )NTmodel_providerrJ   has_session_idis_root_spanrI   rK   rE   rF   rH   	decoratorrb   r^   )_get_ctx_itemr	   r
   r   r   r   r   r   rM   rN   rH   rS   r   ri   r   rg   r   r$   rh   )
rB   ro   rn   rE   rJ   rp   rI   rm   rF   r=   r0   r0   r1   record_span_createdf   s.   





	
rr   
span_eventc                 C   s   | d t k}tdd | d D }t| }|dtt|fdtt|fg | d d d	}|d ur<|d	|f tj	t
jtjd
t|d d S )N	parent_idc                 s   s    | ]}d |v V  qdS )
session_idNr0   r4   r0   r0   r1   r9      s    z:record_bedrock_agent_span_event_created.<locals>.<genexpr>r=   rn   ro   rA   metadatarm   rb   r^   )r
   anyrO   rc   rM   rN   rL   rS   r   ri   r   rg   r   r$   rh   )rs   ro   rn   r=   rm   r0   r0   r1   'record_bedrock_agent_span_event_created   s   &
rx   raw_event_sizec                 C   s"   t jtjtj|tt| d d S )Nr^   )r   rf   r   rg   r   r!   rh   rO   )r@   ry   r0   r0   r1   record_span_event_raw_size   s   

rz   
event_sizec                 C   sL   t | }t| dg v }|dtt|f tjtj	t
j|t|d d S )Ncollection_errors	truncatedr^   )rO   r   rL   rS   rM   rN   r   rf   r   rg   r   r"   rh   )r@   r{   r=   r}   r0   r0   r1   record_span_event_size   s   
r~   
num_events
event_typec                 C   s:   |dkrt jnt j}d|fg}tjtj|| t|d d S )Nevaluation_metricrH   r^   )r   r&   r%   r   ri   r   rg   rh   )r   r   rH   r`   r=   r0   r0   r1   record_dropped_payload   s   

r   c                 C   v   t |}d}d}| r!t| tr!| tpd}tt| ttk}|	d|fd|fg t
jtjtjdt|d d S NrK   rQ   rI   ro   rb   r^   )rU   
isinstancer   rq   r   rM   rN   r	   r
   rc   r   ri   r   rg   r   r'   rh   rB   rH   r=   rI   ro   r0   r0   r1   record_llmobs_annotate      
r   returnc                 C   s0   d| rdndfg}t jtjtjdt|d d S )NrH   rP   rQ   rb   r^   )r   ri   r   rg   r   r-   rh   rT   r0   r0   r1   #record_llmobs_user_processor_called   s   
r   join_onmetric_typec                 C   sb   |dv r|nd}t t| dd u}t|}|d|fd|fg tjtjt	j
dt|d d S )N)categoricalscorebooleanjsonotherr6   r   custom_joining_keyrb   r^   )rM   rN   rL   rU   rc   r   ri   r   rg   r   r(   rh   )r   r   rH   _metric_typer   r=   r0   r0   r1   record_llmobs_submit_evaluation   s   
r   c                 C   r   r   )rU   r   r   rq   r   rM   rN   r	   r
   rc   r   ri   r   rg   r   r)   rh   r   r0   r0   r1   record_span_exported   r   r   c                 C   &   t | }tjtjtjdt|d d S Nrb   r^   )rU   r   ri   r   rg   r   r*   rh   rT   r0   r0   r1   record_user_flush      
r   c                 C   r   r   )rU   r   ri   r   rg   r   r+   rh   rT   r0   r0   r1   !record_inject_distributed_headers   r   r   c                 C   r   r   )rU   r   ri   r   rg   r   r,   rh   rT   r0   r0   r1   #record_activate_distributed_headers   r   r   sourcec                 C   (   d| fg}t jtjtjdt|d dS )zPRecord the source of a prompt fetch (hot_cache, warm_cache, registry, fallback).fromrb   r^   N)r   ri   r   rg   r   r.   rh   )r   r=   r0   r0   r1   record_prompt_source      

r   rR   c                 C   r   )zRecord a prompt fetch error.rR   rb   r^   N)r   ri   r   rg   r   r/   rh   )rR   r=   r0   r0   r1   record_prompt_fetch_error   r   r   )/rd   typingr   r   ddtrace.internal.telemetryr   $ddtrace.internal.telemetry.constantsr   ddtrace.llmobs._constantsr   r   r   r	   r
   r   r   ddtrace.llmobs._utilsr   ddtrace.llmobs._writerr   ddtrace.tracer   r   r?   rO   rM   rU   boolrN   setrk   rl   rr   rx   rz   r~   r   r   r   dictr   r   r   r   r   r   r   r0   r0   r0   r1   <module>   sb    

		"

