o
    i9                  
   @   sl  d dl m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 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' 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'l0m1Z1 d d(l2m3Z3 d d)l2m4Z4 e1e5Z6d*e7e8ef d+e7e8e8f d,e7e8ef fd-d.Z9d/e7d,e&fd0d1Z:d2ed,e;fd3d4Z<d5ed6ee f d,ed6ee f fd7d8Z=G d9d: d:e>Z?G d;d< d<e?Z@G d=d> d>e?ZAG d?d@ d@e?ZBG dAdB dBe?ZCG dCdD dDe?ZDG dEdF dFeEZFejGe@ejHeAejIeBejJeCejKeDiZLdGe7e8ef d,efdHdIZMe=dJe7dKe-d,ee fdLdMZNG dNdO dOeOeZPG dPdQ dQe4ZQdS )R    )EnumN)Any)Callable)Iterable)Optional)config)DEFAULT_CAPTURE_LIMITS)"DEFAULT_PROBE_CONDITION_ERROR_RATE)DEFAULT_PROBE_RATE)DEFAULT_SNAPSHOT_PROBE_RATE)DEFAULT_TRIGGER_PROBE_RATECaptureExpression)CaptureLimits)ExpressionTemplateSegment)FunctionProbe)	LineProbe)LiteralTemplateSegment)LogFunctionProbe)LogLineProbe)MetricFunctionProbe)MetricLineProbe)Probe)ProbeEvalTiming)	ProbeType)SpanDecoration)SpanDecorationFunctionProbe)SpanDecorationLineProbe)SpanDecorationTag)SpanFunctionProbe)StringTemplate)TemplateSegment)TimingMixin)TriggerFunctionProbe)TriggerLineProbe)ProbeRegistry)ProbeStatusLogger)DDRedactedExpression)
get_logger)Payload)
RCCallbackdmappingreturnc                    s    fdd|   D S )Nc                    s   i | ]\}}  |||qS  )get).0kvr,   r.   Y/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/debugging/_probe/remoteconfig.py
<dictcomp>3   s    zxlate_keys.<locals>.<dictcomp>)items)r+   r,   r.   r3   r4   
xlate_keys2   s   r7   segmentc                 C   s@   d| v rt | d dS d| v rtt| dS d|  }t|)Nstr)	str_valuejson)exprzInvalid template segment: )r   r   r'   compile
ValueError)r8   msgr.   r.   r4   _compile_segment6   s   
r@   probec                 C   s@   | j dd }| j dd }|d u s|tjko|d u p|tjkS )Nversionenv)tagsr/   tracer_configrB   rC   )rA   probe_version	probe_envr.   r.   r4   _match_env_and_versionA   s
   rH   f.c                    s"   dt dt dtt f fdd}|S )Nargskwargsr-   c                     s   dd  | i |D S )Nc                 S   s   g | ]}t |r|qS r.   )rH   r0   _r.   r.   r4   
<listcomp>L   s    z@_filter_by_env_and_version.<locals>._wrapper.<locals>.<listcomp>r.   )rJ   rK   rI   r.   r4   _wrapperK   s   z,_filter_by_env_and_version.<locals>._wrapper)r   r   r   )rI   rP   r.   rO   r4   _filter_by_env_and_versionJ   s   rQ   c                   @   s   e Zd ZU dZeee  ed< dZeee	  ed< e
deeef deeef ddfddZe
deeef deeef defd	d
ZdS )ProbeFactoryN__line_class____function_class__rJ   attribsr-   c                 C   s   t  )N)NotImplementedErrorclsrJ   rU   r.   r.   r4   update_argsU   s   zProbeFactory.update_argsc                 C   s   |  || |d }|dd d ur3| jd u rtd|d |d< t|d d |d< | jdi |S | jd u r<td|d	pD|d
 |d< |dpO|d |d< t| jtrbt|dd |d< | jdi |S )Nwhere
sourceFilez Line probe type is not supportedsource_filelinesr   linez$Function probe type is not supportedtypetypeNamemodulemethod
methodName
func_qname
evaluateAtDEFAULTevaluate_atr.   )	rY   r/   rS   	TypeErrorintrT   
issubclassr"   r   )rX   rJ   rU   rZ   r.   r.   r4   buildY   s   

zProbeFactory.build)__name__
__module____qualname__rS   r   r_   r   __annotations__rT   r   classmethoddictr9   r   rY   rk   r.   r.   r.   r4   rR   Q   s   
 (,rR   c                   @   >   e Zd ZeZeZedee	e
f dee	e
f ddfddZdS )LogProbeFactoryrJ   rU   r-   Nc                 C   s   | dd}|r
tnt}| d}|d ur| d|}|jd|v r(t|d nd |d|v r?tdi t|d ddd	d
dntt	|dd | dg D | ddd | dg D d d S )NcaptureSnapshotFsamplingsnapshotsPerSecondwhencapture	max_levelmax_sizemax_len
max_fields)maxReferenceDepthmaxCollectionSize	maxLengthmaxFieldCountc                 S   s   g | ]	}t d i |qS )r.   r   rL   r.   r.   r4   rN      s    z/LogProbeFactory.update_args.<locals>.<listcomp>captureExpressionstemplatec                 S      g | ]}t |qS r.   r@   r0   r8   r.   r.   r4   rN          segments)	conditionratelimitscondition_error_ratetake_snapshotcapture_expressionsr   r   r.   )
r/   r   r
   updater'   r=   r   r7   r   r	   )rX   rJ   rU   r   r   ru   r.   r.   r4   rY   v   s4   

zLogProbeFactory.update_args)rl   rm   rn   r   rS   r   rT   rp   rq   r9   r   rY   r.   r.   r.   r4   rs   r   
    ,rs   c                   @   rr   )MetricProbeFactoryrJ   rU   r-   Nc              	   C   s\   |d |d d< |j d|v rt|d nd |d |d td|v r(t|d nd d d S )	Nprobe_idrD   zdebugger.probeidrw   
metricNamekindvalue)r   namer   r   r   r   r'   r=   r	   rW   r.   r.   r4   rY      s   
zMetricProbeFactory.update_args)rl   rm   rn   r   rS   r   rT   rp   rq   r9   r   rY   r.   r.   r.   r4   r      r   r   c                   @   s:   e Zd ZeZedeeef deeef ddfddZ	dS )SpanProbeFactoryrJ   rU   r-   Nc                 C   s(   |j d|v rt|d nd td d S )Nrw   )r   r   r   rW   r.   r.   r4   rY      s   
zSpanProbeFactory.update_args)
rl   rm   rn   r   rT   rp   rq   r9   r   rY   r.   r.   r.   r4   r      s    ,r   c                   @   rr   )SpanDecorationProbeFactoryrJ   rU   r-   Nc                 C   s$   |j |d dd |d D d d S )N
targetSpanc              	   S   s@   g | ]}t d |v rt|d  nddd |dg D dqS )rw   Nc                 S   sD   g | ]}t |d  t|d ddd |d dg D ddqS )r   r   r   c                 S   r   r.   r   r   r.   r.   r4   rN      r   zPSpanDecorationProbeFactory.update_args.<locals>.<listcomp>.<listcomp>.<listcomp>r   )r   r   )r   r   )r   r    r/   )r0   tr.   r.   r4   rN      s    zESpanDecorationProbeFactory.update_args.<locals>.<listcomp>.<listcomp>rD   )rw   rD   )r   r'   r=   r/   )r0   r+   r.   r.   r4   rN      s    
z:SpanDecorationProbeFactory.update_args.<locals>.<listcomp>decorations)target_spanr   )r   rW   r.   r.   r4   rY      s   
z&SpanDecorationProbeFactory.update_args)rl   rm   rn   r   rS   r   rT   rp   rq   r9   r   rY   r.   r.   r.   r4   r      r   r   c                   @   rr   )TriggerProbeFactoryrJ   rU   r-   Nc                 C   sJ   |j |di dt|d t|d d|v rt|d nd td d S )Nru   cooldownInSeconds
session_idlevelrw   )r   r   r   r   r   )r   r/   r   ri   r'   r=   r	   rW   r.   r.   r4   rY      s   

zTriggerProbeFactory.update_args)rl   rm   rn   r$   rS   r#   rT   rp   rq   r9   r   rY   r.   r.   r.   r4   r      r   r   c                   @   s   e Zd ZdS )InvalidProbeConfigurationN)rl   rm   rn   r.   r.   r.   r4   r      s    r   rU   c              
   C   s   z
| d }| d }W n t y } ztd| d}~ww t|| ddtdd | d	g D d
}t|}|durB||| S td| )z&
    Create a new Probe instance.
    r_   idzInvalid probe attributes: %sNrB   r   c                 s   s    | ]	}| d dV  qdS ):   N)splitrL   r.   r.   r4   	<genexpr>   s    zbuild_probe.<locals>.<genexpr>rD   r   rB   rD   zUnsupported probe type: %s)KeyErrorr   rq   r/   PROBE_FACTORYrk   )rU   _type_iderJ   factoryr.   r.   r4   build_probe   s    

r   r   status_loggerc              
   C   sv   zt | gW S  ty     ty: } z!|jt| d | ddi dt|jt|fd g W  Y d }~S d }~ww )Nr   rB   r   r   )rA   error)	r   r   	Exceptionr   r   r/   r_   rl   r9   )r   r   r   r.   r.   r4   
get_probes  s   r   c                   @   s   e Zd ZdZdZdZdZdS )ProbePollerEventr   r         N)rl   rm   rn   
NEW_PROBESDELETED_PROBESMODIFIED_PROBESSTATUS_UPDATEr.   r.   r.   r4   r     s
    r   c                
   @   s   e Zd ZdZdeeee gdf deddde	ddf
d	d
Z
deeef deeef ddfddZdededdfddZdddZdddZdeje ddfddZdS )DebuggerRCCallbackzRemote config callback for dynamic instrumentation probes.

    The periodic() method emits probe status at every polling operation (with time-based throttling).
    The __call__() method processes dynamic instrumentation probe payloads when present.
    callbackNr   registryr%   diagnostics_intervalr-   c                 C   s(   || _ || _|| _|| _d| _i | _dS )aE  Initialize the debugger callback.

        Args:
            callback: Function to call when probe events occur
            status_logger: Logger for probe status messages
            registry: Probe registry for emitting status messages
            diagnostics_interval: Interval in seconds between status emissions
        g        N)	_callback_status_logger	_registry_diagnostics_interval_last_status_emission_configs)selfr   r   r   r   r.   r.   r4   __init__  s   
zDebuggerRCCallback.__init__prev_probesnext_probesc                    s   fdd   D } fdd  D }fdd   D }|r*| tj| |r3| tj| |r>| tj| dS dS )z6Dispatch events for new, deleted, and modified probes.c                       g | ]
\}}| vr|qS r.   r.   r0   rM   pr   r.   r4   rN   6      z=DebuggerRCCallback._dispatch_probe_events.<locals>.<listcomp>c                    r   r.   r.   r   )r   r.   r4   rN   7  r   c                    s(   g | ]\}}| v r| | kr|qS r.   r.   r   r   r.   r4   rN   8  s   ( N)r6   r   r   r   r   r   )r   r   r   
new_probesdeleted_probesmodified_probesr.   )r   r   r4   _dispatch_probe_events4  s   z)DebuggerRCCallback._dispatch_probe_events	config_idr   c                 C   sv   | j |i }|dvrdd t|| jD ni }tdt t  | 	|| |r2|| j |< dS | j 
|d dS )z+Update probes for a specific configuration.)NFc                 S   s   i | ]}|j |qS r.   )r   )r0   rA   r.   r.   r4   r5   E  r   z@DebuggerRCCallback._update_probes_for_config.<locals>.<dictcomp>z:[%s][P: %s] Dynamic Instrumentation, dispatch probe eventsN)r   r/   r   r   logdebugosgetpidgetppidr   pop)r   r   r   r   r   r.   r.   r4   _update_probes_for_configA  s   z,DebuggerRCCallback._update_probes_for_configc                 C   s*   | j  D ]}| |i  q| j   dS )zDelete all registered probes.N)r   valuesr   clear)r   r   r.   r.   r4   delete_all_probesQ  s   z$DebuggerRCCallback.delete_all_probesc                 C   sL   t   }|| j | jkrtdt t  | j	  || _| j
  dS )zPeriodic method called at every polling operation.

        Checks if it's time to emit probe status messages based on the diagnostics interval.
        zG[%s][P: %s] Dynamic Instrumentation: emitting probe status log messagesN)timer   r   r   r   r   r   r   r   log_probes_statusr   flush)r   current_timer.   r.   r4   periodicW  s   
zDebuggerRCCallback.periodicpayloadsc                 C   sb   t dt t  |D ]}|jdu r t dt t  q| |jj|j q| j	
  dS )zProcess dynamic instrumentation probe configuration payloads.

        Args:
            payloads: Sequence of configuration payloads to process
        z+[%s][P: %s] Dynamic Instrumentation UpdatedNzP[%s][P: %s] Dynamic Instrumentation: no RCM metadata for configuration; skipping)r   r   r   r   r   metadatar   r   contentr   r   )r   r   payloadr.   r.   r4   __call__i  s   
zDebuggerRCCallback.__call__)r-   N)rl   rm   rn   __doc__r   r   listr   r&   floatr   rq   r9   r   r   r   r   r   r   Sequencer)   r   r.   r.   r.   r4   r     s$    
&

r   )Renumr   r   r   typingr   r   r   r   r   ddtracer   rE   ddtrace.debugging._probe.modelr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   !ddtrace.debugging._probe.registryr%   ddtrace.debugging._probe.statusr&   ddtrace.debugging._redactionr'   ddtrace.internal.loggerr(   ddtrace.internal.remoteconfigr)   r*   rl   r   rq   r9   r7   r@   boolrH   rQ   objectrR   rs   r   r   r   r   r>   r   	LOG_PROBEMETRIC_PROBE
SPAN_PROBESPAN_DECORATION_PROBETRIGGER_PROBEr   r   r   ri   r   r   r.   r.   r.   r4   <module>   s    .*	!%	