o
    i&                  
   @   s  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 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%G dd de&Z'dd  e(e) D Z*d!Z+ed"e,e,e-e.d#d$d%Z/d&e0e,e,f d'e0e,e,f fd(d)Z1G d*d+ d+Z2d'e3e2 fd,d-Z4d'e3e0e,ef  fd.d/Z5d'ee3e0e,ef   fd0d1Z6d'ee3e0e,ef   fd2d3Z7d4e,d'e3e0e,ef  fd5d6Z8d7e,d'dfd8d9Z9d:ed;e:d<e-d=e.d'df
d>d?Z;d@edAefdBdCZ<d:edDe3e d'ee fdEdFZ=dS )G    N)Any)Optional)	TypedDict)SamplingRule)Span)_SAMPLING_AGENT_DECISION)_SAMPLING_RULE_DECISION)!_SINGLE_SPAN_SAMPLING_MAX_PER_SEC)*_SINGLE_SPAN_SAMPLING_MAX_PER_SEC_NO_LIMIT)_SINGLE_SPAN_SAMPLING_MECHANISM)_SINGLE_SPAN_SAMPLING_RATE)_KEEP_PRIORITY_INDEX)_REJECT_PRIORITY_INDEX)MAX_UINT_64BITS)!SAMPLING_DECISION_MAKER_INHERITED) SAMPLING_DECISION_MAKER_RESOURCE)SAMPLING_DECISION_MAKER_SERVICE)SAMPLING_DECISION_TRACE_TAG_KEY)SAMPLING_HASH_MODULO)SAMPLING_KNUTH_FACTOR) SAMPLING_MECHANISM_TO_PRIORITIES)SamplingMechanism)GlobMatcher)
get_logger)config   )RateLimiterc                   @   s    e Zd ZdZdZdZdZdZdS )PriorityCategorydefaultautorule_defaultrule_customerrule_dynamicN)__name__
__module____qualname__DEFAULTAUTORULE_DEFAULTRULE_CUSTOMERRULE_DYNAMIC r+   r+   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/sampling.pyr   #   s    r   c                 C   s"   h | ]\}}|  rd |qS )z-{})isupperformat).0namevaluer+   r+   r,   	<setcomp>+   s
    r2   z	_dd.p.ksrSpanSamplingRules)r0   servicesample_ratemax_per_secondF)totalmetareturnc                 C   s4   |  t}|r|tvr| t= d| d< td| | S )Ndecoding_errorz_dd.propagation_errorzfailed to decode _dd.p.dm: %r)getr   SAMPLING_MECHANISM_CONSTANTSlogwarning)r8   r1   r+   r+   r,   validate_sampling_decision=   s   
r?   c                
   @   s   e Zd ZdZdZ		ddededee dee fdd	Z	d
e
defddZd
e
defddZd
e
defddZd
e
ddfddZdS )SpanSamplingRulezKA span sampling rule to evaluate and potentially tag each span upon finish.)_service_matcher_name_matcher_sample_rate_max_per_second_sampling_id_threshold_limiter_matcherNr5   r6   r4   r0   c                 C   sX   || _ | j t | _|| _t|| _|d urt|nd | _|d ur't|| _d S d | _d S N)	rC   r   rE   rD   r   rF   r   rA   rB   )selfr5   r6   r4   r0   r+   r+   r,   __init__W   s   
 zSpanSamplingRule.__init__spanr9   c                 C   s&   |  |r| j r| | dS dS )NTF)_samplerF   
is_allowedapply_span_sampling_tagsrI   rK   r+   r+   r,   sampleh   s
   


zSpanSamplingRule.samplec                 C   s0   | j dkrdS | j dkrdS |jt t | jkS )Nr   Tr   F)rC   span_idr   r   rE   rO   r+   r+   r,   rL   o   s
   

zSpanSamplingRule._samplec                 C   sl   |j }|j}|du r|du rdS d}d}| jr#|du rdS | j|}| jr2|du r,dS | j|}|o5|S )zGDetermines if the span's service and name match the configured patternsNFT)r0   r4   rA   matchrB   )rI   rK   r0   r4   service_match
name_matchr+   r+   r,   rR   w   s   zSpanSamplingRule.matchc                 C   s<   | ttj | t| j | jtkr| t| j d S d S rH   )	
set_metricr   r   SPAN_SAMPLING_RULEr   rC   rD   r
   r	   rO   r+   r+   r,   rN      s
   
z)SpanSamplingRule.apply_span_sampling_tags)NN)r#   r$   r%   __doc__	__slots__floatintr   strrJ   r   boolrP   rL   rR   rN   r+   r+   r+   r,   r@   J   s$    
r@   c            	      C   s   t  } g }| D ]a}|dd}|d}|d}|s*|s*tdt| g   S |dt}z|r7t| |r=t| t||||d}W n t	yb } ztdt|| W Y d }~qd }~ww |
| q|S )	Nr5   g      ?r4   r0   z?Sampling rules must supply at least 'service' or 'name', got %sr6   )r5   r4   r0   r6   z/Error creating single span sampling rule %s: %s)_get_span_sampling_jsonr;   r=   r>   jsondumpsr
   _check_unsupported_patternr@   	Exceptionappend)	
json_rulessampling_rulesruler5   r4   r0   r6   sampling_ruleer+   r+   r,   get_span_sampling_rules   s0   


 rh   c                  C   s.   t  } t }| r|rtd | S | p|pg S )NzlDD_SPAN_SAMPLING_RULES and DD_SPAN_SAMPLING_RULES_FILE detected. Defaulting to DD_SPAN_SAMPLING_RULES value.)_get_env_json_get_file_jsonr=   r>   )env_json_rulesfile_json_rulesr+   r+   r,   r]      s   r]   c                  C   sB   t j} | rt| }t| W  d    S 1 sw   Y  d S rH   )r   _sampling_rules_fileopen_load_span_sampling_jsonread)file_json_rawfr+   r+   r,   rj      s   

 rj   c                  C   s   t j} | r	t| S d S rH   )r   _sampling_rulesro   )env_json_rawr+   r+   r,   ri      s   ri   raw_json_rulesc                 C   sR   zt | }t|tstd| g W S W |S  t jy(   td|  g  Y S w )Nz*DD_SPAN_SAMPLING_RULES is not list, got %rz)Unable to parse DD_SPAN_SAMPLING_RULES=%r)r^   loads
isinstancelistr=   r>   JSONDecodeError)ru   rc   r+   r+   r,   ro      s   

ro   stringc                 C   s0   h d}| D ]}||v rt jrtd| qd S )N>   [\]z=Unsupported Glob pattern found, character:%r is not supported)r   _raise
ValueError)rz   unsupported_charscharr+   r+   r,   r`      s   r`   rK   sampledr5   	mechanismc                 C   s   | j jts| | |tjtjtjfv r%| 	t
| | t|d n|tjkr8| 	t| | t|d t| }|r@tnt}|| | j _d S )Nz.6g)context_metar;   r   _set_sampling_decision_makerr   LOCAL_USER_TRACE_SAMPLING_RULEREMOTE_USER_TRACE_SAMPLING_RULE"REMOTE_DYNAMIC_TRACE_SAMPLING_RULErU   r   _set_tag_strKNUTH_SAMPLE_RATE_KEYAGENT_RATE_BY_SERVICEr   r   r   r   sampling_priority)rK   r   r5   r   
prioritiespriority_indexr+   r+   r,   _set_sampling_tags   s   

r   targetsourcec                 C   s,   |  td | t|j | t|j dS )z2Set sampling tags from source span on target span.r   N)rU   r   r   r   r4   r   resource)r   r   r+   r+   r,   _inherit_sampling_tags  s   r   rulesc                 C   s(   |sd S |D ]}| | r|  S qd S rH   )matches)rK   r   re   r+   r+   r,   %_get_highest_precedence_rule_matching  s   
r   )>r^   typingr   r   r   ddtrace._trace.sampling_ruler   ddtrace._trace.spanr   ddtrace.constantsr   r   r	   r
   r   r   ddtrace.internal.constantsr   r   r   r   r   r   r   r   r   r   r   ddtrace.internal.glob_matchingr   ddtrace.internal.loggerr   !ddtrace.internal.settings._configr   rate_limiterr   r#   r=   objectr   varsitemsr<   r   r[   rY   rZ   r3   dictr?   r@   rx   rh   r]   rj   ri   ro   r`   r\   r   r   r   r+   r+   r+   r,   <module>   sr    



N"