o
    ib#                  	   @   sL  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# ee$Z%de	de&fddZ'	 e(e)e)e)e)e*e&e)e)f Z+G dd de,Z-de	de+fddZ.G dd de!eZ/dS )     )defaultdictN)Optional)Union)SpanProcessor)Span)compat)DDSketch)config)Lock)fibonacci_backoff_with_jitter)__version__   )_SPAN_MEASURED_KEY   )agent)packb)get_hostname)
get_logger)PeriodicService)_human_sizespanreturnc                 C   s   | j tdkS )z9Return whether the span is flagged to be measured or not.   )_metricsgetr   )r    r   T/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/processor/stats.py_is_measured   s   r   c                   @   s   e Zd ZdZdZdd ZdS )SpanAggrStatszAggregated span statistics.)hitstop_level_hitserrorsdurationok_distributionerr_distributionc                 C   s,   d| _ d| _d| _d| _t | _t | _d S )Nr   )r   r    r!   r"   r   r#   r$   )selfr   r   r   __init__9   s   zSpanAggrStats.__init__N)__name__
__module____qualname____doc__	__slots__r&   r   r   r   r   r   4   s    r   c                 C   sx   | j pd}| jp	d}| jpd}| dpd}| dpd}| dp(| dp(d}| jjdk}| j|||t||||fS )zBReturn a hashable key that can be used to aggregate similar spans. zhttp.status_coder   zhttp.methodzhttp.endpointz
http.route
synthetics)serviceresource	span_typeget_tagcontext	dd_originnameint)r   r.   r/   _typestatus_codemethodendpointr-   r   r   r   _span_aggr_keyD   s   


r:   c                	       s   e Zd ZdZ				ddee dee dedef fd	d
Zde	fddZ
de	ddfddZdee fddZdeddfddZdddZdee ddfddZ  ZS )SpanStatsProcessorV06zYSpanProcessor for computing, collecting and submitting span metrics to the Datadog Agent.N      ?r   	agent_urlintervaltimeoutretry_attemptsc                    s   |d u rt tdpd}tt| j|d |ptjj| _	d| _
d| j	| j
f | _|| _t|d | _tdd | _d	td
d| _d| _tjrKt | _t | _d| _t|d| j d|  d d| j| _|   d S )N_DD_TRACE_STATS_WRITER_INTERVALg      $@)r>   z/v0.6/statsz%s%sg    eAc                   S   s   t tS N)r   r   r   r   r   r   <lambda>d   s    z0SpanStatsProcessorV06.__init__.<locals>.<lambda>pythonzapplication/msgpack)zDatadog-Meta-LangzDatadog-Meta-Tracer-VersionzContent-Typer,   Tg-?gS?r   )attemptsinitial_wait)floatosgetenvsuperr;   r&   r   r	   trace_agent_url
_agent_url	_endpoint_agent_endpoint_timeoutr5   _bucket_size_nsr   _bucketsr   _headers	_hostname_report_hostnamer   r
   _lock_enabledr   r>   _flush_stats_flush_stats_with_backoffstart)r%   r=   r>   r?   r@   	__class__r   r   r&   S   s6   zSpanStatsProcessorV06.__init__r   c                 C   s   d S rB   r   )r%   r   r   r   r   on_span_startx   s   z#SpanStatsProcessorV06.on_span_startr   c                 C   s   | j sd S |j }st|sd S | ja |jd usJ |j|j }||| j  }t|}| j| | }| j	d7  _	| j
|j7  _
|rK| jd7  _|jr]| jd7  _|j|j n|j|j W d    d S W d    d S 1 sww   Y  d S )Nr   )rV   _is_top_levelr   rU   duration_nsstart_nsrP   r:   rQ   r   r"   r    errorr!   r$   addr#   )r%   r   is_top_levelspan_end_nsbucket_time_nsaggr_keystatsr   r   r   on_span_finish{   s*   "z$SpanStatsProcessorV06.on_span_finishc                 C   s   g }g }| j  D ]^\}}g }|| | D ]D\}}|\}}	}
}}}}}t|t|
|||||j|j|j|j|j	
 |j
 d}|	rNt|	|d< |rWt||d< || q||| j|d q	|D ]}| j |= qj|S )zqSerialize and update the buckets.

        The current bucket is left in case any other spans are added.
        )NameResource
SyntheticsHTTPStatusCode
HTTPMethodHTTPEndpointHitsTopLevelHitsDurationErrors	OkSummaryErrorSummaryServiceType)Startrp   Stats)rQ   itemsappendr   ensure_textr   r    r"   r!   r#   to_protor$   rP   )r%   serialized_bucketsserialized_bucket_keysrd   bucketbucket_aggr_statsre   	stat_aggrr4   r.   r/   r6   http_statusr-   http_methodhttp_endpointserialized_bucketkeyr   r   r   _serialize_buckets   sD   
	
z(SpanStatsProcessorV06._serialize_bucketspayloadc                 C   s   zt | j| j}|d| j|| j | }W n ty)   t	j
d| jdd  w |jdkr9t	
d d| _d S |jdkrNt	
d	|j|j| | j d S t	d
tt|| j d S )NPUTz6failed to submit span stats to the Datadog agent at %sT)exc_infoi  z]Datadog agent does not support tracer stats computation, disabling, please upgrade your agentFi  zLfailed to send stats payload, %s (%s) (%s) response from Datadog agent at %szsent %s to %s)r   get_connectionrL   rO   requestrM   rR   getresponse	Exceptionlogr`   rN   statusrV   reasonreadinfor   len)r%   r   connrespr   r   r   rW      s.   

z"SpanStatsProcessorV06._flush_statsc                 C   s   | j  |  }W d    n1 sw   Y  |sd S || jd}tjr,ttj|d< tjr7ttj|d< t|}z| 	| W d S  t
yT   td| j Y d S w )N)rw   HostnameEnvVersionzEretry limit exceeded submitting span stats to the Datadog agent at %s)rU   r   rS   r	   envr   rz   versionr   rX   r   r   r`   rN   )r%   serialized_statsraw_payloadr   r   r   r   periodic   s$   
zSpanStatsProcessorV06.periodicc                 C   s   |    | | d S rB   )r   stop)r%   r?   r   r   r   shutdown   s   zSpanStatsProcessorV06.shutdown)NNr<   r   )r   N)r'   r(   r)   r*   r   strrG   r5   r&   r   r\   rg   listdictr   bytesrW   r   r   __classcell__r   r   rZ   r   r;   P   s*    %.
r;   )0collectionsr   rH   typingr   r   ddtrace._trace.processorr   ddtrace._trace.spanr   ddtrace.internalr   ddtrace.internal.nativer   !ddtrace.internal.settings._configr	   ddtrace.internal.threadsr
   ddtrace.internal.utils.retryr   ddtrace.versionr   	constantsr   r,   r   	_encodingr   hostnamer   loggerr   r   r   writerr   r'   r   boolr   tupler   r5   SpanAggrKeyobjectr   r:   r;   r   r   r   r   <module>   sH   