o
    i                     @  s   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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mZmZmZ dd
lmZ erPddlmZ ee
ejj Zd!ddZG dd deddZ d"ddZ!d#dd Z"dS )$    )annotationsN)AbstractContextManagercontextmanager)Path)CoroutineType)TYPE_CHECKINGAny   )ONE_SECOND_IN_NANOSECONDS)	StackInfoget_code_object_infoget_stack_info_from_frame)	safe_repr)Logfirelogfirer   slow_durationfloatreturnAbstractContextManager[None]c                   s\   t jjj jdd  jjjt9 d fdd}|t jj_t	fd	d
}| S )zLog a warning whenever a function running in the asyncio event loop blocks for too long.

    See Logfire.log_slow_async_callbacks.
    Inspired by https://gitlab.com/quantlane/libs/aiodebug.
    asyncio)custom_scope_suffixselfasyncio.events.Handler   r   c                   s    }| } | }|krDz|t  }| j} j	dd|it| W |S  tyC   z	 d W Y |S  tyB   Y Y |S w w |S )N/Async {name} blocked for {duration:.3f} secondsdurationzError in log_slow_callbacks)r   )r
   	_callbackwarn_callback_attributes	Exception	exception)r   
start_timereturn_valuer   callbackr   original_runr   timer ^/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/logfire/_internal/async_.pypatched_run!   s2   
z'log_slow_callbacks.<locals>.patched_runc                   3  s&    zd V  W  t jj_d S  t jj_w N)r   eventsHandle_runr&   )r$   r&   r'   patch_context9   s   z)log_slow_callbacks.<locals>.patch_contextN)r   r   r   r   )
r   r*   r+   r,   with_settingsconfigadvancedns_timestamp_generatorr
   r   )r   r   r(   r-   r&   r#   r'   log_slow_callbacks   s   


	r2   c                   @  s   e Zd ZU ded< ded< dS )_CallbackAttributesstrnamezlist[StackInfo]stackN)__name__
__module____qualname____annotations__r&   r&   r&   r'   r3   F   s   
 r3   F)totalcoroCoroutineType[Any, Any, Any]r   c                 C  s   | j  }r	t|S t| jS r)   )cr_framer   r   cr_code)r<   framer&   r&   r'   stack_info_from_coroutineK   s   

rA   r"   r   c           	      C  s>  t | dd }t|tjjri| }dd|  i}t|ts!|S t|}i ||}|	d }r>|d  d| d7  < |g}t|j
 }trct|}|	ddts[|| t|j
 }tsI||d	< |S t| } i }t | d
d }|r~i t|}t | ddpt | ddp|	dd}|pt| }d| |d< |S )N__self__r5   ztask zcode.functionz ()zcode.filepath r6   __code__r9   r7   z	callback )getattr
isinstancer   tasksTaskget_coroget_namer   rA   getcr_await
startswithASYNCIO_PATHappendinspectunwrapr   r   )	r"   taskr<   result
stack_infofunction_namer6   coder5   r&   r&   r'   r   T   s8   


"r   )r   r   r   r   r   r   )r<   r=   r   r   )r"   r   r   r3   )#
__future__r   r   asyncio.eventsasyncio.tasksrQ   
contextlibr   r   pathlibr   typesr   typingr   r   	constantsr
   rU   r   r   r   utilsr   mainr   r4   __file__parentabsoluterO   r2   r3   rA   r   r&   r&   r&   r'   <module>   s&    
0
	