
    g9              	         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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mZ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$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/m0Z0 d dl1m2Z2 d dl3m4Z4 erd dl5m6Z6 ee7e8e9   e9edz  f   e7d   f   Z:	  ed      Z;ee<e=e>e?ded   ed   df   Z@ee>e@f   ZA	 d dlBZBd:dZC ej                  d      ZFd;dZGd<dZH ede>eIdd       ZJd!d"d=d#ZKd>d$ZLd?d%ZM G d& d'e      ZNd@d(ZO G d) d*e/      ZPdAd+ZQdBd,ZRd-gZS	 eSj                  ej                         dCd.ZWe	d/        ZXd0 ZYdDd1ZZe	d2        Z[ ej                  e[      j                  Z^dEd3Z_dFd4Z`dGd5Za ed6d67       G d8 d9e'             Zby# eD$ r d:dZCY w xY w# eV$ r Y rw xY w)H    )annotationsN)contextmanager)	dataclass)Path)time)TracebackType)TYPE_CHECKINGAnyCallableDictListMappingSequenceTuple	TypedDictTypeVarUnion)contexttrace)Resource)EventReadableSpan)IdGenerator)InstrumentationScope)Status)types)RequestExceptionResponse)is_user_code)ulidVersion)NNNT	JsonValue)r$   .JsonDictc                H    t        j                  |       j                         S N)pydantic_coreto_jsondecodeobjs    L/var/www/openai/venv/lib/python3.12/site-packages/logfire/_internal/utils.py	dump_jsonr.   1   s    $$S)0022    c                0    t        j                  | d      S )N),:)
separators)jsondumpsr+   s    r-   r.   r.   -   s    zz#*55r/   logfirec                \    t               j                  t        fd| D              S )z3Remove duplicates from a sequence preserving order.c              3  >   K   | ]  }|v r |      r|  y wr'    ).0xseenseen_adds     r-   	<genexpr>z$uniquify_sequence.<locals>.<genexpr><   s     BCqT	Xa[Cs   	)setaddtuple)seqr<   r=   s    @@r-   uniquify_sequencerC   8   s$    5DxxHBCBBBr/   c                    	 t        |       }|r|S 	 dt        |       j                   dS # t        $ r d}Y +w xY w# t        $ r Y yw xY w)zVReturn some kind of non-empty string representation of an object, catching exceptions. <z object>z<unknown (repr failed)>)repr	Exceptiontype__name__)r,   results     r-   	safe_reprrL   ?   sb    c
 )49%%&h//    )()s   + < 99	AATruncatablez	list[Any]ztuple[Any, ...]z...)middlec                   t        | ||      S )z]Return a string at most max_length characters long, with `middle` in the middle if truncated.)
max_lengthrN   )truncate_sequence)srP   rN   s      r-   truncate_stringrS   S   s    Q:fEEr/   c               f    t        |       |k  r| S |t        |      z
  }|dz  }| d| |z   | | d z   S )zaReturn a sequence at with `len()` at most `max_length`, with `middle` in the middle if truncated.   N)len)rB   rP   rN   remaining_lengthhalfs        r-   rQ   rQ   X   sJ    
3x:
!CK/q Du:dUV,,r/   c                    t         j                  dk\  rddlm} nddlm} | j                  d      5 } ||      }ddd       |S # 1 sw Y   S xY w)zRead a TOML file and return the parsed data.

    It wraps the `tomllib.load` function from Python 3.11 or the `tomli.load` function from older versions.
    )      r   )loadrbN)sysversion_infotomllibr\   tomliopen)path	load_tomlfdatas       r-   read_toml_filerg   a   sG    
 7"-+	4A| 
 K 
 Ks   	AAc                      e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   y)ReadableSpanDicta=  A dictionary representation of a ReadableSpan.

    ReadableSpan is immutable, so making modified versions of it is inconvenient and slow.
    Converting a ReadableSpan to a ReadableSpanDict using span_to_dict makes it easier to modify.
    See `SpanProcessorWrapper.on_end` for an example of how this is useful.
    strnameztrace_api.SpanContext | Noner   parentzResource | Noneresourcez'Mapping[str, otel_types.AttributeValue]
attributeszSequence[Event]eventszSequence[trace_api.Link]linksztrace_api.SpanKindkindr   status
int | None
start_timeend_timezInstrumentationScope | Noneinstrumentation_scopeN)rJ   
__module____qualname____doc____annotations__r9   r/   r-   ri   ri   q   sO     I))((77##
N66r/   ri   c                (   t        | j                  | j                  | j                  | j                  | j
                  xs i | j                  | j                  | j                  | j                  | j                  | j                  | j                        S )zSee ReadableSpanDict.)rk   r   rl   rm   rn   ro   rp   rq   rr   rt   ru   rv   )ri   rk   r   rl   rm   rn   ro   rp   rq   rr   rt   ru   rv   )spans    r-   span_to_dictr}      sj    YY{{??(b{{jjYY{{??"88 r/   c                  >     e Zd ZdZd fdZddZedd       Z xZS )UnexpectedResponsez4An unexpected response was received from the server.c                B    t         |   d|j                   |       y )NzUnexpected response: )response)super__init__status_code)selfr   	__class__s     r-   r   zUnexpectedResponse.__init__   s%    01E1E0FGRZ[r/   c                   | j                   J 	 | j                   j                         }t        j                  |d      }| j                   j
                  }d| j                   j                   d|j                   d|j                   d| j                   j                   dt        |d	
       dS # t        $ r, 	 | j                   j                  }n# t        $ r d}Y nw xY wY w xY w)NrU   )indentz[binary data]zUnexpected response z

 u    —> z
body: x   )rP   zq
If the error persists, please contact us. (See https://logfire.pydantic.dev/docs/help/ for contact information.))
r   r4   r5   
ValueErrortextrequestr   methodurlrS   )r   	body_jsonbodyr   s       r-   __str__zUnexpectedResponse.__str__   s    }}(((	3**,I ::i2D--''"4==#<#<"=T~~a}F4==3L3L2M N$Tc:; <UU	
  	''}})) '&'	's5   B0 0	C%:CC%CC%CC%$C%c                D    |j                   t        dd      vr | |      y)zBLike the requests method, but raises a more informative exception.   i,  N)r   range)clsr   s     r-   raise_for_statusz#UnexpectedResponse.raise_for_status   s'     uS#6h- 7r/   )r   r   returnNone)r   rj   )	rJ   rw   rx   ry   r   r   classmethodr   __classcell__)r   s   @r-   r   r      s%    >\
(    r/   r   c                    | j                         r | j                         st        d|  d      y | j                  dd       | dz  }|j	                  d       y )NzData directory z exists but is not a directoryT)parentsexist_okz
.gitignore*)existsis_dirr   mkdir
write_text)data_dir	gitignores     r-   ensure_data_dir_existsr      sV     xj8VWXXNN4$N/<'Ir/   c                    	 ddl m}  ||       S # t        $ r& ddlm} 	 ddl m} n# t        $ r	 ddlm} Y nw xY wY 6w xY w)zReturn a packaging.version.Version object from a version string.

    We check if `packaging` is available, falling back to `setuptools._vendor.packaging` if it's not.
    r   r!   )packaging.versionr"   ImportError$setuptools._vendor.packaging.version)versionr"   s     r-   get_versionr      sM    
E-$ 7!  E@	E 2 	ED	EEs$    ?'?9?9??suppress_instrumentationc                 .    t        d t        D              S )zReturn True if the `suppress_instrumentation` context manager is currently active.

    This means that any logs/spans generated by logfire or OpenTelemetry will not be logged in any way.
    c              3  F   K   | ]  }t        j                  |        y wr'   )r   	get_value)r:   keys     r-   r>   z0is_instrumentation_suppressed.<locals>.<genexpr>   s     W1V#w  %1Vs   !)any%SUPPRESS_INSTRUMENTATION_CONTEXT_KEYSr9   r/   r-   is_instrumentation_suppressedr      s    
 W1VWWWr/   c               #  
  K   t        j                         } t        D ]  }t        j                  |d|       }  t        j                  |       }	 d t        j
                  |       y# t        j
                  |       w xY ww)zQContext manager to suppress all logs/spans generated by logfire or OpenTelemetry.TN)r   get_currentr   	set_valueattachdetach)new_contextr   tokens      r-   r   r      sb      %%'K4''T;? 5NN;'Euus   ABA) B)B  Bc                    	 t         j                  j                  dd      } t        | xr d| v      }|r t               5  t        j                  dt                      d d d        y # t        $ r d}Y Cw xY w# 1 sw Y   y xY w)NPYTEST_CURRENT_TESTrE   test_internal_exceptionFzCaught an internal error in Logfire. Your code should still be running fine, just with less telemetry. This is just logging the internal error.)exc_info)	osenvirongetboolrH   r   logger	exception_internal_error_exc_info)current_testreraises     r-   log_internal_errorr     s     zz~~&;R@|U(A(UV 	!	#7 ./	 	 	
 
$	#  
 
$	#s   1A)   A:)A76A7:Bc                    t        j                         } | \  }}}	 |}|r4|j                  r(|j                  j                  t        u r|j
                  }|rv|j                  rj|j                  j                  j                  t        j                  j                  k(  r/|j                  j                  j                  dk(  r|j
                  }t        j                         }|sJ |j                  }|r|j                  t        j                  u rt|j                  }|sJ |j                  t        u rF|j                  }|r|j                  j                  dk(  sJ |j                  }|sJ |j                  }n|j                  }|r\t        |j                        sGt        |||j                   |j"                        }|j                  }|rt        |j                        sGt%        d      D ]5  }|s n1t        |||j                   |j"                        }|j                  }7 |sJ |sJ |j'                  |      }|||fS # t(        $ r | cY S w xY w)z:Returns an exc_info tuple with a nicely tweaked traceback.inner__exit__)tb_nexttb_frametb_lasti	tb_linenorZ   )r^   r   r   f_code_HANDLE_INTERNAL_ERRORS_CODEr   co_filenamer   __code__co_nameinspectcurrentframef_backr   r   r   f_lastif_linenor   with_tracebackrH   )original_exc_infoexc_typeexc_valoriginal_tbtbframe_s          r-   r   r     s   $'LLN%6"Hg{:!"++"++"4"48T"TB ""...2I2I2U2UU""**g5 B $$&uU\\%7%@%@@LLEL5||;;!5!5!CCCu  L6rEEMM]b]k]klBLLE L6
 qArEEMM]b]k]klBLLE	  xw((,"$$ !  !s   GI  A I IIc               #  H   K   	 d  y # t         $ r t                Y y w xY wwr'   )rH   r   r9   r/   r-   handle_internal_errorsr   V  s"      s   "	 """c                V    | r'dt         j                  d<   dt         j                  d<   y y )Nz.*8OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST9OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE)r   r   )captures    r-   maybe_capture_server_headersr   a  s(    QU

MNRV

NO r/   c                $    | j                  d      S )N)z
 http sendz http receivez websocket sendz websocket receive)endswith)rk   s    r-   is_asgi_send_receive_span_namer   g  s    ==abbr/   c                 .    t        t               dz        S )Ni  )intr   r9   r/   r-   _default_ms_timestamp_generatorr   k  s    tv}r/   T)rG   eqc                  H    e Zd ZU dZdZded<   eZded<   	 ddZddZ	dd	Z
y
)SeededRandomIdGeneratoray  Generate random span/trace IDs from a seed for deterministic tests.

    Similar to RandomIdGenerator from OpenTelemetry, but with a seed.
    Set the seed to None for non-deterministic randomness.
    In that case the difference from RandomIdGenerator is that it's not affected by `random.seed(...)`.

    Trace IDs are 128-bit integers.
    Span IDs are 64-bit integers.
    r   rs   seedzCallable[[], int]_ms_timestamp_generatorc                    t        j                  | j                        | _         | j                  <t        t        d      r+t	        j
                  | j                   j                         y y y )Nregister_at_fork)after_in_child)randomRandomr   hasattrr   r   )r   s    r-   __post_init__z%SeededRandomIdGenerator.__post_init__  sK    mmDII.99-?!@t{{/?/?@ "Ar/   c                    | j                   j                  d      }|t        j                  k(  r/| j                   j                  d      }|t        j                  k(  r/|S )N@   )r   getrandbits	trace_apiINVALID_SPAN_ID)r   span_ids     r-   generate_span_idz(SeededRandomIdGenerator.generate_span_id  sM    ++))"-222kk--b1G 222r/   c                    t        | j                  | j                        }|t        j                  k(  r4t        | j                  | j                        }|t        j                  k(  r4|S r'   )r    r   r   r   INVALID_TRACE_ID)r   trace_ids     r-   generate_trace_idz)SeededRandomIdGenerator.generate_trace_id  sQ    T%A%AB)444DKK)E)EFH )444r/   N)r   r   r   r   )rJ   rw   rx   ry   r   rz   r   r   r   r  r  r9   r/   r-   r   r   o  s2     D*1P.P5A
r/   r   )r,   r$   r   rj   )rB   zSequence[T]r   ztuple[T, ...])r,   r
   r   rj   )rR   rj   rP   r   rN   rj   r   rj   )rB   rM   rP   r   rN   rM   r   rM   )rc   r   r   zdict[str, Any])r|   r   r   ri   )r   r   r   r   )r   rj   r   r"   )r   r   )r   
SysExcInfo)r   r   )rk   rj   r   r   r  )c
__future__r   r   r4   loggingr   r   r^   
contextlibr   dataclassesr   pathlibr   r   r   r   typingr	   r
   r   r   r   r   r   r   r   r   r   opentelemetryr   r   r   opentelemetry.sdk.resourcesr   opentelemetry.sdk.tracer   r   $opentelemetry.sdk.trace.id_generatorr   &opentelemetry.sdk.util.instrumentationr   opentelemetry.trace.statusr   opentelemetry.util
otel_typesrequestsr   r   logfire._internal.stack_infor   logfire._internal.ulidr    r   r"   rA   rI   BaseExceptionr  r#   r   floatrj   r   r$   r%   r(   r.   rH   	getLoggerr   rC   rL   bytesrM   rS   rQ   rg   ri   r}   r   r   r   r   append_SUPPRESS_INSTRUMENTATION_KEYAttributeErrorr   r   r   r   r   unwrapr   r   r   r   r   r   r9   r/   r-   <module>r"     s"   "    	  
 % !    p p p p 5 0 7 < G - 2 / 5 ')uT-0-QUAUUVX]^nXoopJ CL#uc4tK/@%HXBY[eef	Y	33 
		9	%C)" mS%>OP ?D F
- 7y 7,$ )  B< ) %
	)001V1VW
X 	 	
(>!B    .w~~.DENN Wc k  K
  666z  		s$   F5 >G 5	G GGG