o
    i                     @   s
  d dl Z d dlZ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 eeZdgZG dd	 d	eZe Zd
d Zdd Zd%ddZd%ddZd%ddZG dd de jZdedefddZdeje fddZdd Zdd  Z d!d" Z!d#d$ Z"dS )&    N)En)
get_logger)
HttpConfigasbool)parse_tags_strzremote-configurationc                   @   s2   e Zd ZdZejedddZejede	i dZ
dS )_Configzdd.traceenabledT)defaultglobal_tags)parserr
   N)__name__
__module____qualname__
__prefix__r   vboolr	   dictr   r    r   r   J/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/_trace/product.pyr      s    r   c                  C   sL   t jr$ddlm}  td}t|}dd | D }| di | d S d S )Nr   )
_patch_allDD_PATCH_MODULESc                 S   s   i | ]	\}}|t |qS r   r   .0kr   r   r   r   
<dictcomp>#       z post_preload.<locals>.<dictcomp>r   )_configr	   ddtrace._monkeyr   osgetenvr   items)r   modules_to_patchmodules_to_strmodules_to_boolr   r   r   post_preload   s   
r%   c                  C   s:   t jrddlm}  | jrddlm} || j d S d S d S )Nr   )config)_install_trace_methods)r   r	   !ddtrace.internal.settings._configr&   _trace_methodsddtrace.internal.tracemethodsr'   )r&   r'   r   r   r   start'   s   r+   Fc                 C   "   ddl m} |jr|  d S d S Nr   tracer)ddtrace.tracer/   r	   _child_after_forkjoinr/   r   r   r   restart1      r4   c                 C   r,   r-   )r0   r/   r	   shutdownr2   r   r   r   stop8   r5   r7   c                 C   s   d S Nr   )r3   r   r   r   at_exit?   s   r9   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )APMCapabilitiesi   i    i @  i   i   i    N)	r   r   r   APM_TRACING_SAMPLE_RATEAPM_TRACING_LOGS_INJECTIONAPM_TRACING_HTTP_HEADER_TAGSAPM_TRACING_CUSTOM_TAGSAPM_TRACING_ENABLEDAPM_TRACING_SAMPLE_RULESr   r   r   r   r:   F   s    r:   rc_rulesreturnc                 C   s\   g }| D ]'}d|vrd|vrd|vrd|vsd|vsd|vr&t d| | q|| q|S )z1Remove invalid sampling rules from the given listservicenameresourcetagssample_rate
provenancezNInvalid sampling rule from remoteconfig found in: %s, rule will be removed: %s)logdebugappend)rA   new_rc_rulesruler   r   r   _remove_invalid_rulesO   s    rN   c                 C   s   d| vr
d| vr
dS |  d}|  dpg }t|}|D ]}d|v r4t|d tr4dd |d D |d< q|dur@|d|i |rGt|S dS )al  Example of an incoming rule:
    [
      {
        "service": "my-service",
        "name": "web.request",
        "resource": "*",
        "provenance": "customer",
        "sample_rate": 1.0,
        "tags": [
          {
            "key": "care_about",
            "value_glob": "yes"
          },
          {
            "key": "region",
            "value_glob": "us-*"
          }
        ]
      }
    ]

            Example of a converted rule:
            '[{"sample_rate":1.0,"service":"my-service","resource":"*","name":"web.request","tags":{"care_about":"yes","region":"us-*"},provenance":"customer"}]'
    tracing_sampling_rulestracing_sampling_rateNrF   c                 S   s   i | ]	}|d  |d qS )key
value_globr   )r   tagr   r   r   r      r   z4_convert_rc_trace_sampling_rules.<locals>.<dictcomp>rG   )getrN   
isinstancelistrK   jsondumps)
lib_configglobal_sample_raterA   rM   r   r   r    _convert_rc_trace_sampling_rules`   s   

r[   c                 C   sL   |  |}|s	dS t|d trdd |D }ndd |D }dd |D S )z+Extract and format tags from remote config.Nr   c                 S   s   g | ]
}|d  |d fqS )headertag_namer   )r   itemr   r   r   
<listcomp>   s    z$_convert_rc_tags.<locals>.<listcomp>c                 S   s   g | ]}| d qS ):)split)r   tr   r   r   r_          c                 S   s   i | ]\}}||qS r   r   r   r   r   r   r      rc   z$_convert_rc_tags.<locals>.<dictcomp>)rT   rU   r   )rY   rQ   	dd_configrF   pairsr   r   r   _convert_rc_tags   s   
rf   c                 C   s   |  |d u r	d S t| | S r8   )rT   r   )rY   rQ   r   r   r   _convert_optional_bool   s   rg   c                 C   s  ddl m} | dkr|j| tdt|j|jj| dS | dkr3|p&i  |_	td|j	 dS | dkrg|j
rJ|du rJd|_
td	| | dS |d
u rc|jd  dkred
|_
td| | dS dS dS | dkryt|d|_td| dS | dkrtd| dS td| | dS )z.Apply configuration change and log the update.r   r.   _trace_sampling_ruleszPUpdated tracer sampler (id: %s, rules: %s) sampling rules via remote_config: %s.rF   z)Updated tracer tags via remote_config: %s_tracing_enabledFz8Tracing disabled via remote_config. Config: %s Value: %sTremote_configz7Tracing enabled via remote_config. Config: %s Value: %s_trace_http_header_tags)header_tagsz<Updated HTTP header tags configuration via remote_config: %s_logs_injectionz:Updated logs injection configuration via remote_config: %sz%Unsupported config: name=%s, value=%sN)ddtracer/   _samplerset_sampling_rulesrI   rJ   idrulescopy_tagsr	   r   sourcer   _httperror)config_nameconfig_valuerd   r/   r   r   r   _apply_config_change   s4   rz   c                 C   s   t | t| dt| d|t| dt| d|d}| D ]\}}|j| }|j|kr8||d t|| | qt	
d|  d S )Nlog_injection_enabledtracing_tagstracing_enabledtracing_header_tags)rh   rm   rF   ri   rk   rj   z'APM Tracing Received: %s from the Agent)r[   rg   rf   r!   r   	_rc_value	set_valuerz   valuerI   rJ   )rY   rd   config_mappingrx   new_rc_valueconfig_itemr   r   r   apm_tracing_rc   s   



r   )F)#enumrW   r   typingrb   envierr   ddtrace.internal.loggerr   ddtrace.internal.settings.httpr   ddtrace.internal.utils.formatsr   r   r   rI   requiresr   r   r%   r+   r4   r7   r9   IntFlagr:   rV   rN   Optionalstrr[   rf   rg   rz   r   r   r   r   r   <module>   s2    




	0