o
    i*                     @  st  d dl m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	 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 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! d dl"Z"ddl#m$Z$m%Z% ddl&m'Z'm(Z( G dd deZ)G dd de!Z*d&ddZ+G dd dZ,G dd de(Z-G d d! d!e.Z/G d"d# d#e(Z0G d$d% d%e'Z1dS )'    )annotationsN)deque)MappingSequence)cached_property)Path)mkdtemp)LockThread)Any)OTLPSpanExporter)LogData)LogExportResult)ReadableSpan)SpanExportResult)Session   )loggerplatform_is_emscripten   )WrapperLogExporterWrapperSpanExporterc                      s>   e Zd ZdZd fddZd fd	d
Zd fddZ  ZS ) BodySizeCheckingOTLPSpanExporteri  P argsr   kwargsc                   s   t  j|i | d| _d S )Nr   )super__init___current_num_spans)selfr   r   	__class__ f/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/logfire/_internal/exporters/otlp.pyr   $   s   
z)BodySizeCheckingOTLPSpanExporter.__init__spansSequence[ReadableSpan]c                   s   t || _t |S N)lenr   r   exportr   r#   r   r!   r"   r'   (   s   
z'BodySizeCheckingOTLPSpanExporter.exportserialized_databytesc                   sB   | j dkrt|| jkrtt|| jt j|g|R i |S )Nr   )r   r&   max_body_sizeBodyTooLargeErrorr   _export)r   r)   r   r   r   r!   r"   r-   ,   s   z(BodySizeCheckingOTLPSpanExporter._export)r   r   r   r   )r#   r$   )r)   r*   r   r   r   r   )__name__
__module____qualname__r+   r   r'   r-   __classcell__r!   r!   r   r"   r      s
    r   c                      s0   e Zd ZdZd fdd	ZedddZ  ZS )OTLPExporterHttpSessionzIA requests.Session subclass that defers failed requests to a DiskRetryer.urlstrdatar*   r   r   c                   sX   zt  j|fd|i|}t| W |S  tjjy+   t s*| j|d|i|  w )Nr5   r3   )	r   postraise_for_retryable_statusrequests
exceptionsRequestExceptionr   retryeradd_task)r   r3   r5   r   responser   r!   r"   r6   8   s   
zOTLPExporterHttpSession.postreturnDiskRetryerc                 C  s
   t | jS r%   )r?   headers)r   r!   r!   r"   r;   O   s   
zOTLPExporterHttpSession.retryer)r3   r4   r5   r*   r   r   )r>   r?   )r.   r/   r0   __doc__r6   r   r;   r1   r!   r!   r   r"   r2   5   s
    r2   r=   requests.Responsec                 C  s$   | j dv s
| j dkr|   d S d S )N)i  i  i  )status_coderaise_for_status)r=   r!   r!   r"   r7   V   s   r7   c                   @  sB   e Zd ZdZdZdZdZdddZdddZdddZ	dd Z
dS )r?   zcRetries requests failed by OTLPExporterHttpSession, saving the request body to disk to save memory.   i  <   r@   Mapping[str, str | bytes]c                 C  sL   t  | _d | _t | _t | _| jj| t	t
dd| _td | _d S )Nzlogfire-retryer-)prefixinf)r	   lockthreadr   tasksr   sessionr@   updater   r   dirfloatlast_log_time)r   r@   r!   r!   r"   r   n   s   zDiskRetryer.__init__r5   r*   r   dict[str, Any]c              
   C  s  zjt | j| jkr|  rtdt | j W d S | jt j	 }|
| | j* | j||f | jr:| j sGt| jdd| _| j  t | j}W d    n1 sVw   Y  |  rhtd| W d S W d S  ty } z|  rtd| W Y d }~d S W Y d }~d S d }~ww )Nz6Already retrying %s failed exports, dropping an exportT)targetdaemonz&Currently retrying %s failed export(s)zExport and retry failed: %s)r&   rL   	MAX_TASKS_should_logr   errorrO   uuiduuid4hexwrite_bytesrJ   appendrK   is_aliver
   _runstartwarning	Exception)r   r5   r   path	num_taskser!   r!   r"   r<      s.   

	zDiskRetryer.add_taskr>   boolc                 C  s&   t  | j | jk}|rt  | _|S r%   )time	monotonicrQ   LOG_INTERVAL)r   resultr!   r!   r"   rV      s   
zDiskRetryer._should_logc                 C  s.  d}	 | j  | jsd | _	 W d    d S | j }W d    n1 s%w   Y  zY|\}}| }	 t|dt    z't	  | j
jdi |d|i}W d    n1 s\w   Y  t| W n tjjyy   t|d | j}Y nw d}|  nq4W n ty   |  rtd Y nw q)Nr   Tr5   r   zError retrying exportr!   )rJ   rL   rK   popleft
read_bytesrf   sleeprandomlogfiresuppress_instrumentationrM   r6   r7   r8   r9   r:   min	MAX_DELAYunlinkra   rV   r   	exception)r   delaytaskrb   r   r5   r=   r!   r!   r"   r^      sB   


zDiskRetryer._runN)r@   rG   )r5   r*   r   rR   )r>   re   )r.   r/   r0   rA   rq   rU   rh   r   r<   rV   r^   r!   r!   r!   r"   r?   ]   s    


r?   c                      "   e Zd ZdZd fddZ  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.
    r#   r$   r>   r   c                   s   zt  |W S  ty@   t|d }|dksJ | |d | }| ||d  }|tjus6|tjur;tj Y S tj Y S w )Nr   r   )r   r'   r,   r&   r   SUCCESSFAILURE)r   r#   halfres1res2r   r!   r"   r'      s   

z"RetryFewerSpansSpanExporter.exportr#   r$   r>   r   r.   r/   r0   rA   r'   r1   r!   r!   r   r"   rw      s    rw   c                      s   e Zd Zd fddZ  ZS )	r,   sizeintmax_sizer>   Nonec                   s*   t  d| d| d || _|| _d S )NzRequest body is too large (z bytes), must be less than z bytes.)r   r   r   r   )r   r   r   r   r!   r"   r      s   
zBodyTooLargeError.__init__)r   r   r   r   r>   r   )r.   r/   r0   r   r1   r!   r!   r   r"   r,      s    r,   c                      rv   )	QuietSpanExporterz]A SpanExporter that catches request exceptions to prevent OTEL from logging a huge traceback.r#   r$   r>   r   c                   ,   zt  |W S  tjjy   tj Y S w r%   )r   r'   r8   r9   r:   r   ry   r(   r   r!   r"   r'      
   
zQuietSpanExporter.exportr}   r~   r!   r!   r   r"   r          r   c                      s"   e Zd ZdZd fddZ  ZS )QuietLogExporterz\A LogExporter that catches request exceptions to prevent OTEL from logging a huge traceback.batchSequence[LogData]c                   r   r%   )r   r'   r8   r9   r:   r   ry   )r   r   r   r!   r"   r'      r   zQuietLogExporter.export)r   r   r~   r!   r!   r   r"   r      r   r   )r=   rB   )2
__future__r   rm   rf   rX   collectionsr   collections.abcr   r   	functoolsr   pathlibr   tempfiler   	threadingr	   r
   typingr   requests.exceptionsr8   5opentelemetry.exporter.otlp.proto.http.trace_exporterr   opentelemetry.sdk._logsr   (opentelemetry.sdk._logs._internal.exportr   opentelemetry.sdk.tracer   opentelemetry.sdk.trace.exportr   r   rn   utilsr   r   wrapperr   r   r   r2   r7   r?   rw   ra   r,   r   r   r!   r!   r!   r"   <module>   s:    
!j