
    g:                       U d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZmZmZmZ d dlmZ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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+m,Z,m-Z-m.Z.m Z m"Z" d dl/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ e
rddlAmBZB 	 d dlCmDZD  e       ZFdeGd<   e G d de"             ZH ed       G d dejX                  e             ZIe G d d e              ZJ G d! d"e       ZKe G d# d$e             ZLd*d%ZMd+d&ZN e@       dddd'	 	 	 	 	 	 	 	 	 	 	 d,d(       ZOd-d)ZPy# eE$ r dZDY w xY w).    )annotationsN)	dataclassfield)Lock)TYPE_CHECKINGAnyCallableMappingSequencecast)WeakKeyDictionaryWeakSet)context)Context)Resource)ReadableSpanSpanProcessorTracerTracerProvider)IdGenerator)ResourceAttributes)SpanAttributes)LinkNonRecordingSpanSpanSpanContextSpanKindr   r   )get_current_span)Status
StatusCode)types   )ATTRIBUTES_MESSAGE_KEY'ATTRIBUTES_PENDING_SPAN_REAL_PARENT_KEYATTRIBUTES_SAMPLE_RATE_KEYATTRIBUTES_SPAN_TYPE_KEYATTRIBUTES_VALIDATION_ERROR_KEYPENDING_SPAN_NAME_SUFFIXlog_level_attributes)handle_internal_errors)LogfireConfig)ValidationErrorzWeakSet[_LogfireWrappedSpan]
OPEN_SPANSc                      e Zd ZU dZded<   ded<    ee      Zded<    ee      Z	d	ed
<    ee
      Zded<   ddZddZdd	 	 	 	 	 	 	 	 	 ddZddZddZedd       ZdddZy)ProxyTracerProviderz\A tracer provider that wraps another internal tracer provider allowing it to be re-assigned.r   providerr+   config)default_factoryz5WeakKeyDictionary[_ProxyTracer, Callable[[], Tracer]]tracersr   lockzset[str]suppressed_scopesc                    | j                   5  || _        | j                  j                         D ]  \  }}|j	                   |               	 d d d        y # 1 sw Y   y xY wN)r4   r0   r3   items
set_tracer)selfr0   tracerfactorys       M/var/www/openai/venv/lib/python3.12/site-packages/logfire/_internal/tracer.pyset_providerz ProxyTracerProvider.set_provider=   sE    YY$DM#'<<#5#5#7!!'), $8 YYs   A AA c                   | j                   5  | j                  j                  |       | j                  j	                         D ]*  \  }}|j
                  |v s|j                   |              , 	 d d d        y # 1 sw Y   y xY wr7   )r4   r5   updater3   r8   instrumenting_module_namer9   )r:   scopesr;   r<   s       r=   suppress_scopesz#ProxyTracerProvider.suppress_scopesC   s`    YY""))&1#'<<#5#5#733v=%%gi0 $8 YYs   A
A:A::BT)is_span_tracerc                     j                   5  d fd}t         |        |      }| j                  |<   |cd d d        S # 1 sw Y   y xY w)Nc                 t    j                   v r
t               S  j                  j                  g i S r7   )r5   SuppressedTracerr0   
get_tracer)argsrA   kwargsr:   s   r=   makez,ProxyTracerProvider.get_tracer.<locals>.makeS   s>    ,0F0FF+--34==334M_PT_X^__    )returnr   )r4   _ProxyTracerr3   )r:   rA   rD   rI   rJ   rK   r;   s   `` ``  r=   rH   zProxyTracerProvider.get_tracerJ   sH     YY` ` "";TVT>ZF#'DLL  YYs   -AAc                    | j                   5  t        | j                  t              r| j                  j	                  |       d d d        y # 1 sw Y   y xY wr7   )r4   
isinstancer0   SDKTracerProvideradd_span_processor)r:   span_processors     r=   rR   z&ProxyTracerProvider.add_span_processor]   s4    YY$--):;00@ YYs   6AAc                    | j                   5  t        | j                  t              r| j                  j	                          d d d        y # 1 sw Y   y xY wr7   )r4   rP   r0   rQ   shutdownr:   s    r=   rU   zProxyTracerProvider.shutdownb   s2    YY$--):;&&( YYs   5AAc                *   | j                   5  t        | j                  t              r| j                  j                  cd d d        S t        j                  t        j                  | j                  j                  i      cd d d        S # 1 sw Y   y xY wr7   )r4   rP   r0   rQ   resourcer   creater   SERVICE_NAMEr1   service_namerV   s    r=   rX   zProxyTracerProvider.resourceg   sZ    YY$--):;}}-- Y ??$6$C$CT[[E]E]#^_ YYs   0B	8B		Bc                    | j                   5  t        | j                  t              r$| j                  j	                  |      cd d d        S 	 d d d        y# 1 sw Y   y xY w)NT)r4   rP   r0   rQ   force_flush)r:   timeout_milliss     r=   r]   zProxyTracerProvider.force_flushn   s@    YY$--):;}}00@ Y  YYs   5AAAN)r0   rQ   rM   None)rB   strrM   r_   )
rA   r`   rI   r   rD   boolrJ   r   rM   rN   )rS   r   rM   r_   )rM   r_   )rM   r   )i0u  )r^   intrM   ra   )__name__
__module____qualname____doc____annotations__r   r   r3   r   r4   setr5   r>   rC   rH   rR   rU   propertyrX   r]    rL   r=   r/   r/   3   s    fEJ[lEmGBmt,D$,"'"<x<-1  $	#&  	
  
&A
)
 ` `rL   r/   F)eqc                      e Zd ZU dZded<   ded<   d ZdddZdd	Zdd
ZddZ	dddZ
	 	 d	 	 	 	 	 	 	 ddZddZddZ	 d	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 d dZd!dZesd"dZyy)#_LogfireWrappedSpanaf  A span that wraps another span and overrides some behaviors in a logfire-specific way.

    In particular:
    * Stores a reference to itself in `OPEN_SPANS`, used to close open spans when the program exits
    * Adds some logfire-specific tweaks to the exception recording behavior
    * Overrides end() to use a timestamp generator if one was provided
    r   spanzCallable[[], int]ns_timestamp_generatorc                .    t         j                  |        y r7   )r-   addrV   s    r=   __post_init__z!_LogfireWrappedSpan.__post_init__   s    trL   Nc                    t         j                  |        | j                  j                  |xs | j	                                y r7   )r-   discardrn   endro   )r:   end_times     r=   ru   z_LogfireWrappedSpan.end   s.    4 		h?$"="="?@rL   c                6    | j                   j                         S r7   )rn   get_span_contextrV   s    r=   rx   z$_LogfireWrappedSpan.get_span_context   s    yy))++rL   c                :    | j                   j                  |       y r7   )rn   set_attributes)r:   
attributess     r=   rz   z"_LogfireWrappedSpan.set_attributes   s    		  ,rL   c                <    | j                   j                  ||       y r7   )rn   set_attribute)r:   keyvalues      r=   r}   z!_LogfireWrappedSpan.set_attribute   s    		U+rL   c                :    | j                   j                  ||      S r7   )rn   add_link)r:   r   r{   s      r=   r   z_LogfireWrappedSpan.add_link   s    yy!!':66rL   c                b    | j                   j                  |||xs | j                                y r7   )rn   	add_eventro   )r:   namer{   	timestamps       r=   r   z_LogfireWrappedSpan.add_event   s(     			D*i.X4;V;V;XYrL   c                :    | j                   j                  |       y r7   )rn   update_namer:   r   s     r=   r   z_LogfireWrappedSpan.update_name   s    		d#rL   c                6    | j                   j                         S r7   )rn   is_recordingrV   s    r=   r   z _LogfireWrappedSpan.is_recording   s    yy%%''rL   c                <    | j                   j                  ||       y r7   )rn   
set_status)r:   statusdescriptions      r=   r   z_LogfireWrappedSpan.set_status   s    
 			V[1rL   c                `    |xs | j                         }t        | j                  ||||       y )Nr{   r   escaped)ro   record_exceptionrn   )r:   	exceptionr{   r   r   s        r=   r   z$_LogfireWrappedSpan.record_exception   s-     >!<!<!>	I*PYcjkrL   c                    | j                         r4t        |t              r| j                  |d       | j	                          y y )NT)r   )r   rP   BaseExceptionr   ru   )r:   exc_type	exc_value	tracebacks       r=   __exit__z_LogfireWrappedSpan.__exit__   s9    )]3%%i%>HHJ rL   c                .    t        | j                  |      S r7   )getattrrn   r   s     r=   __getattr__z_LogfireWrappedSpan.__getattr__   s    499d++rL   r7   )rv   
int | NonerM   r_   )rM   r   )r{   z$dict[str, otel_types.AttributeValue]rM   r_   )r~   r`   r   zotel_types.AttributeValuerM   r_   )r   r   r{   otel_types.AttributesrM   r_   )NN)r   r`   r{   r   r   r   rM   r_   )r   r`   rM   r_   )rM   ra   )r   zStatus | StatusCoder   z
str | NonerM   r_   )NNF)
r   r   r{   r   r   r   r   ra   rM   r_   )r   ztype[BaseException] | Noner   zBaseException | Noner   r   rM   r_   )r   r`   rM   r   )rc   rd   re   rf   rg   rr   ru   rx   rz   r}   r   r   r   r   r   r   r   r   r   rj   rL   r=   rm   rm   u   s     J--A,-,7 -1 $	ZZ *Z 	Z
 
Z$( #'2#2  2 
	2 -1 $l l *l 	l
 l 
l 	, rL   rm   c                      e Zd ZU dZded<   ded<   ded<   ded	<   dd
ZddZddZdej                  dddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ
ej                  Zy)rN   zJA tracer that wraps another internal tracer allowing it to be re-assigned.r`   rA   r   r;   r/   r0   ra   rD   c                    t        |       S r7   )idrV   s    r=   __hash__z_ProxyTracer.__hash__   s    $xrL   c                
    || u S r7   rj   )r:   others     r=   __eq__z_ProxyTracer.__eq__   s    }rL   c                    || _         y r7   )r;   )r:   r;   s     r=   r9   z_ProxyTracer.set_tracer   s	    rL   NTc	                   |xs. | j                   j                  j                  j                         }i |xs i }| j                  r	d|t
        <   |j                  t        |       | j                  j                  ||||||||      }	t        |	j                         |      st        j                  t        |	j                         j                  |	j                         j                   dt        j"                  |	j                         j$                  t        j"                  j&                   z                    }	t)        |	| j                   j                  j                  j                        S )Nrn   Ftrace_idspan_id	is_remotetrace_flags)ro   )r0   r1   advancedro   rD   r&   
setdefaultr#   r;   
start_spanshould_samplerx   	trace_apir   r   r   r   
TraceFlagsr   SAMPLEDrm   )
r:   r   r   kindr{   links
start_timer   set_status_on_exceptionrn   s
             r=   r   z_ProxyTracer.start_span   s7     Y4==#7#7#@#@#W#W#Y
 ,)r+
39J/04d;{{%%'4UJ@PRi
 T224jA--!224== 113;;# ) 4 4--/;;y?S?S?[?[>[[!		D ##'==#7#7#@#@#W#W
 	
rL   )rM   rb   )r   objectrM   ra   )r;   r   rM   r_   )r   r`   r   Context | Noner   r   r{   r   r   zSequence[Link] | Noner   r   r   ra   r   ra   rM   r   )rc   rd   re   rf   rg   r   r   r9   r   INTERNALr   	SDKTracerstart_as_current_spanrj   rL   r=   rN   rN      s    T""N!! #'!**,0'+!%!%(,%
%
  %
 	%

 *%
 %%
 %
 %
 "&%
 
%
R &;;rL   rN   c                  .    e Zd ZdddZej
                  Zy)rG   Nc                F    t        t        |      j                               S r7   )r   r   rx   )r:   r   r   rI   rJ   s        r=   r   zSuppressedTracer.start_span   s       0 9 J J LMMrL   r7   )
r   r`   r   r   rI   r   rJ   r   rM   r   )rc   rd   re   r   r   r   rj   rL   r=   rG   rG      s    N &;;rL   rG   c                  <    e Zd ZU dZded<   ded<   	 d	 	 	 	 	 d	dZy)
PendingSpanProcessora  Span processor that emits an extra pending span for each span as it starts.

    The pending span is emitted by calling `on_end` on the inner `processor`.
    This is intentionally not a `WrapperSpanProcessor` to avoid the default implementations of `on_end`
    and `shutdown`. This processor is expected to contain processors which are already included
    elsewhere in the pipeline where `on_end` and `shutdown` are called normally.
    r   id_generatorr   	processorNc                   t        |t              rt        |t              sJ |j                         sy |j                  }|r|j                  t              dk(  ry |j                         }t        ||      sy t        |j                  | j                  j                         d|j                        }i |t        dt        t        j                   |j"                  r|j"                  j$                  nd      i}|j&                  }t        |j(                  t*        z   |||j,                  ||j.                  |j0                  |j2                  |j4                  |||j6                        }| j8                  j;                  |       y )NlogFr   pending_spanr   )r   r   parentrX   r{   eventsr   r   r   r   rv   instrumentation_scope)rP   r   r   r   r{   getr&   rx   r   r   r   r   generate_span_idr   r$   r   format_span_idr   r   r   r   r(   rX   r   r   r   r   r   r   on_end)r:   rn   parent_contextr{   real_span_contextspan_contextstart_and_end_timer   s           r=   on_startzPendingSpanProcessor.on_start  sN   
 $-*T42HHH  "__
Z^^,DEN 113.
;
 "&//%%668)55	


$n 4Y5M5M'+{{##6

 "__#55 $]]!;;**;;)'"&"<"<
 	l+rL   r7   )rn   r   r   zcontext_api.Context | NonerM   r_   )rc   rd   re   rf   rg   r   rj   rL   r=   r   r   
  s;     
 6:4,4, 34, 
	4,rL   r   c                Z    t        |      }|du xs | j                  t        |dz        k  S )zwDetermine if a span should be sampled.

    This is used to sample spans that are not sampled by the OTEL sampler.
    Nl            )get_sample_rate_from_attributesr   round)r   r{   sample_rates      r=   r   r   N  s3    
 2*=K$T,"6"6%e@S:T"TTrL   c                F    | sy t        d| j                  t                    S )Nfloat | None)r   r   r%   )r{   s    r=   r   r   W  s    
/I JKKrL   r   c               &   |r&t        | |       | j                  t        d             i |xs i }t        Bt	        |t              r2	 |j                  d      }| j                  t        |       ||t        <   |t        j                         d   urLdj                  t        j                  t        |      ||j                              }||t         j"                  <   | j%                  ||||       y# t        $ r |j                         }Y w xY w)zMSimilar to the OTEL SDK Span.record_exception method, with our own additions.errorNF)include_urlr"    r   )set_exception_statusrz   r)   r,   rP   json	TypeErrorr}   r'   sysexc_infojoinr   format_exceptiontype__traceback__r   EXCEPTION_STACKTRACEr   )rn   r   r{   r   r   err_json
stacktraces          r=   r   r   ]  s     T9-09:'Z%2'J"z)_'M	( ~~%~8H 	:HE6>
23q)) WWY77YT]TkTklm
:D
>667)
iY`a  	( ~~'H	(s   C4 4DDc                    | j                  t        j                  t        j                  |j
                  j                   d|              y )Nz: )status_coder   )r   r   r   r    ERROR	__class__rc   )rn   r   s     r=   r   r     s@    OO"(($..7789+F	
rL   )r   r   r{   z'Mapping[str, otel_types.AttributeValue]rM   ra   )r{   r   rM   r   )rn   trace_api.Spanr   r   r{   r   r   r   r   ra   rM   r_   )rn   r   r   r   )Q
__future__r   r   r   dataclassesr   r   	threadingr   typingr   r   r	   r
   r   r   weakrefr   r   opentelemetry.tracetracer   opentelemetryr   context_apiopentelemetry.contextr   opentelemetry.sdk.resourcesr   opentelemetry.sdk.tracer   r   r   r   r   rQ   $opentelemetry.sdk.trace.id_generatorr   opentelemetry.semconv.resourcer   opentelemetry.semconv.tracer   r   r   r   r   r   opentelemetry.trace.propagationr   opentelemetry.trace.statusr   r    opentelemetry.utilr!   
otel_types	constantsr#   r$   r%   r&   r'   r(   r)   utilsr*   r1   r+   pydanticr,   ImportErrorr-   rg   r/   rm   rN   rG   r   r   r   r   r   rj   rL   r=   <module>r     s   " 
  (  H H . ' 0 ) 0  = = 6 k k k < 9 2   *%(
 ,39
( 4 >. > >B eG,).., G, G,T :<6 :< :<z	<v 	< @,= @, @,FUL 
 )- #b
#b#b &	#b
 #b #b 
#b #bLq
  Os   3E EE