o
    i                     @   s   U 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m	Z	 d dl
mZ d dlmZ eeZee	ef Zejd	dd
Zejee  ed< G dd de jdZG dd deZdS )    N)Any)Optional)Union)Context)Span)core)
get_loggerdatadog_contextvar)default_DD_CONTEXTVARc                   @   sr   e Zd ZdZejdefddZejdee	 ddfddZ
ejdee	 fd	d
Zdededee	 fddZdS )BaseContextProviderat  
    A ``ContextProvider`` is an interface that provides the blueprint
    for a callable class, capable to retrieve the current active
    ``Context`` instance. Context providers must inherit this class
    and implement:
    * the ``active`` method, that returns the current active ``Context``
    * the ``activate`` method, that sets the current active ``Context``
    returnc                 C      d S N selfr   r   K/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/_trace/provider.py_has_active_context       z'BaseContextProvider._has_active_contextctxNc                 C   s   t d|f d S )Nz!ddtrace.context_provider.activate)r   dispatchr   r   r   r   r   activate$   s   zBaseContextProvider.activatec                 C   r   r   r   r   r   r   r   active(   r   zBaseContextProvider.activeargskwargsc                 O   s   |   S )zMethod available for backward-compatibility. It proxies the call to
        ``self.active()`` and must not do anything more.
        )r   )r   r   r   r   r   r   __call__,   s   zBaseContextProvider.__call__)__name__
__module____qualname____doc__abcabstractmethodboolr   r   ActiveTracer   r   r   r   r   r   r   r   r      s    	r   )	metaclassc                       sr   e Zd ZdZd fddZdefddZdee ddf fd	d
Z	dee fddZ
dedee fddZ  ZS )DefaultContextProviderzContext provider that retrieves contexts from a context variable.

    It is suitable for synchronous programming and for asynchronous executors
    that support contextvars.
    r   Nc                    s   t t|   d S r   )superr'   __init__r   	__class__r   r   r)   :   s   zDefaultContextProvider.__init__c                 C   s   t  }|duS )zDReturns whether there is an active context in the current execution.N)r   getr   r   r   r   r   =   s   z*DefaultContextProvider._has_active_contextr   c                    s   t | tt| | dS )z8Makes the given context active in the current execution.N)r   setr(   r'   r   r   r*   r   r   r   B   s   
zDefaultContextProvider.activatec                 C   s"   t  }t|tu r| |S |S )z=Returns the active span or context for the current execution.)r   r,   typer   _update_active)r   itemr   r   r   r   G   s   
zDefaultContextProvider.activespanc                 C   sf   |}|r(|j dur(|jdu r|jr|jjr| |j |jS |j}|r(|j dus	||ur1| | |S )zUpdates the active trace in an executor.

        When a span finishes, the active span becomes its parent.
        If no parent exists and the context is reactivatable, that context is restored.
        N)duration_ns_parent_parent_context_reactivater   )r   r1   
new_activer   r   r   r/   Q   s   
z%DefaultContextProvider._update_active)r   N)r   r   r    r!   r)   r$   r   r   r%   r   r   r   r/   __classcell__r   r   r*   r   r'   3   s    
r'   )r"   contextvarstypingr   r   r   ddtrace._trace.contextr   ddtrace._trace.spanr   ddtrace.internalr   ddtrace.internal.loggerr   r   logr%   
ContextVarr   __annotations__ABCMetar   r'   r   r   r   r   <module>   s    
 