
    uYf)                     r   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 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 dl#m$Z$ er$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Z.dZ/ G d  d!e0      Z1 ejd                  d"      Z3 ed#e4e4e5e6d$d%&      Z7d' Z8d( Z9 G d) d*      Z:d+ Z;d, Z<d- Z=d. Z>d/ Z?d0 Z@d1 ZAd2 ZBd3 ZCd4 ZDd5 ZEy# e$ r
 d dlmZ Y w xY w# e$ r e%Z$Y w xY w)6    N)TYPE_CHECKING)Optional)	TypedDict)!_SINGLE_SPAN_SAMPLING_MAX_PER_SEC)*_SINGLE_SPAN_SAMPLING_MAX_PER_SEC_NO_LIMIT)_SINGLE_SPAN_SAMPLING_MECHANISM)_SINGLE_SPAN_SAMPLING_RATE)SAMPLING_AGENT_DECISION)SAMPLING_LIMIT_DECISION)SAMPLING_RULE_DECISION)USER_REJECT)_CATEGORY_TO_PRIORITIES)_KEEP_PRIORITY_INDEX)_REJECT_PRIORITY_INDEX)SAMPLING_DECISION_TRACE_TAG_KEY)GlobMatcher)
get_logger)SamplingRule)_config   )RateLimiter)JSONDecodeError)Any)Dict)List)Text)Context)Spanl   qWV[{l            c                   0    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)SamplingMechanismr   r                        N)__name__
__module____qualname__DEFAULT
AGENT_RATEREMOTE_RATETRACE_SAMPLING_RULEMANUALAPPSECREMOTE_RATE_USERREMOTE_RATE_DATADOGSPAN_SAMPLING_RULE     Y/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/ddtrace/internal/sampling.pyr    r    7   s3    GJKFFr5   r    z
^-([0-9])$SpanSamplingRules)nameservicesample_ratemax_per_secondF)totalc                     | j                  t              }|r7t        j                  |      "| t        = d| d<   t        j                  d|       | S )Ndecoding_errorz_dd.propagation_errorzfailed to decode _dd.p.dm: %r)getr   TRACE_TAG_REmatchlogwarning)metavalues     r6   validate_sampling_decisionrF   S   sO     HH45Ee$,45,<D()KK7?Kr5   c                 6    d|z  }|| j                   t        <   |S )Nz-%d)_metar   )contextsampling_mechanismrE   s      r6   set_sampling_decision_makerrK   a   s#    
 &&E5:GMM12Lr5   c                   8    e Zd ZdZdZ	 	 d	dZd Zd Zd Zd Z	y)
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_matcherNc                     || _         | j                   t        z  | _        || _        t	        |      | _        |t        |      nd | _        |t        |      | _        y d | _        y N)	rP   MAX_SPAN_IDrR   rQ   r   rS   r   rN   rO   )selfr:   r;   r9   r8   s        r6   __init__zSpanSamplingRule.__init__x   sd     (&*&7&7+&E#-#N3 9@8KG 4QU262B[.r5   c                     | j                  |      r7| j                  j                  |j                        r| j	                  |       yy)NTF)_samplerS   
is_allowedstart_nsapply_span_sampling_tagsrX   spans     r6   samplezSpanSamplingRule.sample   s8    <<}}''6--d3r5   c                     | j                   dk(  ry| j                   dk(  ry|j                  t        z  t        z  | j                  k  S )Nr   Tr   F)rP   span_idKNUTH_FACTORrW   rR   r_   s     r6   r[   zSpanSamplingRule._sample   sC    !!#,;@[@[[[r5   c                     |j                   }|j                  }||yd}d}| j                  r|y| j                  j                  |      }| j                  r|y| j                  j                  |      }|xr |S )zGDetermines if the span's service and name match the configured patternsFT)r8   r9   rN   rA   rO   )rX   r`   r8   r9   service_match
name_matchs         r6   rA   zSpanSamplingRule.match   s     yy,,?t| 
   $ 5 5 ; ;G D|!//55d;
++r5   c                     |j                  t        t        j                         |j                  t        | j
                         | j                  t        k7  r!|j                  t        | j                         y y rV   )	
set_metricr   r    r3   r	   rP   rQ   r   r   r_   s     r6   r^   z)SpanSamplingRule.apply_span_sampling_tags   sW    79J9]9]^2D4E4EF#MMOO=t?S?ST Nr5   )NN)
r(   r)   r*   __doc__	__slots__rY   ra   r[   rA   r^   r4   r5   r6   rM   rM   k   s0    UI M"\,4Ur5   rM   c            	         t               } g }| D ]  }|j                  dd      }|j                  d      }|j                  d      }|s/|s-t        dj                  t	        j
                  |                  |j                  dt              }|rt        |       |rt        |       	 t        ||||      }|j                  |        |S # t        $ r3}t        dj                  t	        j
                  |      |            d }~ww xY w)	Nr:   g      ?r9   r8   z?Sampling rules must supply at least 'service' or 'name', got {}r;   )r:   r9   r8   r;   z/Error creating single span sampling rule {}: {})_get_span_sampling_jsonr?   
ValueErrorformatjsondumpsr   _check_unsupported_patternrM   	Exceptionappend)	
json_rulessampling_rulesruler:   r9   r8   r;   sampling_rulees	            r6   get_span_sampling_rulesrz      s
   (*JN -hh}c2((9%xxt^eefjfpfpqufvwxx "24^_&w/&t,	l,'tTbM
 	m,--.   	lNUUVZV`V`aeVfhijkk	ls   (C	D.DDc                  t    t               } t               }| r|rt        j                  d       | S | xs |xs 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_jsonrB   rC   )env_json_rulesfile_json_ruless     r6   rm   rm      s?    "_N$&O/>	
 2_22r5   c                      t         j                  } | r.t        |       5 }t        |j	                               cd d d        S y # 1 sw Y   y xY wrV   )config_sampling_rules_fileopen_load_span_sampling_jsonread)file_json_rawfs     r6   r}   r}      sC    //M-  	6A+AFFH5	6 	6	6s   AAc                  >    t         j                  } | rt        |       S y rV   )r   _sampling_rulesr   )env_json_raws    r6   r|   r|      s    ))L'55r5   c                     	 t        j                  |       }t        |t              st	        d|z        	 |S # t
        $ r t        d| z        w xY w)Nz*DD_SPAN_SAMPLING_RULES is not list, got %rz)Unable to parse DD_SPAN_SAMPLING_RULES=%r)rp   loads
isinstancelist	TypeErrorr   rn   )raw_json_rulesru   s     r6   r   r      sb    WZZ/
*d+H:UVV ,
   WD~UVVWs	   38 Ac                 >    h d}| D ]  }||v st        d|z         y )N>   [\]z=Unsupported Glob pattern found, character:%r is not supported)rn   )stringunsupported_charschars      r6   rr   rr     s6     ) e$$\_ccdder5   c                 N    | j                  t              t        j                  k(  S rV   )
get_metricr   r    r3   )r`   s    r6   is_single_span_sampledr     s    ??:;?P?c?cccr5   c                 X   t         j                  }|dk(  r| j                  t        |       nA|dk(  rt         j                  }n+|dk(  r&t         j
                  }| j                  t        |       t        |   }t        | |r	|t           n|t                  t        | j                  |       y )Nrw   defaultauto)r    r.   ri   r   r+   r,   r
   r   _set_priorityr   r   rK   rI   )r`   sampledr:   priority_category	mechanism
prioritiess         r6   _set_sampling_tagsr     s    !55IF".<	i	'%--		f	$%00	/=():;J$G
#78TjIkli8r5   c                     d}|r-|j                  | j                        }|st        | t               |j                  r | j                  t        |j                         |S )NT)r\   r]   r   r   _has_been_configuredri   r   effective_rate)r`   r   limiteralloweds       r6   _apply_rate_limitr   %  sN    G$$T]]3$,##/1G1GHNr5   c                 &    || j                   _        y rV   )rI   sampling_priority)r`   prioritys     r6   r   r   1  s    %-DLL"r5   c                 B    |sy |D ]  }|j                  |       s|c S  y rV   )matches)r`   rulesrw   s      r6   %_get_highest_precedence_rule_matchingr   6  s-     <<K r5   )Frp   retypingr   r   r   ImportErrortyping_extensionsddtrace.constantsr   r   r   r	   r
   r   r   r   ddtrace.internal.constantsr   r   r   r   ddtrace.internal.glob_matchingr   ddtrace.internal.loggerr   ddtrace.sampling_ruler   ddtrace.settingsr   r   rate_limiterr   r(   rB   json.decoderr   rn   r   r   r   r   ddtrace._trace.contextr   ddtrace._trace.spanr   rd   rW   objectr    compiler@   strfloatintr7   rF   rK   rM   rz   rm   r}   r|   r   rr   r   r   r   r   r   r4   r5   r6   <module>r      sI    	   ,  @ H = 8 5 5 4 ) > ; = F 6 . . . % !,
 .( #	 	 rzz-( 	 	 OU OUd<3 	ed
9	.
Y	  ,++,6  ! O!s#   D D, D)(D),D65D6