o
    ©i™¿  ã                   @  s˜  d Z ddlmZ ddl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ZddlmZ dd	lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"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. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZF ddlGmHZHmIZI e JeK¡ZLejMeDdgdf ZNejMeDddgdf ZOejMeDdgejPejQ f ZRejMeDddgejPejQ f ZSG dd„ dejTƒZUG dd„ dejTƒZVdNdd „ZWdOd$d%„ZXdPd+d,„ZYd-d.„ ZZdQd2d3„Z[dRd;d<„Z\dSdBdC„Z]dTdFdG„Z^G dHdI„ dIej_ƒZ`G dJdK„ dKejaƒZbG dLdM„ dMe*ƒZcdS )Ua—  
Usage
-----

Instrumenting all clients
*************************

When using the instrumentor, all clients will automatically trace requests.

.. code-block:: python

    import httpx
    import asyncio
    from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor

    url = "https://example.com"
    HTTPXClientInstrumentor().instrument()

    with httpx.Client() as client:
        response = client.get(url)

    async def get(url):
        async with httpx.AsyncClient() as client:
            response = await client.get(url)

    asyncio.run(get(url))

Instrumenting single clients
****************************

If you only want to instrument requests for specific client instances, you can
use the `instrument_client` method.


.. code-block:: python

    import httpx
    import asyncio
    from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor

    url = "https://example.com"

    with httpx.Client() as client:
        HTTPXClientInstrumentor.instrument_client(client)
        response = client.get(url)

    async def get(url):
        async with httpx.AsyncClient() as client:
            HTTPXClientInstrumentor.instrument_client(client)
            response = await client.get(url)

    asyncio.run(get(url))

Uninstrument
************

If you need to uninstrument clients, there are two options available.

.. code-block:: python

    import httpx
    from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor

    HTTPXClientInstrumentor().instrument()
    client = httpx.Client()

    # Uninstrument a specific client
    HTTPXClientInstrumentor.uninstrument_client(client)

    # Uninstrument all clients
    HTTPXClientInstrumentor().uninstrument()


Using transports directly
*************************

If you don't want to use the instrumentor class, you can use the transport classes directly.


.. code-block:: python

    import httpx
    import asyncio
    from opentelemetry.instrumentation.httpx import (
        AsyncOpenTelemetryTransport,
        SyncOpenTelemetryTransport,
    )

    url = "https://example.com"
    transport = httpx.HTTPTransport()
    telemetry_transport = SyncOpenTelemetryTransport(transport)

    with httpx.Client(transport=telemetry_transport) as client:
        response = client.get(url)

    transport = httpx.AsyncHTTPTransport()
    telemetry_transport = AsyncOpenTelemetryTransport(transport)

    async def get(url):
        async with httpx.AsyncClient(transport=telemetry_transport) as client:
            response = await client.get(url)

    asyncio.run(get(url))

Request and response hooks
***************************

The instrumentation supports specifying request and response hooks. These are functions that get called back by the instrumentation right after a span is created for a request
and right before the span is finished while processing a response.

.. note::

    The request hook receives the raw arguments provided to the transport layer. The response hook receives the raw return values from the transport layer.

The hooks can be configured as follows:


.. code-block:: python

    from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor

    def request_hook(span, request):
        # method, url, headers, stream, extensions = request
        pass

    def response_hook(span, request, response):
        # method, url, headers, stream, extensions = request
        # status_code, headers, stream, extensions = response
        pass

    async def async_request_hook(span, request):
        # method, url, headers, stream, extensions = request
        pass

    async def async_response_hook(span, request, response):
        # method, url, headers, stream, extensions = request
        # status_code, headers, stream, extensions = response
        pass

    HTTPXClientInstrumentor().instrument(
        request_hook=request_hook,
        response_hook=response_hook,
        async_request_hook=async_request_hook,
        async_response_hook=async_response_hook
    )


Or if you are using the transport classes directly:


.. code-block:: python

    import httpx
    from opentelemetry.instrumentation.httpx import SyncOpenTelemetryTransport, AsyncOpenTelemetryTransport

    def request_hook(span, request):
        # method, url, headers, stream, extensions = request
        pass

    def response_hook(span, request, response):
        # method, url, headers, stream, extensions = request
        # status_code, headers, stream, extensions = response
        pass

    async def async_request_hook(span, request):
        # method, url, headers, stream, extensions = request
        pass

    async def async_response_hook(span, request, response):
        # method, url, headers, stream, extensions = request
        # status_code, headers, stream, extensions = response
        pass

    transport = httpx.HTTPTransport()
    telemetry_transport = SyncOpenTelemetryTransport(
        transport,
        request_hook=request_hook,
        response_hook=response_hook
    )

    async_transport = httpx.AsyncHTTPTransport()
    async_telemetry_transport = AsyncOpenTelemetryTransport(
        async_transport,
        request_hook=async_request_hook,
        response_hook=async_response_hook
    )

API
---
é    )ÚannotationsN)Úiscoroutinefunction)Úpartial)Údefault_timer)ÚTracebackType)Úwrap_function_wrapper)Ú#HTTP_DURATION_HISTOGRAM_BUCKETS_NEWÚ#HTTP_DURATION_HISTOGRAM_BUCKETS_OLDÚ_client_duration_attrs_newÚ_client_duration_attrs_oldÚ_filter_semconv_duration_attrsÚ_get_schema_urlÚ)_OpenTelemetrySemanticConventionStabilityÚ!_OpenTelemetryStabilitySignalTypeÚ_report_newÚ_report_oldÚ_set_http_host_clientÚ_set_http_methodÚ_set_http_net_peer_name_clientÚ"_set_http_network_protocol_versionÚ_set_http_peer_port_clientÚ_set_http_schemeÚ_set_http_status_codeÚ_set_http_urlÚ_set_statusÚ_StabilityMode©Ú_instruments)Ú__version__)ÚBaseInstrumentor)Úhttp_status_to_status_codeÚis_http_instrumentation_enabledÚunwrap)Ú	HistogramÚMeterProviderÚ	get_meter)Úinject)Ú
ERROR_TYPE)ÚNETWORK_PEER_ADDRESSÚNETWORK_PEER_PORT)ÚMetricInstruments)ÚHTTP_CLIENT_REQUEST_DURATION)ÚSpanKindÚTracerÚTracerProviderÚ
get_tracer)ÚSpan)Ú
StatusCode)Ú
redact_urlÚsanitize_methodÚRequestInfoÚResponseInfoc                   @  s6   e Zd ZU ded< ded< ded< ded< d	ed
< dS )r4   ÚbytesÚmethodz	httpx.URLÚurlúhttpx.Headers | NoneÚheadersz3httpx.SyncByteStream | httpx.AsyncByteStream | NoneÚstreamúdict[str, typing.Any] | NoneÚ
extensionsN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© rC   rC   úr/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/opentelemetry/instrumentation/httpx/__init__.pyr4     s   
 c                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )
r5   ÚintÚstatus_coder9   r:   z,httpx.SyncByteStream | httpx.AsyncByteStreamr;   r<   r=   Nr>   rC   rC   rC   rD   r5     s
   
 r7   ÚstrÚreturnc                 C  s   t |  ¡ ƒ} | dkrd} | S )NÚ_OTHERÚHTTP)r3   Ústrip)r7   rC   rC   rD   Ú_get_default_span_name#  s   rL   r:   r9   úhttpx.Headersc                 C  s
   t  | ¡S ©N)ÚhttpxÚHeaders)r:   rC   rC   rD   Ú_prepare_headers+  s   
rQ   Úargsútuple[typing.Any, ...]Úkwargsúdict[str, typing.Any]úytuple[bytes, httpx.URL, httpx.Headers | None, httpx.SyncByteStream | httpx.AsyncByteStream | None, dict[str, typing.Any]]c                 C  sÄ   t | d tjƒr#| d }|j ¡ }t t|jƒ¡}|j}|j	}|j
}n8| d }| d }| dt| ƒdkr8| d nd ¡}| dt| ƒdkrH| d nd ¡}| dt| ƒdkrX| d nd ¡}|||||fS )	Nr   é   r:   é   r;   é   r=   é   )Ú
isinstancerO   ÚRequestr7   ÚencodeÚURLrG   r8   r:   r;   r=   ÚgetÚlen)rR   rT   Úrequestr7   r8   r:   r;   r=   rC   rC   rD   Ú_extract_parameters/  s   	
  ÿrb   c                 C  s@   t | ƒ}t|ƒ t|d tjƒr|d }||_d S |j|d< d S )Nr   r:   )rQ   r&   r[   rO   r\   r:   Úraw)r:   rR   rT   Ú_headersra   rC   rC   rD   Ú_inject_propagation_headersM  s   
re   ÚresponseúWhttpx.Response | tuple[int, httpx.Headers, httpx.SyncByteStream, dict[str, typing.Any]]úctuple[int, httpx.Headers, httpx.SyncByteStream | httpx.AsyncByteStream, dict[str, typing.Any], str]c                 C  s\   t | tjƒr| j}| j}| j}| j}| j}n| \}}}}| dd¡j	ddd}|||||fS )NÚhttp_versions   HTTP/1.1ÚasciiÚignore)Úerrors)
r[   rO   ÚResponserF   r:   r;   r=   ri   r_   Údecode)rf   rF   r:   r;   r=   ri   rC   rC   rD   Ú_extract_responseW  s   
ÿro   Úspan_attributesÚmetric_attributesr8   ústr | httpx.URLÚmethod_originalÚsemconvr   c                 C  sÒ   t  |¡}t| |t|ƒ|ƒ t| tt|ƒƒ|ƒ t||t|ƒ|ƒ t|ƒr,t||j	|ƒ t
|ƒre|jrMt| |j|ƒ t||j|ƒ t||j|ƒ |j| t< |jrgt| |j|ƒ |j| t< t||j|ƒ d S d S d S rN   )rO   r^   r   r3   r   r2   rG   r   r   Úschemer   Úhostr   r   r(   Úportr   r)   )rp   rq   r8   rs   rt   rC   rC   rD   Ú(_apply_request_client_attributes_to_spanp  s<   
üüÿ

ðrx   Úspanr0   rF   rE   ri   c                 C  s‚   i }t |||ƒ t|ƒ}|  |¡ |tjkr t|ƒr t|ƒ|t< |r0t|ƒr0t|| 	dd¡|ƒ | 
¡ D ]
\}}|  ||¡ q4d S )NúHTTP/Ú )r   r    Ú
set_statusr1   ÚERRORr   rG   r'   r   ÚreplaceÚitemsÚset_attribute)ry   rF   ri   rt   rp   Úhttp_status_codeÚkeyÚvalrC   rC   rD   Ú)_apply_response_client_attributes_to_span¢  s&   ý

ýÿr„   úSpan | NoneÚNonec                 C  sD   t | ||t|ƒd|d |rt|ƒr t|| dd¡|ƒ dS dS dS )z/Apply response attributes to metric attributes.F)Úserver_spanÚsem_conv_opt_in_moderz   r{   N)r   rG   r   r   r~   )ry   rq   rF   ri   rt   rC   rC   rD   Ú,_apply_response_client_attributes_to_metricsÃ  s   	ú	
ýÿr‰   c                   @  sT   e Zd ZdZ				d#d$dd„Zd%dd„Z			d&d'dd„Zd(dd „Zd)d!d"„ZdS )*ÚSyncOpenTelemetryTransportaæ  Sync transport class that will trace all requests made with a client.

    Args:
        transport: SyncHTTPTransport instance to wrap
        tracer_provider: Tracer provider to use
        meter_provider: Meter provider to use
        request_hook: A hook that receives the span and request that is called
            right after the span is created
        response_hook: A hook that receives the span, request, and response
            that is called right before the span ends
    NÚ	transportúhttpx.BaseTransportÚtracer_providerúTracerProvider | NoneÚmeter_providerúMeterProvider | NoneÚrequest_hookúRequestHook | NoneÚresponse_hookúResponseHook | Nonec                 C  ó    t  ¡  t  tj¡| _t| jƒ}|| _tt	t
||d| _tt	t
||ƒ}d | _t| jƒr6|jtjddtd| _d | _t| jƒrH|jtddtd| _|| _|| _d S ©N©Úinstrumenting_library_versionr   Ú
schema_urlÚmsú2measures the duration of the outbound HTTP request©ÚnameÚunitÚdescriptionÚ#explicit_bucket_boundaries_advisoryÚsú!Duration of HTTP client requests.©r   Ú_initializeÚ(_get_opentelemetry_stability_opt_in_moder   rJ   Ú_sem_conv_opt_in_moder   Ú
_transportr/   r?   r   Ú_tracerr%   Ú_duration_histogram_oldr   Úcreate_histogramr*   ÚHTTP_CLIENT_DURATIONr	   Ú_duration_histogram_newr   r+   r   Ú_request_hookÚ_response_hook©Úselfr‹   r   r   r‘   r“   r™   ÚmeterrC   rC   rD   Ú__init__ê  sH   ÿ
üü
ü
ü
z#SyncOpenTelemetryTransport.__init__rH   c                 C  s   | j  ¡  | S rN   )r§   Ú	__enter__©r°   rC   rC   rD   r³     s   
z$SyncOpenTelemetryTransport.__enter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackúTracebackType | Noner†   c                 C  s   | j  |||¡ d S rN   )r§   Ú__exit__©r°   rµ   r·   r¹   rC   rC   rD   r»     s   z#SyncOpenTelemetryTransport.__exit__rR   ú
typing.AnyrT   úWtuple[int, httpx.Headers, httpx.SyncByteStream, dict[str, typing.Any]] | httpx.Responsec                 O  sh  t ƒ s| jj|i |¤ŽS t||ƒ\}}}}}| ¡ }t|ƒ}	i }
i }t|
|||| jƒ t|||||ƒ}| j	j
|	tj|
dì}d}t| jƒrK|  ||¡ t|||ƒ tƒ }z0z| jj|i |¤Ž}W n tyz } z|}t|ddƒ}W Y d}~nd}~ww W ttƒ | dƒ}n	ttƒ | dƒ}w t|tjtfƒrÅt|ƒ\}}}}}t||||| jƒ | ¡ r´t|||| jƒ t| jƒrÅ|  ||t||||ƒ¡ |ræ| ¡ ràt| jƒrà| t t!|ƒj"¡ t!|ƒj"|t < | #|j$¡‚| j%durt&|t't(t)j*ƒ}| j%j+tt,|d ƒdƒ|d | j-dur!t&|t't(t)j.ƒ}| j-j+||d W d  ƒ |S W d  ƒ |S 1 s-w   Y  |S )úAdd request info to span.©ÚkindÚ
attributesNrf   r   éè  ©rÂ   )/r!   r§   Úhandle_requestrb   rn   rL   rx   r¦   r4   r¨   Ústart_as_current_spanr,   ÚCLIENTÚcallabler­   re   r   Ú	ExceptionÚgetattrÚmaxr[   rO   rm   Útuplero   r‰   Úis_recordingr„   r®   r5   r   r€   r'   ÚtyperA   Úwith_tracebackÚ__traceback__r©   r   r   r
   r   ÚDEFAULTÚrecordÚroundr¬   rJ   ©r°   rR   rT   r7   r8   r:   r;   r=   rs   Ú	span_namerp   rq   Úrequest_infory   Ú	exceptionÚ
start_timerf   ÚexcÚelapsed_timerF   ri   Úduration_attrs_oldÚduration_attrs_newrC   rC   rD   rÅ   &  sÆ   	ÿûÿ
€þ€$ÿûü
ý
ÿ
ÿÿþüþüÿ
²Rõ
¹R®Rz)SyncOpenTelemetryTransport.handle_requestc                 C  s   | j  ¡  d S rN   )r§   Úcloser´   rC   rC   rD   rÝ   ˜  s   z SyncOpenTelemetryTransport.close©NNNN)
r‹   rŒ   r   rŽ   r   r   r‘   r’   r“   r”   )rH   rŠ   ©NNN)rµ   r¶   r·   r¸   r¹   rº   rH   r†   )rR   r½   rT   r½   rH   r¾   ©rH   r†   )	r?   r@   rA   Ú__doc__r²   r³   r»   rÅ   rÝ   rC   rC   rC   rD   rŠ   Ý  s    ú
/ü
	rrŠ   c                   @  sT   e Zd ZdZ				d$d%dd„Zd&dd„Z			d'd(dd„Zd)d d!„Zd*d"d#„ZdS )+ÚAsyncOpenTelemetryTransportaè  Async transport class that will trace all requests made with a client.

    Args:
        transport: AsyncHTTPTransport instance to wrap
        tracer_provider: Tracer provider to use
        meter_provider: Meter provider to use
        request_hook: A hook that receives the span and request that is called
            right after the span is created
        response_hook: A hook that receives the span, request, and response
            that is called right before the span ends
    Nr‹   úhttpx.AsyncBaseTransportr   rŽ   r   r   r‘   úAsyncRequestHook | Noner“   úAsyncResponseHook | Nonec                 C  r•   r–   r£   r¯   rC   rC   rD   r²   ©  sH   ÿ
üü
ü
ü
z$AsyncOpenTelemetryTransport.__init__rH   ú'AsyncOpenTelemetryTransport'c                 Ã  s   | j  ¡ I d H  | S rN   )r§   Ú
__aenter__r´   rC   rC   rD   rç   Ú  s   €z&AsyncOpenTelemetryTransport.__aenter__rµ   ú!typing.Type[BaseException] | Noner·   r¸   r¹   rº   r†   c                 Ã  s   | j  |||¡I d H  d S rN   )r§   Ú	__aexit__r¼   rC   rC   rD   ré   Þ  s   €z%AsyncOpenTelemetryTransport.__aexit__rR   r½   rT   úXtuple[int, httpx.Headers, httpx.AsyncByteStream, dict[str, typing.Any]] | httpx.Responsec                 Ï  s‚  t ƒ s| jj|i |¤ŽI dH S t||ƒ\}}}}}| ¡ }t|ƒ}	i }
i }t|
|||| jƒ t|||||ƒ}| j	j
|	tj|
dõ}d}t| jƒrR|  ||¡I dH  t|||ƒ tƒ }z3z| jj|i |¤ŽI dH }W n ty„ } z|}t|ddƒ}W Y d}~nd}~ww W ttƒ | dƒ}n	ttƒ | dƒ}w t|tjtfƒrÒt|ƒ\}}}}}t||||| jƒ | ¡ r¾t|||| jƒ t| jƒrÒ|  ||t||||ƒ¡I dH  |ró| ¡ rít| jƒrí| t t!|ƒj"¡ t!|ƒj"|t < | #|j$¡‚| j%durt&|t't(t)j*ƒ}| j%j+tt,|d ƒdƒ|d | j-dur.t&|t't(t)j.ƒ}| j-j+||d W d  ƒ |S W d  ƒ |S 1 s:w   Y  |S )r¿   NrÀ   rf   r   rÃ   rÄ   )/r!   r§   Úhandle_async_requestrb   rn   rL   rx   r¦   r4   r¨   rÆ   r,   rÇ   rÈ   r­   re   r   rÉ   rÊ   rË   r[   rO   rm   rÌ   ro   r‰   rÍ   r„   r®   r5   r   r€   r'   rÎ   rA   rÏ   rÐ   r©   r   r   r
   r   rÑ   rÒ   rÓ   r¬   rJ   rÔ   rC   rC   rD   rë   ç  sÐ   €ÿûÿ
ÿÿ€þ€$ÿûü

ý
ÿ
ÿÿþüþüÿ
®Võ
µVªVz0AsyncOpenTelemetryTransport.handle_async_requestc                 Ã  s   | j  ¡ I d H  d S rN   )r§   Úacloser´   rC   rC   rD   rì   [  s   €z"AsyncOpenTelemetryTransport.acloserÞ   )
r‹   rã   r   rŽ   r   r   r‘   rä   r“   rå   )rH   ræ   rß   )rµ   rè   r·   r¸   r¹   rº   rH   r†   )rR   r½   rT   r½   rH   rê   rà   )	r?   r@   rA   rá   r²   rç   ré   rë   rì   rC   rC   rC   rD   râ   œ  s    ú
1ü
	trâ   c                   @  sp   e Zd ZdZd6dd„Zd7dd	„Zd7d
d„Zed8dd„ƒZed9d&d'„ƒZ	e
	(	(	(	(d:d;d2d3„ƒZed<d4d5„ƒZd(S )=ÚHTTPXClientInstrumentorzQAn instrumentor for httpx Client and AsyncClient

    See `BaseInstrumentor`
    rH   útyping.Collection[str]c                 C  s   t S rN   r   r´   rC   rC   rD   Úinstrumentation_dependenciesf  s   z4HTTPXClientInstrumentor.instrumentation_dependenciesrT   r½   c                 K  s  |  d¡}|  d¡}|  d¡}|  d¡}|  d¡}t|ƒr|nd}|  d¡}t|ƒr,|nd}t ¡  t tj¡}t|ƒ}	tt	t
||	d}
tt	t
||	ƒ}d}t|ƒr[|jtjd	d
td}d}t|ƒrj|jtddtd}tddt| j|
|||||dƒ tddt| j|
|||||dƒ dS )aõ  Instruments httpx Client and AsyncClient

        Args:
            **kwargs: Optional arguments
                ``tracer_provider``: a TracerProvider, defaults to global
                ``meter_provider``: a MeterProvider, defaults to global
                ``request_hook``: A ``httpx.Client`` hook that receives the span and request
                    that is called right after the span is created
                ``response_hook``: A ``httpx.Client`` hook that receives the span, request,
                    and response that is called right before the span ends
                ``async_request_hook``: Async ``request_hook`` for ``httpx.AsyncClient``
                ``async_response_hook``: Async``response_hook`` for ``httpx.AsyncClient``
        r   r   r‘   r“   Úasync_request_hookNÚasync_response_hookr—   rš   r›   rœ   r¡   r¢   rO   zHTTPTransport.handle_request©ÚtracerÚduration_histogram_oldÚduration_histogram_newrˆ   r‘   r“   z'AsyncHTTPTransport.handle_async_request©ró   rô   rõ   rˆ   rð   rñ   )r_   r   r   r¤   r¥   r   rJ   r   r/   r?   r   r%   r   rª   r*   r«   r	   r   r+   r   r   r   Ú_handle_request_wrapperÚ_handle_async_request_wrapper)r°   rT   r   r   r‘   r“   rð   rñ   rˆ   r™   ró   r±   rô   rõ   rC   rC   rD   Ú_instrumenti  s’   




ÿý
ÿýÿüüüüùýùýz#HTTPXClientInstrumentor._instrumentc                 K  s   t tjdƒ t tjdƒ d S )NrÅ   rë   )r"   rO   ÚHTTPTransportÚAsyncHTTPTransport)r°   rT   rC   rC   rD   Ú_uninstrumentÇ  s   z%HTTPXClientInstrumentor._uninstrumentÚwrappedú typing.Callable[..., typing.Any]Úinstanceúhttpx.HTTPTransportrR   rS   rU   ró   r-   rô   r#   rõ   rˆ   r   r‘   ÚRequestHookr“   ÚResponseHookc
                 C  sD  t ƒ s
| |i |¤ŽS t||ƒ\}
}}}}|
 ¡ }t|ƒ}i }i }t|||||ƒ t|
||||ƒ}|j|tj|dÞ}d }t	|ƒrE|||ƒ t
|||ƒ tƒ }z.z	| |i |¤Ž}W n tyr } z|}t|dd ƒ}W Y d }~nd }~ww W ttƒ | dƒ}n	ttƒ | dƒ}w t|tjtfƒr¹t|ƒ\}}}}}t|||||ƒ | ¡ rªt||||ƒ t	|	ƒr¹|	||t||||ƒƒ |rÙ| ¡ rÓt|ƒrÓ| tt|ƒj¡ t|ƒj|t< | |j¡‚|d urót|t t!t"j#ƒ}|j$tt%|d ƒdƒ|d |d urt|t t!t"j&ƒ}|j$||d W d   ƒ |S W d   ƒ |S 1 sw   Y  |S ©NrÀ   rf   r   rÃ   rÄ   ©'r!   rb   rn   rL   rx   r4   rÆ   r,   rÇ   rÈ   re   r   rÉ   rÊ   rË   r[   rO   rm   rÌ   ro   r‰   rÍ   r„   r5   r   r€   r'   rÎ   rA   rÏ   rÐ   r   r   r
   r   rÑ   rÒ   rÓ   rJ   )rý   rÿ   rR   rT   ró   rô   rõ   rˆ   r‘   r“   r7   r8   r:   r;   r=   rs   rÕ   rp   rq   rÖ   ry   r×   rØ   rf   rÙ   rÚ   rF   ri   rÛ   rÜ   rC   rC   rD   r÷   Ë  sÂ   ÿûÿ
€þ€$ÿûüý
ÿÿþüþ
üÿ
´Põ
»P°Pz/HTTPXClientInstrumentor._handle_request_wrapperú2typing.Callable[..., typing.Awaitable[typing.Any]]úhttpx.AsyncHTTPTransportrð   ÚAsyncRequestHookrñ   ÚAsyncResponseHookc
                 Ã  sP  t ƒ s| |i |¤ŽI d H S t||ƒ\}
}}}}|
 ¡ }t|ƒ}i }i }t|||||ƒ t|
||||ƒ}|j|tj|dà}d }t	|ƒrL|||ƒI d H  t
|||ƒ tƒ }z1z| |i |¤ŽI d H }W n ty| } z|}t|dd ƒ}W Y d }~nd }~ww W ttƒ | dƒ}n	ttƒ | dƒ}w t|tjtfƒrÆt|ƒ\}}}}}t|||||ƒ | ¡ r´t||||ƒ t	|	ƒrÆ|	||t||||ƒƒI d H  |rß| ¡ rÙt|ƒrÙ| tt|ƒj¡ | |j¡‚|d urùt|t t!t"j#ƒ}|j$tt%|d ƒdƒ|d |d urt|t t!t"j&ƒ}|j$||d W d   ƒ |S W d   ƒ |S 1 s!w   Y  |S r  r  )rý   rÿ   rR   rT   ró   rô   rõ   rˆ   rð   rñ   r7   r8   r:   r;   r=   rs   rÕ   rp   rq   rÖ   ry   r×   rØ   rf   rÙ   rÚ   rF   ri   rÛ   rÜ   rC   rC   rD   rø   ?  sº   €ÿûÿ€þ€$ÿûü
ý
ÿüþ
üÿ
¶Nõ
½N²Nz5HTTPXClientInstrumentor._handle_async_request_wrapperNÚclientú httpx.Client | httpx.AsyncClientr   rŽ   r   r   ú%RequestHook | AsyncRequestHook | Noneú'ResponseHook | AsyncResponseHook | Noner†   c                 C  s¢  t |ddƒrt d¡ dS t ¡  t tj¡}t|ƒ}t	t
t||d}tt
t||ƒ}	d}
t|ƒr:|	jtjddtd}
d}t|ƒrI|	jtd	d
td}t|ƒrR|}d}nd}t|ƒr]|}d}nd}t|jdƒr–t|jdt| j||
||||dƒ |j ¡ D ]}t|dƒr’t|dt| j||
||||dƒ q{d|_t|jdƒrÏt|jdt| j||
||||dƒ |j ¡ D ]}t|dƒrÉt|dt| j||
||||dƒ q²d|_dS dS )a
  Instrument httpx Client or AsyncClient

        Args:
            client: The httpx Client or AsyncClient instance
            tracer_provider: A TracerProvider, defaults to global
            meter_provider: A MeterProvider, defaults to global
            request_hook: A hook that receives the span and request that is called
                right after the span is created
            response_hook: A hook that receives the span, request, and response
                that is called right before the span ends
        Ú!_is_instrumented_by_opentelemetryFz@Attempting to instrument Httpx client while already instrumentedNr—   rš   r›   rœ   r¡   r¢   rÅ   rò   Trë   rö   )rÊ   Ú_loggerÚwarningr   r¤   r¥   r   rJ   r   r/   r?   r   r%   r   rª   r*   r«   r	   r   r+   r   r   Úhasattrr§   r   r   r÷   Ú_mountsÚvaluesr  rø   )Úclsr	  r   r   r‘   r“   rˆ   r™   ró   r±   rô   rõ   rð   rñ   r‹   rC   rC   rD   Úinstrument_client²  sÚ   ÿÿüüüüùý
ùý€ùý
ùý€
ãz)HTTPXClientInstrumentor.instrument_clientc                 C  s|   t | jdƒrt| jdƒ | j ¡ D ]}t|dƒ qd| _dS t | jdƒr<t| jdƒ | j ¡ D ]}t|dƒ q/d| _dS dS )z‹Disables instrumentation for the given client instance

        Args:
            client: The httpx Client or AsyncClient instance
        rÅ   Frë   N)r  r§   r"   r  r  r  )r	  r‹   rC   rC   rD   Úuninstrument_client:  s   

üz+HTTPXClientInstrumentor.uninstrument_client)rH   rî   )rT   r½   )rý   rþ   rÿ   r   rR   rS   rT   rU   ró   r-   rô   r#   rõ   r#   rˆ   r   r‘   r  r“   r  )rý   r  rÿ   r  rR   rS   rT   rU   ró   r-   rô   r#   rõ   r#   rˆ   r   rð   r  rñ   r  rÞ   )r	  r
  r   rŽ   r   r   r‘   r  r“   r  rH   r†   )r	  r
  rH   r†   )r?   r@   rA   rá   rï   rù   rü   Ústaticmethodr÷   rø   Úclassmethodr  r  rC   rC   rC   rD   rí   _  s$    


^srú rí   )r7   rG   rH   rG   )r:   r9   rH   rM   )rR   rS   rT   rU   rH   rV   )rf   rg   rH   rh   )
rp   rU   rq   rU   r8   rr   rs   rG   rt   r   )ry   r0   rF   rE   ri   rG   rt   r   )ry   r…   rq   rU   rF   rE   ri   rG   rt   r   rH   r†   )drá   Ú
__future__r   ÚloggingÚtypingÚasyncior   Ú	functoolsr   Útimeitr   Útypesr   rO   Úwraptr   Ú&opentelemetry.instrumentation._semconvr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú+opentelemetry.instrumentation.httpx.packager   Ú+opentelemetry.instrumentation.httpx.versionr   Ú*opentelemetry.instrumentation.instrumentorr   Ú#opentelemetry.instrumentation.utilsr    r!   r"   Úopentelemetry.metricsr#   r$   r%   Úopentelemetry.propagater&   Ú1opentelemetry.semconv.attributes.error_attributesr'   Ú3opentelemetry.semconv.attributes.network_attributesr(   r)   Úopentelemetry.semconv.metricsr*   Ú*opentelemetry.semconv.metrics.http_metricsr+   Úopentelemetry.tracer,   r-   r.   r/   Úopentelemetry.trace.spanr0   Úopentelemetry.trace.statusr1   Úopentelemetry.util.httpr2   r3   Ú	getLoggerr?   r  ÚCallabler  r  Ú	AwaitableÚAnyr  r  Ú
NamedTupler4   r5   rL   rQ   rb   re   ro   rx   r„   r‰   ÚBaseTransportrŠ   ÚAsyncBaseTransportrâ   rí   rC   rC   rC   rD   Ú<module>   sd    @X
ÿÿ






2
! @ D