o
    3Ih                     @  s@  d dl mZ d dlZd dl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 d dlmZ d dlmZmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZ e ZdZ	d<d=ddZ 		d>d?d d!Z!d@d%d&Z"	d<d'd(Z#dAd*d+Z$dBd-d.Z%d/d0 Z&dCd1d2Z'dCd3d4Z(edDd7d8Z)edEd9dZ*edEd:d;Z+dS )F    )annotationsN)contextmanager)import_module)escapesub)AnyDict	GeneratorSequence)ObjectProxy)contexttrace)"_SUPPRESS_HTTP_INSTRUMENTATION_KEY_SUPPRESS_INSTRUMENTATION_KEY)extract)
StatusCode)TraceContextTextMapPropagatorsuppress_instrumentationobjr   
attributesSequence[str]existingDict[str, str] | NonereturnDict[str, str]c                 C  s@   i }|r	| | |D ]}t| |d }|d urt|||< q|S N)updategetattrstr)r   r   r   	extractedattrvalue r"   c/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/opentelemetry/instrumentation/utils.pyextract_attributes_from_object0   s   
r$   TFstatusintallow_redirectboolserver_spanr   c                 C  sV   t | tstjS | dk rtjS | dkrtjS | dkr|rtjS | dkr(|r(tjS tjS )z}Converts an HTTP status code to an OpenTelemetry canonical status code

    Args:
        status (int): HTTP status code
    d   i+  i  i  )
isinstancer&   r   UNSETERROR)r%   r'   r)   r"   r"   r#   http_status_to_status_code=   s   
r.   objectr    r   c              
   C  s   t | trIz
| dd\}}W n ty$ } z	td|  d|d}~ww t|}zt||} W n tyH } ztd| d| d|d}~ww t| |d}|rdt |trft	|d	rht
| ||j dS dS dS dS )
aM  Given a function that was wrapped by wrapt.wrap_function_wrapper, unwrap it

    The object containing the function to unwrap may be passed as dotted module path string.

    Args:
        obj: Object that holds a reference to the wrapped function or dotted import path as string
        attr (str): Name of the wrapped function
    .   zCannot parse 'z' as dotted import pathNzCannot import 'z' from ''__wrapped__)r+   r   rsplit
ValueErrorImportErrorr   r   AttributeErrorr   hasattrsetattrr3   )r   r    module_path
class_nameexcmodulefuncr"   r"   r#   unwrapV   s4   
	
r?   c           
      C  sf   d } }}t  t ju rt||d}t|}t jj}nt }t jj	}| j
|||||d}	|	|fS )a  Returns internal or server span along with the token which can be used by caller to reset context


    Args:
        tracer : tracer in use by given instrumentation library
        span_name (string): name of the span
        start_time : start time of the span
        context_carrier : object which contains values that are
            used to construct a Context. This object
            must be paired with an appropriate getter
            which understands how to extract a value from it.
        context_getter : an object which contains a get function that can retrieve zero
            or more values from the carrier and a keys function that can get all the keys
            from carrier.
    N)getter)namer   kind
start_timer   )r   get_current_spanINVALID_SPANr   r   attachSpanKindSERVERget_currentINTERNAL
start_span)
tracer	span_namerC   context_carriercontext_getterr   tokenctx	span_kindspanr"   r"   r#   _start_internal_or_server_spans   s   

rT   sc                 C  s*   t | ttfs	| S tj| }|ddS )N%z%%)r+   r   bytesurllibparsequotereplace)rU   quotedr"   r"   r#   
_url_quote   s   r]   dict[str, Any]c                  C  s   i } t |  | S )zs
    Return the OpenTelemetry Trace and Span IDs if Span ID is set in the
    OpenTelemetry execution context.
    )
propagatorinject)_headersr"   r"   r#   _get_opentelemetry_values   s   
rb   c                 C  s   t t| | dd| S )Nz(?!$) )r   r   )python_path	directorypath_separatorr"   r"   r#   _python_path_without_directory   s
   rg   c                   C  s   t tp	t t S r   )r   	get_valuer   #_SUPPRESS_INSTRUMENTATION_KEY_PLAINr"   r"   r"   r#   is_instrumentation_enabled   s   
rj   c                   C  s   t  ott S r   )rj   r   rh   r   r"   r"   r"   r#   is_http_instrumentation_enabled   s   
rk   keysGenerator[None]c               	   g  sP    t  }| D ]	}t |d|}qt |}zdV  W t | dS t | w ),Suppress instrumentation within the context.TN)r   rI   	set_valuerF   detach)rl   rQ   keyrP   r"   r"   r#   _suppress_instrumentation   s   
rr   c                   c  s8    t tt dV  W d   dS 1 sw   Y  dS rn   N)rr   r   ri   r"   r"   r"   r#   r      s   "c                   c  s6    t t dV  W d   dS 1 sw   Y  dS rs   )rr   r   r"   r"   r"   r#   suppress_http_instrumentation   s   
"rt   r   )r   r   r   r   r   r   r   r   )TF)r%   r&   r'   r(   r)   r(   r   r   )r   r/   r    r   )rU   r   r   r   )r   r^   )r   r(   )rl   r   r   rm   )r   rm   ),
__future__r   urllib.parserX   
contextlibr   	importlibr   rer   r   typingr   r   r	   r
   wraptr   opentelemetryr   r   opentelemetry.contextr   r   opentelemetry.propagater   opentelemetry.tracer   ,opentelemetry.trace.propagation.tracecontextr   r_   ri   r$   r.   r?   rT   r]   rb   rg   rj   rk   rr   r   rt   r"   r"   r"   r#   <module>   sD   
#

*


