o
    g                     @  sV  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mZmZmZmZ ddlmZ dd	lmZ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)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z; ddl<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddlFmGZG ddlHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR G dd de:eS ZTeT ZUG dd de;eS ZVeV ZWe,jXfddZYd>d'd(ZZd)d* Z[de,jXfd+d,Z\d?d0d1Z]d@d4d5Z^G d6d7 d7Z_e,jXfd8d9Z`e,jXfd:d;Zad<d= ZbdS )Aaa  
The opentelemetry-instrumentation-asgi package provides an ASGI middleware that can be used
on any ASGI framework (such as Django-channels / Quart) to track request timing through OpenTelemetry.

Usage (Quart)
-------------

.. code-block:: python

    from quart import Quart
    from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware

    app = Quart(__name__)
    app.asgi_app = OpenTelemetryMiddleware(app.asgi_app)

    @app.route("/")
    async def hello():
        return "Hello!"

    if __name__ == "__main__":
        app.run(debug=True)


Usage (Django 3.0)
------------------

Modify the application's ``asgi.py`` file as shown below.

.. code-block:: python

    import os
    from django.core.asgi import get_asgi_application
    from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware

    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'asgi_example.settings')

    application = get_asgi_application()
    application = OpenTelemetryMiddleware(application)


Usage (Raw ASGI)
----------------

.. code-block:: python

    from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware

    app = ...  # An ASGI application.
    app = OpenTelemetryMiddleware(app)


Configuration
-------------

Request/Response hooks
**********************

This instrumentation supports request and response hooks. These are functions that get called
right after a span is created for a request and right before the span is finished for the response.

- The server request hook is passed a server span and ASGI scope object for every incoming request.
- The client request hook is called with the internal span and an ASGI scope when the method ``receive`` is called.
- The client response hook is called with the internal span and an ASGI event when the method ``send`` is called.

For example,

.. code-block:: python

    def server_request_hook(span: Span, scope: dict[str, Any]):
        if span and span.is_recording():
            span.set_attribute("custom_user_attribute_from_request_hook", "some-value")

    def client_request_hook(span: Span, scope: dict[str, Any], message: dict[str, Any]):
        if span and span.is_recording():
            span.set_attribute("custom_user_attribute_from_client_request_hook", "some-value")

    def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, Any]):
        if span and span.is_recording():
            span.set_attribute("custom_user_attribute_from_response_hook", "some-value")

   OpenTelemetryMiddleware().(application, server_request_hook=server_request_hook, client_request_hook=client_request_hook, client_response_hook=client_response_hook)

Capture HTTP request and response headers
*****************************************
You can configure the agent to capture specified HTTP headers as span attributes, according to the
`semantic convention <https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#http-request-and-response-headers>`_.

Request headers
***************
To capture HTTP request headers as span attributes, set the environment variable
``OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST`` to a comma delimited list of HTTP header names.

For example,
::

    export OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST="content-type,custom_request_header"

will extract ``content-type`` and ``custom_request_header`` from the request headers and add them as span attributes.

Request header names in ASGI are case-insensitive. So, giving the header name as ``CUStom-Header`` in the environment
variable will capture the header named ``custom-header``.

Regular expressions may also be used to match multiple headers that correspond to the given pattern.  For example:
::

    export OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST="Accept.*,X-.*"

Would match all request headers that start with ``Accept`` and ``X-``.

To capture all request headers, set ``OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST`` to ``".*"``.
::

    export OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST=".*"

The name of the added span attribute will follow the format ``http.request.header.<header_name>`` where ``<header_name>``
is the normalized HTTP header name (lowercase, with ``-`` replaced by ``_``). The value of the attribute will be a
list containing the header values.

For example:
``http.request.header.custom_request_header = ["<value1>", "<value2>"]``

Response headers
****************
To capture HTTP response headers as span attributes, set the environment variable
``OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE`` to a comma delimited list of HTTP header names.

For example,
::

    export OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE="content-type,custom_response_header"

will extract ``content-type`` and ``custom_response_header`` from the response headers and add them as span attributes.

Response header names in ASGI are case-insensitive. So, giving the header name as ``CUStom-Header`` in the environment
variable will capture the header named ``custom-header``.

Regular expressions may also be used to match multiple headers that correspond to the given pattern.  For example:
::

    export OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE="Content.*,X-.*"

Would match all response headers that start with ``Content`` and ``X-``.

To capture all response headers, set ``OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE`` to ``".*"``.
::

    export OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE=".*"

The name of the added span attribute will follow the format ``http.response.header.<header_name>`` where ``<header_name>``
is the normalized HTTP header name (lowercase, with ``-`` replaced by ``_``). The value of the attribute will be a
list containing the header values.

For example:
``http.response.header.custom_response_header = ["<value1>", "<value2>"]``

Sanitizing headers
******************
In order to prevent storing sensitive data such as personally identifiable information (PII), session keys, passwords,
etc, set the environment variable ``OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS``
to a comma delimited list of HTTP header names to be sanitized.  Regexes may be used, and all header names will be
matched in a case-insensitive manner.

For example,
::

    export OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS=".*session.*,set-cookie"

will replace the value of headers such as ``session-id`` and ``set-cookie`` with ``[REDACTED]`` in the span.

Note:
    The environment variable names used to capture HTTP headers are still experimental, and thus are subject to change.

API
---
    )annotationsN)defaultdictwraps)default_timer)Any	AwaitableCallableDefaultDictTuple)guarantee_single_callable)contexttrace))_filter_semconv_active_request_count_attr_filter_semconv_duration_attrs_get_schema_url)_OpenTelemetrySemanticConventionStability!_OpenTelemetryStabilitySignalType_report_new_report_old'_server_active_requests_count_attrs_new'_server_active_requests_count_attrs_old_server_duration_attrs_new_server_duration_attrs_old_set_http_flavor_version_set_http_host_server_set_http_method_set_http_net_host_port_set_http_peer_ip_server_set_http_peer_port_server_set_http_scheme_set_http_target_set_http_url_set_http_user_agent_set_status_StabilityMode)ClientRequestHookClientResponseHookServerRequestHook)__version__)get_global_response_propagator)_start_internal_or_server_span)	get_meter)GetterSetter)"create_http_server_active_requests$create_http_server_request_body_size%create_http_server_response_body_size)MetricInstruments)HTTP_SERVER_REQUEST_DURATION)SpanAttributes)set_span_in_context)
9OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS8OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST9OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSESanitizeValue_parse_url_queryget_custom_headersnormalise_request_header_namenormalise_response_header_nameremove_url_credentialssanitize_methodc                   @  s    e Zd ZdddZdd
dZdS )
ASGIGettercarrierdictkeystrreturn!typing.Optional[typing.List[str]]c                   s8   | d}|s	dS     fdd|D }|sdS |S )a/  Getter implementation to retrieve a HTTP header value from the ASGI
        scope.

        Args:
            carrier: ASGI scope object
            key: header name in scope
        Returns:
            A list with a single string with the header value if it exists,
                else None.
        headersNc                   s(   g | ]\}}t |  krt |qS  )_decode_header_itemlower.0_key_valuerC   rH   b/var/www/visachat/venv/lib/python3.10/site-packages/opentelemetry/instrumentation/asgi/__init__.py
<listcomp>  s
    z"ASGIGetter.get.<locals>.<listcomp>)getrJ   )selfrA   rC   rG   decodedrH   rO   rP   rR     s   

zASGIGetter.gettyping.List[str]c                 C  s   | dpg }dd |D S )NrG   c                 S  s   g | ]\}}t |qS rH   )rI   rK   rH   rH   rP   rQ   )  s    z#ASGIGetter.keys.<locals>.<listcomp>)rR   )rS   rA   rG   rH   rH   rP   keys'  s   zASGIGetter.keysN)rA   rB   rC   rD   rE   rF   )rA   rB   rE   rU   )__name__
__module____qualname__rR   rV   rH   rH   rH   rP   r@   
  s    
r@   c                   @  s   e Zd Zddd	Zd
S )
ASGISetterrA   rB   rC   rD   valuerE   Nonec                 C  s8   | d}|sg }||d< ||  | g dS )aN  Sets response header values on an ASGI scope according to `the spec <https://asgi.readthedocs.io/en/latest/specs/www.html#response-start-send-event>`_.

        Args:
            carrier: ASGI scope object
            key: response header name to set
            value: response header value
        Returns:
            None
        rG   N)rR   appendrJ   encode)rS   rA   rC   r[   rG   rH   rH   rP   set0  s
   

zASGISetter.setN)rA   rB   rC   rD   r[   rD   rE   r\   )rW   rX   rY   r_   rH   rH   rH   rP   rZ   /  s    rZ   c                 C  s  t | \}}}| d}|r$|r$t|tr|d}|dtj| 7 }i }| d}|r3t||| |r;t	||| |rCt
||| | d}|rPt||| | d}	|	r_t||	|	|| |rnt|rnt|t|tj | dd}
|
rt||
t|
| t| d	}|rt|rd
||tj< t| d}|rt||d | d| v r| d durt|| dd | t|| dd | dd | D }|S )zyCollects HTTP request attributes from the ASGI scope and returns a
    dictionary to be used as span creation attributes.query_stringutf8?schemehttp_versionpathmethod host,z
user-agentr   clientN   c                 S  s   i | ]\}}|d ur||qS NrH   )rL   kvrH   rH   rP   
<dictcomp>  s    z.collect_request_attributes.<locals>.<dictcomp>)get_host_port_url_tuplerR   
isinstancebytesdecodeurllibparseunquoter    r   r   r   r!   r   r"   r>   r%   DEFAULTr   r?   asgi_getterjoinr4   HTTP_SERVER_NAMEr#   r   r   items)scopesem_conv_opt_in_modeserver_hostporthttp_urlr`   resultrc   flavorre   http_methodhttp_host_value_listhttp_user_agentrH   rH   rP   collect_request_attributesF  sn   







r   scope_or_response_messagedict[str, Any]sanitizer9   header_regexes	list[str]normalize_namesCallable[[str], str]rE   dict[str, list[str]]c                 C  sH   t t}| d}|r|D ]\}}|t| t| q||||S )a'  
    Returns custom HTTP request or response headers to be added into SERVER span as span attributes.

    Refer specifications:
     - https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#http-request-and-response-headers
    rG   )r   listrR   rI   r]   sanitize_header_values)r   r   r   r   rG   raw_headersrC   r[   rH   rH   rP   !collect_custom_headers_attributes  s   
r   c                 C  sl   |  dpddg}|d }|d t|dkrdt| nd }|  d	d}|  d
dd | | }|||fS )z%Returns (host, port, full_url) tuple.serverz0.0.0.0P   rk   r   80:rg   re   rc   httpz://)rR   rD   )r|   r   r   r~   	full_pathr   rH   rH   rP   rp     s   $
rp   c                 C  sP   t |}zt|}W n ty   d}Y nw |du ri }t| |||d|d dS )zEAdds HTTP response attributes to span using the status_code argument.NT)server_spanr}   )rD   int
ValueErrorr$   )spanstatus_codemetric_attributesr}   status_code_strrH   rH   rP   set_status_code  s    
r   r|   rB   Tuple[str, dict]c                 C  s^   |  dd }t|  dd }|dkrd}|r%|r%| d| i fS |r+|i fS |i fS )a  
    Default span name is the HTTP method and URL path, or just the method.
    https://github.com/open-telemetry/opentelemetry-specification/pull/3165
    https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/http/#name

    Args:
        scope: the ASGI scope dictionary
    Returns:
        a tuple of the span name, and any attributes to attach to the span.
    re   rg   rf   _OTHERHTTP )rR   stripr?   )r|   re   rf   rH   rH   rP   get_default_span_details  s   r   typing.Dict[str, typing.Any]typing.Optional[str]c                 C  s6   |  dd}|  d}t|dd}|r| | S dS )a
  
    Returns the target path as defined by the Semantic Conventions.

    This value is suitable to use in metrics as it should replace concrete
    values with a parameterized name. Example: /api/users/{user_id}

    Refer to the specification
    https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/semantic_conventions/http-metrics.md#parameterized-attributes

    Note: this function requires specific code for each framework, as there's no
    standard attribute to use.
    	root_pathrg   routepath_formatN)rR   getattr)r|   r   r   r   rH   rH   rP   _collect_target_attribute  s   
r   c                   @  s`   e Zd ZdZ													d#d$ddZd%ddZdd Zdd Zdd  Zd!d" Z	dS )&OpenTelemetryMiddlewarea  The ASGI application middleware.

    This class is an ASGI middleware that starts and annotates spans for any
    requests it is invoked with.

    Args:
        app: The ASGI application callable to forward requests to.
        default_span_details: Callback which should return a string and a tuple, representing the desired default span name and a
                      dictionary with any additional span attributes to set.
                      Optional: Defaults to get_default_span_details.
        server_request_hook: Optional callback which is called with the server span and ASGI
                      scope object for every incoming request.
        client_request_hook: Optional callback which is called with the internal span, and ASGI
                      scope and event which are sent as dictionaries for when the method receive is called.
        client_response_hook: Optional callback which is called with the internal span, and ASGI
                      scope and event which are sent as dictionaries for when the method send is called.
        tracer_provider: The optional tracer provider to use. If omitted
            the current globally configured one is used.
        meter_provider: The optional meter provider to use. If omitted
            the current globally configured one is used.
        exclude_spans: Optionally exclude HTTP `send` and/or `receive` spans from the trace.
    Nserver_request_hookr(   client_request_hookr&   client_response_hookr'   #http_capture_headers_server_requestlist[str] | None$http_capture_headers_server_response$http_capture_headers_sanitize_fieldsexclude_spans.list[typing.Literal['receive', 'send']] | Nonec                 C  s  t   t tj}t|| _|	d u rtjt	t
|t|dn|	| _|
d u r/tt	t
|t|dn|
| _d | _t|rD| jjtjddd| _d | _t|rU| jjtddd| _d | _t|rg| jjtjdd	d| _d | _t|rtt| j| _d | _t|r| jjtjdd
d| _d | _t|rt| j| _t| j| _ || _!|pt"| _#|| _$|| _%|| _&d | _'|| _(|pt)t*pd | _+|pt)t,pd | _-t.|pt)t/pg | _0|rd|v nd| _1|rd|v | _2d S d| _2d S )N)
schema_urlmsz/Measures the duration of inbound HTTP requests.)nameunitdescriptionz!Duration of HTTP server requests.s)r   r   r   Byz9measures the size of HTTP response messages (compressed).z8Measures the size of HTTP request messages (compressed).receiveFsend)3r   _initialize(_get_opentelemetry_stability_opt_in_moder   r   r   appr   
get_tracerrW   r)   r   tracerr,   meterduration_histogram_oldr   create_histogramr2   HTTP_SERVER_DURATIONduration_histogram_newr   r3   server_response_size_histogramHTTP_SERVER_RESPONSE_SIZE#server_response_body_size_histogramr1   server_request_size_histogramHTTP_SERVER_REQUEST_SIZE"server_request_body_size_histogramr0   r/   active_requests_counterexcluded_urlsr   default_span_detailsr   r   r   content_length_header_sem_conv_opt_in_moder;   r7   r   r8   r   r9   r6   r   exclude_receive_spanexclude_send_span)rS   r   r   r   r   r   r   tracer_providermeter_providerr   r   r   r   r   r   r}   rH   rH   rP   __init__  s   


	

z OpenTelemetryMiddleware.__init__r|   r   r   'Callable[[], Awaitable[dict[str, Any]]]r   +Callable[[dict[str, Any]], Awaitable[None]]rE   r\   c                   s  t  }|d dvr| |||I dH S t|\}}}| jr.| j|r.| |||I dH S | |\}}t|| j}	|	| t	| j
|d|t|	d\}
}t|	| j}|d dkr`| jd| z/tj|
dd`}| r|	 D ]
\}}||| qr|jtjjkr| jrt|| j| jtni }t|d	kr|| t| jr| || | |||}|  |||||	}| |||I dH  W d   n1 sw   Y  W |d dkr|t!|}|rt"|\}}t#|	|||| j t  | }t$|	t%j&}|r||t'j(< t$|	t%j)}| j*r| j*+t,t-|d
 d	| | j.r'| j.+t,|d	| | jd| | j/rJ| j0r>| j0+| j/| | j1rJ| j1+| j/| t2|d}|r|zt3|d	 }W n
 t4ye   Y nw | j5rq| j5+|| | j6r|| j6+|| |rt78| |
 r|
9  dS dS |d dkr<t!|}|rt"|\}}t#|	|||| j t  | }t$|	t%j&}|r||t'j(< t$|	t%j)}| j*r| j*+t,t-|d
 d	| | j.r| j.+t,|d	| | jd| | j/r
| j0r| j0+| j/| | j1r
| j1+| j/| t2|d}|r<zt3|d	 }W n
 t4y%   Y nw | j5r1| j5+|| | j6r<| j6+|| |rDt78| |
 rN|
9  w w )zThe ASGI application

        Args:
            scope: An ASGI environment.
            receive: An awaitable callable yielding dictionaries
            send: An awaitable callable taking a single dictionary as argument.
        type)r   	websocketN)r   	span_name
start_timecontext_carriercontext_getter
attributesr   rk   F)end_on_exitr   i  r   content-length):r   r   rp   r   url_disabledr   r   r   updater+   r   rx   !_parse_active_request_count_attrsr   addr   use_spanis_recordingr{   set_attributekindSpanKindSERVERr   r   r   r<   lenset_attributescallabler   _get_otel_receive_get_otel_sendr   r:   r!   _parse_duration_attrsr%   rw   r4   HTTP_TARGETr   r   recordmaxroundr   r   r   r   rR   r   r   r   r   r   detachend)rS   r|   r   r   start_urlr   additional_attributesr   r   tokenactive_requests_count_attrscurrent_spanrC   r[   custom_attributesotel_receive	otel_sendtargetre   query
duration_sduration_attrs_oldduration_attrs_newrequest_sizerequest_size_amountrH   rH   rP   __call__  sd  




$










z OpenTelemetryMiddleware.__call__c                   s(   j r S t  fdd}|S )Nc                    s   j dd df=}   I d H }tjr"| | |  rD|d dkr4t| dd j | d|d  W d    |S W d    |S 1 sOw   Y  |S )Nr   r   r   zwebsocket.receive   asgi.event.type)	r   start_as_current_spanry   r   r   r   r   r   r   )receive_spanmessager   r|   rS   server_span_namerH   rP   r  +  s4   


z?OpenTelemetryMiddleware._get_otel_receive.<locals>.otel_receive)r   r   )rS   r  r|   r   r  rH   r  rP   r   '  s
   z)OpenTelemetryMiddleware._get_otel_receivec                 C  s   | j d||d df?}t| jr| ||| | r3|d dkr+|dd}|d|d  |rEt||d| j	 W d   |S W d   |S 1 sPw   Y  |S )	z)Set send span attributes and status code.r   r   r   http.response.starttrailersFr  N)
r   r  ry   r   r   r   rR   r   r   r   )rS   r  r|   r   r  r   expecting_trailers	send_spanrH   rH   rP   _set_send_spanB  s0   



z&OpenTelemetryMiddleware._set_send_spanc                 C  sl   |  r(|jtjjkr(d|v r(| jrt|| j| jtni }t	|dkr(|
| |r4t|||| j dS dS )z+Set server span attributes and status code.rG   r   N)r   r   r   r   r   r   r   r   r=   r   r   r   r   )rS   r   r  r   duration_attrscustom_response_attributesrH   rH   rP   _set_server_span`  s.   	

z(OpenTelemetryMiddleware._set_server_spanc              	     s*   dt d fdd}|S )NFr  r   c                   s  d }| d dkr| d }n| d dkrd}j s#| || |  t }|r>|j| ttj t	d t
| d}|rYz	t|d _W n	 tyX   Y nw | I d H  sn| d d	krn| d
dr|r| d dkr| dds  d S d S d S d S )Nr   r  statuszwebsocket.sendr  )r   setterr   r   zhttp.response.body	more_bodyFzhttp.response.trailersmore_trailers)r   r  r  r*   injectr5   r   context_apiContextasgi_setterrx   rR   r   r   r   r   )r  r   
propagatorcontent_lengthr  r  r|   rS   r   r   r  rH   rP   r    s`   
	


z9OpenTelemetryMiddleware._get_otel_send.<locals>.otel_send)r  r   r   )rS   r   r  r|   r   r  r  rH   r(  rP   r   ~  s   6z&OpenTelemetryMiddleware._get_otel_send)NNNNNNNNNNNNN)r   r(   r   r&   r   r'   r   r   r   r   r   r   r   r   )r|   r   r   r   r   r   rE   r\   )
rW   rX   rY   __doc__r   r  r   r  r  r   rH   rH   rH   rP   r     s.     
 r   c                 C     t | tt|S rl   )r   r   r   	req_attrsr}   rH   rH   rP   r        r   c                 C  r*  rl   )r   r   r   r+  rH   rH   rP   r     r-  r   c                 C  s*   z|  dW S  ty   |  d Y S w )Nzutf-8unicode_escape)rs   r   )r[   rH   rH   rP   rI     s
   rI   )
r   r   r   r9   r   r   r   r   rE   r   )r|   rB   rE   r   )r|   r   rE   r   )cr)  
__future__r   typingrt   collectionsr   	functoolsr   timeitr   r   r   r	   r
   r   asgiref.compatibilityr   opentelemetryr   r   &opentelemetry.instrumentation._semconvr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   (opentelemetry.instrumentation.asgi.typesr&   r'   r(   *opentelemetry.instrumentation.asgi.versionr)   )opentelemetry.instrumentation.propagatorsr*   #opentelemetry.instrumentation.utilsr+   opentelemetry.metricsr,   !opentelemetry.propagators.textmapr-   r.   6opentelemetry.semconv._incubating.metrics.http_metricsr/   r0   r1   opentelemetry.semconv.metricsr2   *opentelemetry.semconv.metrics.http_metricsr3   opentelemetry.semconv.tracer4   opentelemetry.tracer5   opentelemetry.util.httpr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   rB   r@   rx   rZ   r%  rw   r   r   rp   r   r   r   r   r   r   rI   rH   rH   rH   rP   <module>   s\    1d0"

D


   G

