o
    i;                     @   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 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 d dl m!Z" erd 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-dd Z.dd  Z/d!d"d#d$d%Z0G d&d' d'eZdS )(    )time_nsN)TYPE_CHECKING)Span)SpanContext)SpanKind)Status)
StatusCode)DEFAULT_TRACE_OPTIONS)
TraceFlags)
TraceState)config)	ERROR_MSG)ERROR_STACK)
ERROR_TYPE)	SPAN_KIND)ensure_text)
get_logger)flatten_key_value)is_sequence)w3c_tracestate_add_p)tracer)Mapping)Optional)Union)
Attributes)AttributeValue)NumericTypec                 C   s   | ds
| drKt|ddkr|dd nd }|rI|dkr-t|ttfr-t|}t|ttfr<| |t	| t|ttfrI| 
|| | S t| || | S )Nmetametrics'      http.status_code)
startswithlensplit
isinstanceintfloatstrbytesset_tagr   
set_metricsetattr)span	attributevaluemeta_key r2   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/opentelemetry/span.py_ddmap*   s   $r4   c                 C   s(   | du rt S | dkrttjS ttjS )zReturns the trace flags for a given sampling priority.
    Note - DEFAULT_TRACE_OPTIONS is equivalent to 'span is not sampled YET'
    Nr   )r	   r
   SAMPLEDDEFAULT)sampling_priorityr2   r2   r3   _get_trace_flags<   s
   

r8   serviceresource	span_typezmeta['http.status_code'])zservice.namezresource.namez	span.typezhttp.response.status_codec                   @   s   e Zd ZdZejddddfddZedd Zej	dd Zedd	 Z
e
j	d
d	 Z
d&ddZedd Zdd Zdd Zdd Zd'ddZdd Zdd Zd&ddZd(ddZd d! Zd"d# Zed$d% ZdS ))r   zvInitializes an OpenTelemetry compatible shim for a Datadog span

    TODO: Add mapping table from otel to datadog
    Nc                 C   sb   |d ur||_ || _|d ur|| _|d ur|| _|tjur&| t|j	  |r/| 
| d S d S N)start_ns_ddspan_record_exception_set_status_on_exceptionr   INTERNALset_attributer   namelowerset_attributes)selfdatadog_spankind
attributes
start_timerecord_exceptionset_status_on_exceptionr2   r2   r3   __init__V   s   

zSpan.__init__c                 C      | j dduS )N_dd.otel.record_exceptionFr>   _get_ctx_itemrF   r2   r2   r3   r?   q      zSpan._record_exceptionc                 C      | j d| d S )NrO   r>   _set_ctx_itemrF   r0   r2   r2   r3   r?   w      c                 C   rN   )N _dd.otel.set_status_on_exceptionFrP   rR   r2   r2   r3   r@   |   rS   zSpan._set_status_on_exceptionc                 C   rT   )NrY   rU   rW   r2   r2   r3   r@      rX   c                 C   s0   |du rt  }| j}|r|| j_| j| dS )z
        Marks the end time of a span. This method should be called once.

        :param end_time: The end time of the span, in nanoseconds. Defaults to ``now``.
        N)r   _datadog_operation_namer>   rC   
_finish_ns)rF   end_timeoverride_namer2   r2   r3   end   s   zSpan.endc                 C   s   | j jttjj S )zGets span kind attribute)r>   _metagetr   r   rA   rC   rD   rR   r2   r2   r3   rH      s   z	Span.kindc                 C   sb   | j jjdu rt| j j t| j jj}t| j jj| j j	}t
|g}t| j j| j j	d||S )z$Returns an OpenTelemetry SpanContextNF)r>   contextr7   ddtracersample_local_rootr8   r   _tracestatespan_idr   from_headerr   trace_id)rF   tfts_strtsr2   r2   r3   get_span_context   s   zSpan.get_span_contextc                 C   s"   |  D ]
\}}| || qdS )zSets attributes/tagsN)itemsrB   )rF   rI   kvr2   r2   r3   rE      s   zSpan.set_attributesc                 C   s   |   sdS t|}|durt| j|| dS t|r1t|| D ]\}}| j|| q#dS |dkr@t	|t
tfr@t|}t	|ttfrTt|}| j|| dS t	|t
tfrd| j|| dS | j|| dS )z*Sets an attribute or service name on a tagNr"   )is_recording_OTelDatadogMappingr`   r4   r>   r   r   rm   r+   r&   r'   r(   r)   r*   r   r,   )rF   keyr0   ddattributern   ro   r2   r2   r3   rB      s&   
zSpan.set_attributec                 C   s,   |   sdS |r|d }| j||| dS )zRecords an eventNi  )rp   r>   
_add_event)rF   rC   rI   	timestampr2   r2   r3   	add_event   s
   zSpan.add_eventc                 C   s   |   sdS || j_dS )zUpdates the name of a spanN)rp   r>   r:   )rF   rC   r2   r2   r3   update_name   s   zSpan.update_namec                 C   s
   | j j S )z&Returns False if Span.end() is called.)r>   finishedrR   r2   r2   r3   rp      s   
zSpan.is_recordingc                 C   s~   |   sdS t|tr$|dur||jkrtd| jj| |j}|j}n|}|}|t	j
u r;d| j_|r=| t| dS dS dS )z
        Updates a Span from StatusCode.OK to StatusCode.ERROR.
        Note - The default status is OK. Setting the status to StatusCode.UNSET or updating the
        status from StatusCode.ERROR to StatusCode.OK is not supported.
        NzConflicting descriptions detected. The following description will not be set on the %s span: %s. Ensure `Span.set_status(...)` is called with `(Status(status_code, description), None)` or `(status_code, description)`r!   )rp   r&   r   descriptionlogwarningr>   rC   status_coder   ERRORerrorrB   r   )rF   statusry   r|   messager2   r2   r3   
set_status   s&   

zSpan.set_statusFc                 C   s   |   sdS d|jj|jjf t|t|d}|r|| |d | jjt< |d | jjt	< d|v r<|d | jjt
< ndtjt|||jtjd| jjt
< | jd	||d
 dS )z2
        Records an exception as an event
        Nz%s.%s)exception.typeexception.messagezexception.escapedr   r   zexception.stacktrace )limit	exception)rC   rI   ru   )rp   	__class__
__module____name__r)   updater>   r_   r   r   r   join	tracebackformat_exceptiontype__traceback__r   _span_traceback_max_sizerv   )rF   r   rI   ru   escapedattrsr2   r2   r3   rK     s$   
zSpan.record_exceptionc                 C   s   | S )z]Invoked when `Span` is used as a context manager.
        Returns the `Span` itself.
        r2   rR   r2   r2   r3   	__enter__'  s   zSpan.__enter__c                 C   s6   |r| j r| j|dd | jr| tj |   dS )zEnds Span context managerT)r   N)r?   rK   r@   r   r   r}   r^   )rF   exc_typeexc_valexc_tbr2   r2   r3   __exit__.  s   zSpan.__exit__c                 C   s  | j }| j}|d}|r|S |dr"|tjkrdS |tjkr"dS |d}|r3|tjkr3| dS |d}|d}|r[|r[|tjksU|tjksU|tjksU|tjkr[|d	 | S |d
}|tjkrx|dkrx|d}|srdS d| dS |tjkr|r| dS |tjkr|r| dS |d}	|d}
|tjkr|	r|
r|	 d	|
 dS |d}|tjkr|r| dS |d}|rdS |d}|tjkr|r| dS dS |tjkr|r| dS dS |S )Nzoperation.namezhttp.request.methodzhttp.server.requestzhttp.client.requestz	db.systemz.queryzmessaging.systemzmessaging.operation.z
rpc.systemzaws-apizrpc.servicezaws.client.requestzaws.z.requestz.client.requestz.server.requestzfaas.invoked_providerzfaas.invoked_namez.invokezfaas.triggerzgraphql.operation.typezgraphql.server.requestznetwork.protocol.namezserver.request)r>   rH   get_tagr   SERVERCLIENTCONSUMERPRODUCER)rF   ddspan	span_kindoperation_name	db_systemmessaging_systemmessaging_operation
rpc_systemrpc_servicefaas_invoked_providerfaas_invoked_namefaas_triggergraphql_operation_typenetwork_protocol_namer2   r2   r3   rZ   9  sl   

























zSpan._datadog_operation_namer<   )NN)NNF)r   r   __qualname____doc__r   rA   rM   propertyr?   setterr@   r^   rH   rl   rE   rB   rv   rw   rp   r   rK   r   r   rZ   r2   r2   r2   r3   r   P   s>    









 r   )1timer   r   typingr   opentelemetry.tracer   OtelSpanr   r   r   r   opentelemetry.trace.spanr	   r
   r   ddtracer   ddtrace.constantsr   r   r   r   ddtrace.internal.compatr   ddtrace.internal.loggerr   ddtrace.internal.utils.formatsr   r   ddtrace.internal.utils.httpr   ddtrace.tracer   rb   r   r   r   opentelemetry.util.typesr   r   ddtrace._trace.spanDDSpanr   r   rz   r4   r8   rq   r2   r2   r2   r3   <module>   sN    