
    \j!                         d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dlm	Z	 d dl
Z
d dlmZ d dlmZmZmZ d dlmZmZ e	rd dlmZmZmZ d d	lmZ  G d
 ded         Zy)    N)defaultdict)datetimetimezone)TYPE_CHECKING)Batcher)EnvelopeItem
PayloadRef)format_timestampserialize_attribute)AnyCallableOptional)StreamedSpanc                       e Zd ZdZdZdZdZdZdZdZ		 	 	 	 	 	 dd	Z
dd
ZddZddZedddefd       Zedd       ZddeddfdZy)SpanBatcheri  i  i  P g      @spanz)application/vnd.sentry.items.span.v2+jsonreturnNc                    t        t              | _        t        d       | _        || _        || _        d| _        t        j                         | _	        t        j                         | _        t        j                         | _        t        j                         | _        t#               | _        d | _        d | _        t+        t,        d      r<t/        j0                  | j2                        dfd}t-        j4                  |       y y )Nc                       yNr    r       B/root/env/lib/python3.12/site-packages/sentry_sdk/_span_batcher.py<lambda>z&SpanBatcher.__init__.<locals>.<lambda>.       r   Tregister_at_forkc                  (            } |  |         y y )Nr   )method
weak_resets    r   _reset_in_childz-SpanBatcher.__init__.<locals>._reset_in_child@   s    #%H &r   )after_in_childr   N)r   list_span_buffer_running_size_capture_func_record_lost_func_running	threadingLock_locklocal_activetime	monotonic_last_full_flushEvent_flush_eventset_pending_flush_flusher_flusher_pidhasattrosweakref
WeakMethod_reset_thread_stater   )selfcapture_funcrecord_lost_funcr!   r    s       @r   __init__zSpanBatcher.__init__#   s     >I=N-8-C)!1^^%
*3//*;'+~~'7%OO-(+6:-1 2)* ++D,D,DEJ
 ? +r   c                 ^   t        t              | _        t        d       | _        d| _        t        j                         | _        t        j                         | _	        t        j                         | _        t        j                         | _        t               | _        d | _        d | _        y )Nc                       yr   r   r   r   r   r   z1SpanBatcher._reset_thread_state.<locals>.<lambda>I   r   r   T)r   r$   r%   r&   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   )r=   s    r   r<   zSpanBatcher._reset_thread_stateG   sv    '-(3^^%
 ( $ 0%OO-!e r   c                     d| j                   _        | j                  rt        j                         | j                  z  dz  }| j
                  j                  | j                  |z          | j
                  j                          | j                  d       t        j                         | j                  z
  | j                  |z   k\  r)| j                          t        j                         | _        | j                  ry y )NTg?)timeout)only_pending)r.   flagr)   randomFLUSH_WAIT_TIMEr3   waitclear_flushr/   r0   r1   )r=   jitters     r   _flush_loopzSpanBatcher._flush_loopV   s     mm]]_t';';;cAF""4+?+?&+H"I##%KKTK*  4#8#88''&01 (,(8% mmr   r   c                    t        | j                  dd      ry d| j                  _        	 | j                         r| j                  	 d| j                  _        y | j
                  5  t        | j                  |j                           }|| j                  k\  r/| j                  ddd       	 d d d        d| j                  _        y | j                  |j                     j                  |       | j                  |j                  xx   | j                  |      z  cc<   |dz   | j                  k\  s&| j                  |j                     | j                  k\  r(| j                   j#                  |j                         d}nd}d d d        r| j$                  j'                          d| j                  _        y # 1 sw Y   7xY w# d| j                  _        w xY w)NrF   FTqueue_overflowr      )reasondata_categoryquantity)getattrr.   rF   _ensure_threadr6   r,   lenr%   trace_idMAX_BEFORE_DROPr(   appendr&   _estimate_sizeMAX_BEFORE_FLUSHMAX_BYTES_BEFORE_FLUSHr5   addr3   r4   )r=   r   sizenotifys       r   r]   zSpanBatcher.addf   s    4<</ 	&&&(DMM,A6 !&DLL3  #4,,T]];<4///**/&,!" + 
  #2 !&DLL !!$--077=""4==1T5H5H5NN1 1H 5 55))$--8D<W<WW''++DMM:!F"F)#, !!%%' %DLL3# #2 !&DLLs7   G G &AF7-G B:F7$G 7G <G Gitemc                     d}| j                   j                         D ]=  }|dz  }t        |t              r|t	        |      z  }'|t	        t        |            z  }? |S )N   2   )_attributesvalues
isinstancestrrV   )r`   estimatevalues      r   rZ   zSpanBatcher._estimate_size   sa    
 %%,,. 	,ENH%%CJ&CE
O+	, r   c                    | j                   | j                  | j                  | j                  nd| j                  | j	                         | j
                  j                         d}| j                  r| j                  j                         |d<   | j                  r| j                  |d<   | j                  r:| j                  j                         D ci c]  \  }}|t        |       c}}|d<   |S c c}}w )Nz<unlabeled span>)rW   span_idnamestatus
is_segmentstart_timestampend_timestampparent_span_id
attributes)rW   rk   _name_status_is_segment_start_timestamp	timestamp
_timestamp_parent_span_idrd   itemsr   )r`   reskvs       r   _to_transport_formatz SpanBatcher._to_transport_format   s     ||"&**"8DJJ>Pll**,#44>>@!
 ??#'??#<#<#>C $($8$8C !8<8H8H8N8N8P!.4q!&q))!C 
	!s   C2rE   c                    | j                   5  |rt        | j                        }n#t        | j                  j	                               }| j                  j                          |s
	 d d d        y g }|D ]L  }| j                  j                  |      }|s"|d   j                         }t        dt        |      | j                        D ]  }t        || j                  z   t        |            }t        t        t        j                  t         j"                              |d      }	|	j%                  t'        | j(                  | j*                  d||z
  it-        dt        ||      D 
cg c]  }
| j/                  ||
          c}
i                   |j1                  |	        | j                  |= | j2                  |= O 	 d d d        D ]  }	| j5                  |	        y c c}
w # 1 sw Y   'xY w)Nr   )sent_attrace)headers
item_countrz   )json)typecontent_typer   payload)r,   r$   r5   r%   keysrJ   get_dynamic_sampling_contextrangerV   MAX_ENVELOPE_SIZEminr   r   r   nowr   utcadd_itemr	   TYPECONTENT_TYPEr
   r~   rY   r&   r'   )r=   rE   buckets	envelopes	bucket_idspansdscstartendenvelopejs              r   rK   zSpanBatcher._flush   s   ZZ 6	2t223 t005578%%'6	2 6	2 I$ (2	))--i8Ah88: #1c%j$2H2HI /Eed&<&<<c%jIC''7X\\8R'S%(! H %%!%)-):): ,cEk% %/$+16uc1B.&,- )-(A(A%((K.&&"%$ $$X.9/< %%i0&&y1Q(26	2p " 	)Hx(	).&U6	2 6	2s&   AG*/C7G*&G%AG*%G**G3)r>   zCallable[[Envelope], None]r?   zCallable[..., None]r   Nr#   )r   r   r   N)r`   r   r   r   )F)__name__
__module____qualname__r   r[   rX   r\   rH   r   r   r@   r<   rM   r]   staticmethodintrZ   r~   boolrK   r   r   r   r   r      s     O,OD>L"@2"@ 0"@ 
	"@H!9 (&T ^     .:)4 :)D :)r   r   r   )rG   r*   r/   collectionsr   r   r   r9   typingr   r:   sentry_sdk._batcherr   sentry_sdk.enveloper   r	   r
   sentry_sdk.utilsr   r   r   r   r   sentry_sdk.tracesr   r   r   r   r   <module>r      sH       # ' 	    ' : : B..._)'.) _)r   