o
    i                     @  s  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
 d dlmZ d dlmZmZmZmZ d dlmZ d d	lmZmZ erd d
lmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ e e!ef Z"eg ee e!ef  f Z#ee e!ef ged f Z$G dd deZ%eee e!ef gdf Z&G dd deddZ'd)ddZ(eG dd deZ)eG d d! d!eZ*ddd"d*d'd(Z+dS )+    )annotations)	dataclass)TYPE_CHECKINGAny)Context)OpenTelemetryMiddleware)Tracer)NonRecordingSpanSpanr   TracerProvider)get_current_span)is_asgi_send_receive_span_namemaybe_capture_server_headers)	Awaitable)r   CallableProtocol	TypedDict)r
   )Unpack)LogfireNc                   @  s   e Zd Zdd	d
ZdS )ASGIAppscopeScopereceiveReceivesendSendreturnAwaitable[None]c                 C  s   d S N )selfr   r   r   r   r   i/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/logfire/_internal/integrations/asgi.py__call__   s    zASGIApp.__call__N)r   r   r   r   r   r   r   r   )__name__
__module____qualname__r"   r   r   r   r!   r      s    r   c                   @  sN   e Zd ZU 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S )ASGIInstrumentKwargsz
str | Noneexcluded_urlsz-Callable[[Scope], tuple[str, dict[str, Any]]]default_span_detailszHook | Noneserver_request_hookclient_request_hookclient_response_hookzlist[str] | None#http_capture_headers_server_request$http_capture_headers_server_response$http_capture_headers_sanitize_fieldsN)r#   r$   r%   __annotations__r   r   r   r!   r&       s   
 r&   F)totallogfire_instancer   record_send_receiveboolr   r   c                 C  s   | j  }|r	|S t|S )zkIf record_send_receive is False, return a TracerProvider that skips spans for ASGI send and receive events.)configget_tracer_providerTweakAsgiTracerProvider)r1   r2   tracer_providerr   r   r!    tweak_asgi_spans_tracer_provider+   s   
r8   c                   @  s    e Zd ZU ded< ddd	Zd
S )r6   r   r7   argsr   kwargsr   r   c                 O  s   t | jj|i |S r   )TweakAsgiSpansTracerr7   
get_tracer)r    r9   r:   r   r   r!   r<   8   s   z"TweakAsgiTracerProvider.get_tracerN)r9   r   r:   r   r   r   )r#   r$   r%   r/   r<   r   r   r   r!   r6   4   s   
 r6   c                   @  s(   e Zd ZU ded< ddddZejZdS )r;   r   tracerNnamestrcontextContext | Noner9   r   r:   r   r
   c                 O  s4   t |rtt| S | jj||g|R i |S r   )r   r	   r   get_span_contextr=   
start_span)r    r>   r@   r9   r:   r   r   r!   rC   @   s   zTweakAsgiSpansTracer.start_spanr   )
r>   r?   r@   rA   r9   r   r:   r   r   r
   )r#   r$   r%   r/   rC   	SDKTracerstart_as_current_spanr   r   r   r!   r;   <   s   
 
r;   )r2   capture_headersapprF   r:   Unpack[ASGIInstrumentKwargs]c                K  s.   t | t|fi t| || j d|S )zInstrument `app` so that spans are automatically created for each request.

    See the `Logfire.instrument_asgi` method for details.
    )r7   meter_provider)r   r   r8   r4   get_meter_provider)r1   rG   r2   rF   r:   r   r   r!   instrument_asgiO   s   rK   )r1   r   r2   r3   r   r   )r1   r   rG   r   r2   r3   rF   r3   r:   rH   r   r   ),
__future__r   dataclassesr   typingr   r   opentelemetry.contextr   "opentelemetry.instrumentation.asgir   opentelemetry.sdk.tracer   rD   opentelemetry.tracer	   r
   r   opentelemetry.trace.propagationr   logfire._internal.utilsr   r   collections.abcr   r   r   r   typing_extensionsr   logfirer   dictr?   r   r   r   r   Hookr&   r8   r6   r;   rK   r   r   r   r!   <module>   s:    
	