o
    پiNY                     @  s  U d Z ddlmZ ddlZddlZddlZddlZ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mZmZ ddlmZ erKddlmZ ddlmZmZmZmZmZ eeZd	Zd	adZd
dgZ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) ddl*m+Z+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 e3 ZdZW n e4y   G dd dZ/e5d Y nw dqddZ6drddZ7eG d d! d!Z8eG d"d# d#Z9eG d$d% d%Z:eG d&d' d'Z;eG d(d) d)Z<G d*d+ d+e/j=Z>i Z?d,e@d-< i ZAd.e@d/< i ZBd0e@d1< d2d3 aCdsd5d6ZDd7d8 ZEd9d: ZF	dtdud?d@ZGdvdwdBdCZH		dxdydEdFZIdzdHdIZJd{dLdMZKdNdO ZL			P	d|d}dWdXZM	dtd~dZd[ZN			ddd^d_ZO						dddbdcZPePZQ	dtddedfZRddgdhZSddkdlZTdi fddmdnZUG dodp dpZVdS )z#package for sglang requests tracing    )annotationsN)	dataclass)TYPE_CHECKINGAnyDictListOptional)get_int_env_var)Req)r   r   r   Mappingr   Ftraceparent
tracestate)context	propagatetrace)OTLPSpanExporter)"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL)SERVICE_NAMEResource)TracerProviderid_generator)BatchSpanProcessor)TraceContextTextMapPropagatorTc                   @  s   e Zd ZG dd dZdS )r   c                   @  s   e Zd ZdS )zid_generator.IdGeneratorN)__name__
__module____qualname__ r   r   L/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/tracing/trace.pyIdGeneratorB   s    r   N)r   r   r   r   r   r   r   r   r   A   s    r   z8opentelemetry package is not installed, tracing disabledreturnboolc                   C  s   t S N)tracing_enabledr   r   r   r   is_tracing_enabledH   s   r#   headersMapping[str, str]Optional[Dict]c                   s    fddt D S )Nc                   s   i | ]}| v r| | qS r   r   ).0hr$   r   r   
<dictcomp>M   s    z)extract_trace_headers.<locals>.<dictcomp>)TRACE_HEADERSr)   r   r)   r   extract_trace_headersL   s   r,   c                   @  s>   e Zd ZU ded< ded< ded< ded< ded< ded	< d
S )SglangTraceThreadInfostrhost_idintpidthread_labeltp_rankdp_rankztrace.TracertracerN)r   r   r   __annotations__r   r   r   r   r-   P   s   
 r-   c                   @  s.   e Zd ZU ded< dZded< dZded< dS )	SglangTraceSliceContextr.   
slice_nameNOptional[trace.span.Span]spanFr    	anonymous)r   r   r   r6   r:   r;   r   r   r   r   r7   Z   s   
 r7   c                   @  s6   e Zd ZU ded< ded< dZded< dZded	< dS )
SglangTraceThreadContextr-   thread_infozList[SglangTraceSliceContext]cur_slice_stackNr9   thread_span Optional[trace.span.SpanContext]last_span_context)r   r   r   r6   r?   rA   r   r   r   r   r<   b   s
   
 r<   c                   @  sn   e Zd ZU ded< ded< ded< dZded	< d
Zded< dZded< dZded< dZded< dZ	ded< dS )SglangTraceReqContextr.   ridr0   start_time_nsz#Dict[int, SglangTraceThreadContext]threads_contextNOptional[int]bootstrap_roomFr    is_copyr9   bootstrap_room_spanzOptional[context.Context]bootstrap_room_span_context	root_spanroot_span_context)
r   r   r   r6   rG   rH   rI   rJ   rK   rL   r   r   r   r   rB   k   s   
 rB   c                   @  s2   e Zd ZU ded< ded< dd Zedd Zd	S )
SglangTracePropagateContextzcontext.ContextrL   r@   prev_span_contextc                 C  s:   i }t || j | jr|| jj| jjddS |ddS )N)span_idtrace_id)rK   	prev_spanNone)r   injectrL   rN   rO   rP   )selfcarrierr   r   r   to_dict   s   
z#SglangTracePropagateContext.to_dictc                 C  sd   d|vsd|vr
d S |d }t |}|d dkrd }ntjj|d d |d d dd}| ||S )NrK   rQ   rR   rP   rO   T)rP   rO   	is_remote)r   extractr   r:   SpanContext)clsdrU   rL   rN   r   r   r   instance_from_dict   s   



z.SglangTracePropagateContext.instance_from_dictN)r   r   r   r6   rV   classmethodr\   r   r   r   r   rM   {   s   
 rM   c                      s4   e Zd ZdZ fddZd
ddZd
dd	Z  ZS )SglangTraceCustomIdGeneratorz
    The default IdGenerator may produce duplicate trace IDs across multiple TP scheduler processes,
    hence a custom IdGenerator is implemented.
    c                   s(   t    t | _| jt  d S r!   )super__init__randomRandomlocal_randomseedtimerT   	__class__r   r   r`      s   

z%SglangTraceCustomIdGenerator.__init__r   r0   c                 C     | j dS N@   rc   getrandbitsrf   r   r   r   generate_trace_id      z.SglangTraceCustomIdGenerator.generate_trace_idc                 C  ri   rj   rl   rf   r   r   r   generate_span_id   ro   z-SglangTraceCustomIdGenerator.generate_span_id)r   r0   )r   r   r   __doc__r`   rn   rp   __classcell__r   r   rg   r   r^      s
    
r^   z&Dict[str, SglangTracePropagateContext]remote_trace_contextsz Dict[int, SglangTraceThreadInfo]threads_infoz Dict[str, SglangTraceReqContext]reqs_contextc                   C  s   t t d S )Ng    eA)r0   re   r   r   r   r   <lambda>   s    rv   r.   c                  C  st   t jdr)ztdd} |   W  d   W S 1 sw   Y  W n   Y t }|dkr8tj|dj	S dS )z
    In distributed tracing systems, obtain a unique node identifier
    and inject it into all subsequently generated spans
    to prevent PID conflicts between threads on different nodes.
    z/etc/machine-idrNr   )r0   unknown)
ospathexistsopenreadstripuuidgetnodeUUIDhex)fmacr   r   r   __get_host_id   s   
&r   c              
   C  s   t std dad S z.tjt|id}t|t d}t	dd}t	dd}t
t| ||d	}|| t| W n tyW } ztd
| d daW Y d }~d S d }~ww ttdradd adad S )Nz<Tracing is disabled because the packages cannot be imported.F)
attributes)resourcer   *SGLANG_OTLP_EXPORTER_SCHEDULE_DELAY_MILLISi  *SGLANG_OTLP_EXPORTER_MAX_EXPORT_BATCH_SIZErk   )span_exporterschedule_delay_millismax_export_batch_sizez Initialize OpenTelemetry error: z#. Please set correct otlp endpoint.time_nsc                   S  s   t t S r!   )r0   re   r   r   r   r   r   rv      s    z&process_tracing_init.<locals>.<lambda>T)opentelemetry_importedloggerwarningr"   r   creater   r   r^   r	   r   get_otlp_span_exporteradd_span_processorr   set_tracer_provider	Exceptionerrorhasattrre   __get_cur_time_ns)otlp_endpointserver_namer   tracer_providerr   r   	processorer   r   r   process_tracing_init   sH   



r   c                 C  sf   t jtd}ddh}||vrtd| ddt| |dkr(t| ddS |dkr1t| dS d S )	Ngrpczhttp/protobufzUnsupported OTLP protocol 'z'' configured. Supported protocols are: z, T)endpointinsecure)r   )	ry   environgetr   
ValueErrorjoinsortedGRPCSpanExporterHTTPSpanExporter)r   protocolsupported_protocolsr   r   r   r      s   
r   r2   r3   rF   r4   c              	   C  s@   t sd S t }|tv rd S tt || ||tddt|< d S )Nzsglang server)r/   r1   r2   r3   r4   r5   )r"   	threadingget_native_idrt   r-   r   r   
get_tracer)r2   r3   r4   r1   r   r   r   trace_set_thread_info  s   r   tsc                 C  s   | t vrtd t |  }t|g d}|j }|jd ur$|d|j d7 }|d|jd d  d|  d7 }|p8t }|jjj	|||d	|_
|jd urR|j
d
|ji |j
|j|j|jd |S )Nrx   )r=   r>   z [TP z] z(host:   z | pid:)name
start_timer   r3   )r/   r1   r2   )rt   r   r<   r2   r3   r/   r   r=   r5   
start_spanr?   set_attributesr1   )r1   req_span_contextr   r=   thread_contextthread_namer   r   r   __create_thread_context$  s4   
 

r   Optional[Dict[str, Any]]c                 C  s   t sd S t| } | tvst|  jsd S t }d }t|  j| }|jr.|jd }|j	 }n|j
r4|j
}t|  j}|r@t|  j}t||}| S )Nr   )r"   r.   ru   rL   r   r   rE   r>   r:   get_span_contextrA   rJ   rM   rV   )rC   remote_propagater1   rN   r   cur_slice_inforL   trace_contextr   r   r    trace_get_proc_propagate_contextG  s$   



r   r   c                 C  s   t sd S |sd S t|}|sd S t| } | tvr&t| t i |jddt| < t	 }|t|  j
v r3d S t||jt|  jt|  j
|< |jt|  j
| _d S )NT)rC   rD   rE   rL   rH   )r"   rM   r\   r.   ru   rB   r   rL   r   r   rE   r   rD   rN   rA   )rC   r   r1   r   r   r    trace_set_proc_propagate_contextb  s:   

r   bootstrap_room_list	List[str]c                 C  s`   t sdS i }| D ]}t|}|tvrqt|dd}|||< qtj|dd}t|d	dS )N T)r   F)ensure_asciiutf-8)
r"   r.   ru   r   jsondumpsbase64	b64encodeencodedecode)r   reqs_trace_contextsrG   _contextjson_strr   r   r   "trace_get_remote_propagate_context  s   
r   c                 C  sl   t sd S | d u s| dks| dkrd S t| }|d}t|}|D ]}|tv r*q#t|| t|< q#d S )Nr   rR   r   )	r"   r   	b64decoder   r   loadsrs   rM   r\   )
base64_strbase64_bytesr   remote_reqs_trace_contextsrG   r   r   r   "trace_set_remote_propagate_context  s   


r   nullrC   rG   roleOptional[str]external_trace_headerOptional[Dict[str, str]]c                 C  s  t sd S t| } |pt }t }|tvrd S |d u rdn|}t| |i |ddt| < t| j}t|t	vr]dtt
|i}t|pBi }|jdt
| |||d}	|	t|  _t|	}
nt	t| j}
| dd }|d	krqd
n|}d|i}|j| d|d d  ||
|d}|d| i |t|  _t|t|  _|
t|  _t|t|  j|t|  j|< t|t	v rt	t| jt|  j| _d S d S )Nr   F)rC   rD   rE   rG   rH   rG   zBootstrap Room )r   r   r   r   _r   r   rC   z Req r   )r   r   r   r   )r"   r.   r   r   r   rt   rB   ru   r5   rs   r   _trace_context_propagatorrX   r   rI   r   set_span_in_contextrL   splitr   rK   rJ   r   rE   rN   rA   )rC   rG   r   r   r   r1   r5   attrsexternal_trace_contextrI   rJ   orig_ridrK   r   r   r   trace_req_start  sv   


	


r   r   c                 C  s   t sd S t| } | tvrd S t|  }|pt }|j D ]	}|jj|d q|r.|j	| |jj|d t|j
tv rCtt|j
= n
|jrM|jj|d t| = d S )Nend_time)r"   r.   ru   r   rE   valuesr?   endrK   r   rG   rs   rI   )rC   r   r   req_contextr   r   r   r   trace_req_finish  s"   

r   r   r;   c                 C  s   t sd S t|}|tvrd S t }|t| jvrd S t| j| }|p&t }t| |d}d }|js8|j	r8|j	}|j
}|jrD|jd j}t|}	|jjj|j||	d}
|r[|
| |
|_|j| d S )N)r8   r;   r   r   )r"   r.   ru   r   r   rE   r   r7   r>   rA   r?   r:   r   r   r=   r5   r   r8   add_linkappend)r   rC   r   r;   r1   r   
slice_inforN   parent_spanparent_span_contextr:   r   r   r   trace_slice_start!  s>   


r   auto_next_anonthread_finish_flagc           
      C  sZ  t sd S t|}|tvrd S t }|t| jvrd S t| j| }|js0td|  d d S |p4t	 }|jd }|j
}	|jrF|	|  n|j
}	|j| krd|	ttjj td|  d|j  |rk|	| |	j|d |j  t|jdkr|	 |_|r|jj|d t| j|= t| jrt| jst|= d S |rtd||d	 d S d S )
Nz&No matching with the SLICE_START eventz is required.r   zSlice name mismatch: z != r   r   r   T)r"   r.   ru   r   r   rE   r>   r   r   r   r:   r;   update_namer8   
set_statusr   Status
StatusCodeERRORr   r   poplenr   rA   r?   rH   r   )
r   rC   r   r   r   r   r1   r   r   r:   r   r   r   trace_slice_endT  sH   





r   Dict[str, Any]c                 C  s   t sd S t|}|tvrd S t }|t| jvrd S t| j| }|js,td d S |p0t	 }|jd }|j
j| ||d d S )N#No slice is currently being traced.r   )r   	timestampr   )r"   r.   ru   r   r   rE   r>   r   r   r   r:   	add_event)r   rC   r   r   r1   r   r   r   r   r   trace_event  s   


r   c                 C  sr   t sd S t| } | tvrd S t }|t|  jvrd S t|  j| }|js,td d S |jd }|j	
| d S )Nr   r   )r"   r.   ru   r   r   rE   r>   r   r   r:   r   )rC   r   r1   r   r   r   r   r   trace_slice_add_attr  s   

r   reqs	List[Req]c                 C  s2   t sd S |D ]}t| |j|  | d qd S )N)r   r   )r"   trace_slicerC   finished)r   r  reqr   r   r   trace_slice_batch  s   r  c                 C  sR   t sd S t jd d }|t|d}|| |D ]}t| |j||d qd S )Nr   )bid
batch_size)r   r   )r"   r   uuid4r   r   updater   rC   )r   r  r   r   r  _attrsr  r   r   r   trace_event_batch  s   
r  c                   @  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 )SpanAttributeszgen_ai.usage.completion_tokenszgen_ai.usage.prompt_tokenszgen_ai.usage.cached_tokenszgen_ai.request.max_tokenszgen_ai.request.top_pzgen_ai.request.top_kzgen_ai.request.temperaturezgen_ai.response.modelzgen_ai.response.finish_reasonszgen_ai.request.idzgen_ai.request.nzgen_ai.latency.time_in_queuez"gen_ai.latency.time_to_first_tokenzgen_ai.latency.e2ez$gen_ai.latency.time_in_model_prefillz#gen_ai.latency.time_in_model_decodez&gen_ai.latency.time_in_model_inferenceN)r   r   r   GEN_AI_USAGE_COMPLETION_TOKENSGEN_AI_USAGE_PROMPT_TOKENSGEN_AI_USAGE_CACHED_TOKENSGEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_TOP_PGEN_AI_REQUEST_TOP_KGEN_AI_REQUEST_TEMPERATUREGEN_AI_RESPONSE_MODELGEN_AI_RESPONSE_FINISH_REASONSGEN_AI_REQUEST_IDGEN_AI_REQUEST_NGEN_AI_LATENCY_TIME_IN_QUEUE"GEN_AI_LATENCY_TIME_TO_FIRST_TOKENGEN_AI_LATENCY_E2E$GEN_AI_LATENCY_TIME_IN_MODEL_PREFILL#GEN_AI_LATENCY_TIME_IN_MODEL_DECODE&GEN_AI_LATENCY_TIME_IN_MODEL_INFERENCEr   r   r   r   r    s$    r  )r   r    )r$   r%   r   r&   )r   r.   )NN)r2   r.   r3   rF   r4   rF   r!   )r   rF   )F)r   r   )r   r   )r   r   )NNr   N)
rC   r.   rG   rF   r   rF   r   r   r   r   )rC   r.   r   rF   r   r   )NF)r   r.   rC   r.   r   rF   r;   r    )NNFF)r   r.   rC   r.   r   rF   r   r   r   r    r   r    )r   r.   rC   r.   r   rF   r   r   )rC   r.   r   r   )r   r.   r  r  )r   r.   r  r  r   rF   r   r   )Wrq   
__future__r   r   r   loggingry   ra   r   re   r   dataclassesr   typingr   r   r   r   r   sglang.srt.utilsr	   sglang.srt.managers.schedulerr
   r   	getLoggerr   r   r   r"   r   r+   opentelemetryr   r   r   5opentelemetry.exporter.otlp.proto.grpc.trace_exporterr   r   5opentelemetry.exporter.otlp.proto.http.trace_exporterr   'opentelemetry.sdk.environment_variablesr   opentelemetry.sdk.resourcesr   r   opentelemetry.sdk.tracer   r   opentelemetry.sdk.trace.exportr   ,opentelemetry.trace.propagation.tracecontextr   ImportErrordebugr#   r,   r-   r7   r<   rB   rM   r   r^   rs   r6   rt   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r  r   r   r   r   <module>   s   

	
	'
-$

&R 6<

