o
    i                     @   s  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
 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 d dlmZ d dlmZ ede
dZdeje defddZG dd dee ee ZdS )    )TracebackType)Any)Generic)Optional)TypeVar)config)TracingEvent)Span)_finish_span)_SPAN_MEASURED_KEY)	SPAN_KIND)trace_utils)core)	COMPONENT)ContextSubscriber)tracerTracingEventType)boundctxreturnc                 C   s  | j }| d}| d}|r |r tjt|| d| dd |j|j|j|jd}t	j
r>td| ||jf | d|}|jrFtj n|j}|d	urS|d
| tj|jfi |}|jt|jt|ji|j |jru|td || _t	j
rtd| f |S )a  Adaptation of _start_span from trace_handlers to use the event directly
    Once every integration adopted events API, trace_handlers _start_span
    should be completly removed.

    Args:
        ctx: ExecutionContext containing the event
    Returns:
        The created Span
    activate_distributed_headersintegration_configdistributed_headers#distributed_headers_config_override)
int_configrequest_headersoverride)	span_typeresourceserviceactivatezinferred_proxy.startspan_kwargsNchild_of   zinferred_proxy.finish)eventget_itemr   r   r   r   r   r   r    r    _inferred_proxy_services_enabledr   dispatchuse_active_contextcontext_provideractivedistributed_context
setdefault
start_span	span_name_metaupdater   	componentr   	span_kindtagsmeasured
set_metricr   span)r   r$   r   r   r!   default_child_ofr6    r8   T/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/_trace/subscribers/_base.py_start_span   s:   


r:   c                	   @   sb   e Zd ZdZedeje ddfddZedeje de	e
e e
e e
e f ddfdd	ZdS )
TracingSubscribera_  Subscriber that automatically manages span lifecycle for SpanContextEvent.

    This base class handles span creation and finishing, so subclasses only need to
    override on_started/on_ended for their specific logic.

    Example:
        class MySpanSubscriber(SpanTracingSubscriber):
            event_names = ("my.span",)

            @classmethod
            def on_started(cls, ctx):
                ctx.span.set_tag("custom.tag", "value")

            @classmethod
            def on_ended(cls, ctx, exc_info):
                if exc_info[1]:
                    ctx.span.set_tag("error", True)
    r   r   Nc                 C   s    t | | jD ]}|| qd S )N)r:   _started_handlers)clsr   handlerr8   r8   r9   _on_context_startedd   s   

z%TracingSubscriber._on_context_startedexc_infoc              
   C   sV   z| j D ]}||| qW t|jddrt|| d S d S t|jddr*t|| w w )N	_end_spanT)_ended_handlersgetattrr$   r
   )r=   r   r@   r>   r8   r8   r9   _on_context_endedj   s   
z#TracingSubscriber._on_context_ended)__name__
__module____qualname____doc__classmethodr   ExecutionContextr   r?   tupler   typeBaseExceptionr   rD   r8   r8   r8   r9   r;   P   s    r;   N) typesr   typingr   r   r   r   ddtracer   ddtrace._trace.eventsr   ddtrace._trace.spanr	   ddtrace._trace.trace_handlersr
   ddtrace.constantsr   r   ddtrace.contribr   ddtrace.internalr   ddtrace.internal.constantsr    ddtrace.internal.core.subscriberr   ddtrace.tracer   r   rJ   r:   r;   r8   r8   r8   r9   <module>   s&    9