
    g'                    >   d dl m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mZ d dlmZmZmZ d dl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 m!Z! ddl"m#Z#  G d de      Z$ddZ% G d d      Z& G d de#      Z' G d de(      Z)y)    )annotationsN)deque)cached_property)Path)mkdtemp)LockThread)AnyMappingSequence)ReadableSpan)SpanExportResult)Session   )STACK_INFO_KEYS)loggertruncate_string   )WrapperSpanExporterc                  J     e Zd ZdZd fdZd fdZedd       Zd	dZ xZ	S )
OTLPExporterHttpSessionzA requests.Session subclass that raises a BodyTooLargeError if the request body is too large.

    Also defers failed requests to a DiskRetryer.
    c               2    t        |   |i | || _        y N)super__init__max_body_size)selfr   argskwargs	__class__s       U/var/www/openai/venv/lib/python3.12/site-packages/logfire/_internal/exporters/otlp.pyr   z OTLPExporterHttpSession.__init__    s    $)&)*    c                    | j                  t        |             	 t        |   |fd|i|}t	        |       |S # t
        j                  j                  $ r" | j                  j                  |d|i|        w xY w)Ndataurl)
_check_body_sizelenr   postraise_for_retryable_statusrequests
exceptionsRequestExceptionretryeradd_task)r   r%   r$   r   responser    s        r!   r(   zOTLPExporterHttpSession.post$   s    c$i(	w|C=d=f=H&x0   ""33 	 LL!!$(>v(>?	s	   < ?A;c                ,    t        | j                        S r   )DiskRetryerheaders)r   s    r!   r-   zOTLPExporterHttpSession.retryer:   s     4<<((r"   c                N    || j                   kD  rt        || j                         y r   )r   BodyTooLargeError)r   sizes     r!   r&   z(OTLPExporterHttpSession._check_body_size@   s(    $$$$#D$*<*<== %r"   )r   r
   r   intr   r
   returnNone)r%   strr$   bytesr   r
   )r7   r1   )r5   r6   r7   r8   )
__name__
__module____qualname____doc__r   r(   r   r-   r&   __classcell__r    s   @r!   r   r      s+    
+, ) )
>r"   r   c                `    | j                   dv s| j                   dk\  r| j                          y y )N)i  i  i  )status_coderaise_for_status)r/   s    r!   r)   r)   E   s1     z)X-A-AS-H!!# .Ir"   c                  8    e Zd ZdZdZdZdZd
dZddZd Z	d Z
y	)r1   zcRetries requests failed by OTLPExporterHttpSession, saving the request body to disk to save memory.     <   c                   t               | _        d | _        t               | _        t               | _        | j                  j                  j                  |       t        t        d            | _        t        d       | _        y )Nzlogfire-retryer-)prefixinf)r   lockthreadr   tasksr   sessionr2   updater   r   dirfloatlast_log_time)r   r2   s     r!   r   zDiskRetryer.__init__]   s`    F	%)9>

 y##G, '9:;#El]r"   c                d   	 t        | j                        | j                  k\  r:| j                         r)t	        j
                  dt        | j                               y | j                  t        j                         j                  z  }|j                  |       | j                  5  | j                  j                  ||f       | j                  r| j                  j                         s6t        | j                   d      | _        | j                  j#                          t        | j                        }d d d        | j                         rt	        j$                  d       y y # 1 sw Y   1xY w# t&        $ r5}| j                         rt	        j
                  d|       Y d }~y Y d }~y d }~ww xY w)Nz6Already retrying %s failed exports, dropping an exportT)targetdaemonz&Currently retrying %s failed export(s)zExport and retry failed: %s)r'   rM   	MAX_TASKS_should_logr   errorrP   uuiduuid4hexwrite_bytesrK   appendrL   is_aliver	   _runstartwarning	Exception)r   r$   r   path	num_taskses         r!   r.   zDiskRetryer.add_taskn   s7   	?4::$..0##%LL!Y[^_c_i_i[jk 88djjl...DT"

!!4.1(<(<(> #)		$"GDKKK%%'

O	  !GS "   	?!:A>> "	?s8   AE1 AE1 &BE%5.E1 %E.*E1 1	F/:&F**F/c                    t        j                         | j                  z
  | j                  k\  }|rt        j                         | _        |S r   )time	monotonicrR   LOG_INTERVAL)r   results     r!   rW   zDiskRetryer._should_log   s;    !D$6$66$:K:KK!%!1Dr"   c                   d}	 | j                   5  | j                  sd | _        	 d d d        y | j                  j                         }d d d        	 \  }}|j	                         }	 t        j                  |dt        j                         z   z         	 t        j                         5   | j                  j                  di |d|i}d d d        t               d}|j                          	 # 1 sw Y   xY w# 1 sw Y   4xY w# t        j                  j                   $ r t#        |dz  | j$                        }Y nw xY w# t&        $ r( | j)                         rt+        j,                  d       Y w xY w)Nr   r$   r   zError retrying export )rK   rM   rL   popleft
read_bytesrg   sleeprandomlogfiresuppress_instrumentationrN   r(   r)   unlinkr*   r+   r,   min	MAX_DELAYrb   rW   r   	exception)r   delaytaskrc   r   r$   r/   s          r!   r_   zDiskRetryer._run   sD   zz"&DK	  zz))+ >#f( JJuFMMO(;<=$==?'8t||'8'8'M6'M'MH @28< !"? & @? $..?? ? #EAIt~~ >? &  >##%$$%<=>s_   C1C1AE D	 )!C=
D	 E 1C:=DD	 	6E?E EE .E76E7N)r2   zMapping[str, str | bytes])r$   r:   r   zdict[str, Any])r;   r<   r=   r>   ru   rV   ri   r   r.   rW   r_   rl   r"   r!   r1   r1   L   s.    m I I L+"?4%>r"   r1   c                  ,     e Zd ZdZd fdZddZ xZS )RetryFewerSpansSpanExporterzA SpanExporter that retries exporting spans in smaller batches if BodyTooLargeError is raised.

    This wraps another exporter, typically an OTLPSpanExporter using an OTLPExporterHttpSession.
    c                   	 t         |   |      S # t        $ r}t        |      dk(  r*| j	                  ||d          t
        j                  cY d }~S t        |      dz  }| j                  |d |       }| j                  ||d        }|t
        j                  us|t
        j                  urt
        j                  cY d }~S t
        j                  cY d }~S d }~ww xY w)Nr   r   r   )r   exportr4   r'   _log_too_large_spanr   FAILURESUCCESS)r   spansre   halfres1res2r    s         r!   r|   z"RetryFewerSpansSpanExporter.export   s    	,7>%((  
	,5zQ((E!H5'///u:?D;;uUd|,D;;uTU|,D+333tCSC[C[7['///#+++
	,s3    	C2CCA)C<CCCCc                   |j                   xs i }|j                  |j                  d}t        j                  t
              5  t        D ].  }||v s||   }t        |t              rt        |d      }|||<   0 	 d d d        t        j                  t
              5  |j                  t        |j                  d      t        |      t        |j                        t        |j                        t        d |j                  D              t        d |j                  D                     d d d        t!        j"                  di | y # 1 sw Y   xY w# 1 sw Y   +xY w)	N)r5   max_sizei,  )
max_lengthrF   c              3  N   K   | ]  }t        |j                  xs i         y wr   r'   
attributes).0events     r!   	<genexpr>zBRetryFewerSpansSpanExporter._log_too_large_span.<locals>.<genexpr>   s#     (^R]U-=-=-C)DR]   #%c              3  N   K   | ]  }t        |j                  xs i         y wr   r   )r   links     r!   r   zBRetryFewerSpansSpanExporter._log_too_large_span.<locals>.<genexpr>   s     'ZztDOO,Ar(Bzr   )	span_namenum_attributes
num_events	num_linksnum_event_attributesnum_link_attributes)z;Failed to export a span of size {size:,} bytes: {span_name})r   r5   r   
contextlibsuppressrb   r   
isinstancer9   r   rO   namer'   eventslinkssumrq   rX   )r   re   spanoriginal_attributesnew_attributeskeyvalues          r!   r}   z/RetryFewerSpansSpanExporter._log_too_large_span   s   "oo323&&ajj)Q  +&--/4E!%- /# F*/N3' ' ,   +!!)$))E"#67t{{+djj/%((^RVR]R](^%^$''Ztzz'Z$Z "  , 	fWef% ,+ ,+s   E)EBEEE )r   zSequence[ReadableSpan]r7   r   )re   r4   r   r   r7   r8   )r;   r<   r=   r>   r|   r}   r?   r@   s   @r!   rz   rz      s    
,gr"   rz   c                        e Zd Zd fdZ xZS )r4   c                N    t         |   d| d| d       || _        || _        y )NzRequest body is too large (z bytes), must be less than z bytes.)r   r   r5   r   )r   r5   r   r    s      r!   r   zBodyTooLargeError.__init__   s2    6tf<WX`Waahij	 r"   )r5   r6   r   r6   r7   r8   )r;   r<   r=   r   r?   r@   s   @r!   r4   r4      s    ! !r"   r4   )r/   zrequests.Response)*
__future__r   r   rp   rg   rY   collectionsr   	functoolsr   pathlibr   tempfiler   	threadingr   r	   typingr
   r   r   requests.exceptionsr*   opentelemetry.sdk.tracer   opentelemetry.sdk.trace.exportr   r   rq   
stack_infor   utilsr   r   wrapperr   r   r)   r1   rz   rb   r4   rl   r"   r!   <module>r      s|    "      %   " ) )  0 ;   ( + ((>g (>V$g> g>T+g"5 +g\!	 !r"   