o
    ùT·jW  ã                   @  s¸   d dl mZ d dlZd dlmZ zd dlmZmZmZ d dl	m
Z
mZmZ W n ey2   edƒd‚w 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mZ G dd„ dƒZdS )é    )ÚannotationsN)ÚSequence)ÚmetricsÚ	propagateÚtrace)ÚSpanKindÚStatusÚ
StatusCodezMThe `opentelemetry-api` package is required to use `OpenTelemetryMiddleware`.)Ú__version__)ÚURL)ÚMount)ÚASGIAppÚMessageÚReceiveÚScopeÚSendc                   @  s.   e Zd ZdZddddœddd„Zddd„ZdS )ÚOpenTelemetryMiddlewarea]  Create OpenTelemetry server spans for incoming HTTP requests.

    This middleware is experimental. Its API and emitted telemetry may change in minor
    releases without a deprecation period.

    Args:
        app: The ASGI application to wrap.
        excluded_urls: Regular expressions matched against the full request URL.
            Pass a comma-separated string or a sequence. By default, exclude no URLs.
        tracer_provider: Optional tracer provider. If omitted, use the global tracer provider.
        meter_provider: Optional meter provider. If omitted, use the global meter provider.
    © N)Úexcluded_urlsÚtracer_providerÚmeter_providerÚappr   r   ústr | Sequence[str]r   útrace.TracerProvider | Noner   úmetrics.MeterProvider | NoneÚreturnÚNonec                C  sX   || _ || _t|tƒr|rdd„ | d¡D ƒnd}tdd„ |D ƒƒ| _|p(t ¡ | _	d S )Nc                 S  s   g | ]}|  ¡ ‘qS r   )Ústrip©Ú.0Úpatternr   r   úe/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/starlette/middleware/opentelemetry.pyÚ
<listcomp>+   s    z4OpenTelemetryMiddleware.__init__.<locals>.<listcomp>ú,r   c                 s  s   � | ]}t  |¡V  qd S ©N)ÚreÚcompiler   r   r   r!   Ú	<genexpr>,   s   € z3OpenTelemetryMiddleware.__init__.<locals>.<genexpr>)
r   Ú_meter_providerÚ
isinstanceÚstrÚsplitÚtupleÚ_excluded_urlsr   Úget_tracer_providerÚ_tracer_provider)Úselfr   r   r   r   r   r   r!   Ú__init__    s   
z OpenTelemetryMiddleware.__init__Úscoper   Úreceiver   Úsendr   c                 ƒ  sª  �|d dks|  d¡r|  ||ˆ ¡I d H S d|d< �zµ| j}t|tjƒr3|  ||ˆ ¡I d H W |d= S t|d�‰t‡fdd„| jD ƒƒrR|  ||ˆ ¡I d H W |d= S |  dd	¡}| 	¡ }i }|  d
g ¡D ]\}}	| 
| d¡ ¡ g ¡ |	 d¡¡ qd||  dd	¡|  dd¡dœ}
||kr�||
d< ˆjr˜ˆj|
d< ˆjd urÁˆj|
d< |  d¡}ˆjd ur¯ˆjn	|d ur·|d nd }|d urÁ||
d< |  d¡rÌ|d |
d< |  d¡d urÛ|d d |
d< |  d¡rè|d d |
d< | dt¡j|t |¡tj|
d��Ã‰d+‡ ‡fd"d#„}zkz|  |||¡I d H  W n t�y& } z
ˆ d$t|ƒj¡ ‚ d }~ww W |  d%¡}t|tƒ�r<|  d&¡�p:d'}nt|d(d ƒ}t|tƒ�rV|  d&d	¡ d'¡| �pUd'nd }|d u�rmˆ  |› d)|› �¡ ˆ d*|¡ nG|  d%¡}t|tƒ�r‚|  d&¡�p€d'}nt|d(d ƒ}t|tƒ�rœ|  d&d	¡ d'¡| �p›d'nd }|d u�r´ˆ  |› d)|› �¡ ˆ d*|¡ w w W d   ƒ n1 �sÀw   Y  W |d= d S W |d= d S |d= w ),NÚtypeÚhttpzstarlette.opentelemetryT)r2   c                 3  s   � | ]
}|  tˆ ƒ¡V  qd S r$   )Úsearchr*   r   )Úurlr   r!   r'   :   s   € z3OpenTelemetryMiddleware.__call__.<locals>.<genexpr>ÚmethodÚ Úheaderszlatin-1ÚpathÚscheme)zhttp.request.methodzurl.pathz
url.schemezhttp.request.method_originalz	url.queryzserver.addressÚserveré   zserver.portÚhttp_versionznetwork.protocol.versionÚclientr   zclient.addressz
user-agentzuser_agent.originalÚ	starlette)ÚcontextÚkindÚ
attributesÚmessager   r   r   c                 “  s\   �| d dkr%| d }ˆ  d|¡ |dkr%ˆ  dt|ƒ¡ ˆ ttjƒ¡ ˆ | ƒI d H  d S )Nr5   zhttp.response.startÚstatuszhttp.response.status_codeiô  ú
error.type)Úset_attributer*   Ú
set_statusr   r	   ÚERROR)rF   Ústatus_code)r4   Úspanr   r!   Úsend_with_telemetrya   s   €z=OpenTelemetryMiddleware.__call__.<locals>.send_with_telemetryrH   ÚrouteÚ	root_pathú/Úpath_formatú z
http.route)rF   r   r   r   )!Úgetr   r/   r)   r   ÚNoOpTracerProviderr   Úanyr-   ÚupperÚ
setdefaultÚdecodeÚlowerÚappendÚqueryÚhostnameÚportÚ
get_tracerr
   Ústart_as_current_spanr   Úextractr   ÚSERVERÚ	ExceptionrI   r5   Ú__qualname__r   Úgetattrr*   ÚrstripÚupdate_name)r0   r2   r3   r4   r   Úoriginal_methodr9   r;   ÚnameÚvaluerE   r>   Úserver_portrN   ÚexcrO   Ú
route_pathrR   r   )r4   rM   r8   r!   Ú__call__/   sª   €G
»C¿$

ý



$

ü	€þÿ
ÿ€ý
€
ôÿ€ý
þ€ à
$Ü$z OpenTelemetryMiddleware.__call__)
r   r   r   r   r   r   r   r   r   r   )r2   r   r3   r   r4   r   r   r   )Ú__name__Ú
__module__rd   Ú__doc__r1   rn   r   r   r   r!   r      s    úr   )Ú
__future__r   r%   Úcollections.abcr   Úopentelemetryr   r   r   Úopentelemetry.tracer   r   r	   ÚImportErrorrB   r
   Ústarlette.datastructuresr   Ústarlette.routingr   Ústarlette.typesr   r   r   r   r   r   r   r   r   r!   Ú<module>   s    
ÿ