
    uYfۃ              
       b   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/m0Z0 d!d#l1m2Z2 ejf                  d$k\  rd d%lm4Z4 nd d%l5m4Z4  e%e6      Z7d&Z8d' Z9d( Z:d) Z;e4d*   Z<ede=e>e?e@e	d+   ee?d+f   f   ZA G d, d-      ZBd. ZCd/ ZD G d0 d1eE      ZFy)2    )deepcopyN)Any)Callable)Dict)List)Optional)Tuple)Union)get_mp_context)"in_azure_function_consumption_plan)in_gcp_function)cachedmethod)DDTraceDeprecationWarning)	deprecate   )gitmetadata)_PROPAGATION_STYLE_DEFAULT)DEFAULT_BUFFER_SIZE)DEFAULT_MAX_PAYLOAD_SIZE)DEFAULT_PROCESSING_INTERVAL)DEFAULT_REUSE_CONNECTIONS)DEFAULT_SAMPLING_RATE_LIMIT)DEFAULT_TIMEOUT)PROPAGATION_STYLE_ALL)PROPAGATION_STYLE_B3_SINGLE)
get_logger)DEFAULT_SPAN_SERVICE_NAME)in_aws_lambda)asbool)parse_tags_str)Pin   )
HttpConfig)IntegrationConfig)      )Literala1  (?ix)(?:(?:"|%22)?)(?:(?:old[-_]?|new[-_]?)?p(?:ass)?w(?:or)?d(?:1|2)?|pass(?:[-_]?phrase)?|secret|(?:api[-_]?|private[-_]?|public[-_]?|access[-_]?|secret[-_]?|app(?:lication)?[-_]?)key(?:[-_]?id)?|token|consumer[-_]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\s|%20)*(?:=|%3D)[^&]+|(?:"|%22)(?:\s|%20)*(?::|%3A)(?:\s|%20)*(?:"|%22)(?:%2[^2]|%[^2]|[^"%])+(?:"|%22))|(?: bearer(?:\s|%20)+[a-z0-9._\-]+|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\w=-]|%3D)+\.ey[I-L](?:[\w=-]|%3D)+(?:\.(?:[\w.+/=-]|%3D|%2F|%2B)+)?|-{5}BEGIN(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY-{5}[^\-]+-{5}END(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY(?:-{5})?(?:\n|%0A)?|(?:ssh-(?:rsa|dss)|ecdsa-[a-z0-9]+-[a-z0-9]+)(?:\s|%20|%09)+(?:[a-z0-9/.+]|%2F|%5C|%2B){100,}(?:=|%3D)*(?:(?:\s|%20|%09)+[a-z0-9._-]+)?)c                 Z   g }t        j                  | |      }|y|j                  d      D ]z  }|j                         j	                         }|dk(  rt        dddt               t        }|sB|t        vr t        d	j                  || t                    |j                  |       | |S )
aC  Helper to parse http propagation extract/inject styles via env variables.

    The expected format is::

        <style>[,<style>...]


    The allowed values are:

    - "datadog"
    - "b3multi"
    - "b3" (formerly 'b3 single header')
    - "b3 single header (deprecated for 'b3')"
    - "tracecontext"
    - "none"


    The default value is ``"datadog,tracecontext"``.


    Examples::

        # Extract and inject b3 headers:
        DD_TRACE_PROPAGATION_STYLE="b3multi"

        # Disable header propagation:
        DD_TRACE_PROPAGATION_STYLE="none"

        # Extract trace context from "x-datadog-*" or "x-b3-*" headers from upstream headers
        DD_TRACE_PROPAGATION_STYLE_EXTRACT="datadog,b3multi"

        # Inject the "b3: *" header into downstream requests headers
        DD_TRACE_PROPAGATION_STYLE_INJECT="b3"
    defaultN,zb3 single headerzAUsing DD_TRACE_PROPAGATION_STYLE="b3 single header" is deprecatedz4Please use 'DD_TRACE_PROPAGATION_STYLE="b3"' insteadz3.0.0)messageremoval_versioncategoryz=Unknown style {!r} provided for {!r}, allowed values are {!r})osgetenvsplitstriplowerr   r   r   r   
ValueErrorformatappend)namer*   stylesenvvarstyles        W/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/ddtrace/settings/config.py_parse_propagation_stylesr<   _   s    H FYYtW-F~c" ##%&&SP '2	 0E--OVV4!6 
 	e%& M    c                     | j                         D ]9  \  }}t        |t              r|j                  |i       }t	        ||       5|||<   ; |S )z
    Merge the first provided ``dict`` into the second.

    :param dict source: The ``dict`` to merge into ``destination``
    :param dict destination: The ``dict`` that should get updated
    :rtype: dict
    :returns: ``destination`` modified
    )items
isinstancedict
setdefault
_deepmerge)sourcedestinationkeyvaluenodes        r;   rC   rC      sU     lln %
UeT"))#r2Dud#$K% r=   c                 P   g }| j                         } | j                  d      }|D ]S  }|j                  d      }	 |D cg c]  }t        |       }}t        |      t        |      f}|j                  |       U |S c c}w # t        $ r t        j                  d|       Y ~w xY w)Nr+   -z&Error status codes was not a number %s)	r2   r1   intr4   log	exceptionminmaxr6   )error_range_strerror_rangeserror_ranges_strerror_rangevaluesvs         r;   get_error_rangesrV      s    L%++-O&,,S1' 	)""3'	&,-c!f-F- 6{CK0K(	)  . 	MMBFK	s"   BA>B>BB%$B%)r*   env_varcoderemote_config	_JSONTypec                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
_ConfigItemzNConfiguration item that tracks the value of a setting, and where it came from.c                     || _         d | _        d | _        d | _        t	        |      r |       | _        n|| _        || _        |D ]7  \  }}|t        j                  v s |t        j                  |         | _         y  y N)	_name
_env_value_code_value	_rc_valuecallable_default_value_envsr/   environ)selfr7   r*   envsrW   parsers         r;   __init__z_ConfigItem.__init__   sw    
%)&*$(G"))D")D
# 	OGV"**$"(G)<"=	r=   c                 j    |dk(  r|| _         y |dk(  r|| _        y t        dj                  |            )NrX   rY   zInvalid source: {})ra   rb   r4   r5   )rg   rG   rD   s      r;   set_value_sourcez_ConfigItem.set_value_source   s8    V$D&"DN188@AAr=   c                     || _         y r^   )ra   rg   rG   s     r;   set_codez_ConfigItem.set_code   s
     r=   c                     d | _         y r^   )rb   rg   s    r;   unset_rcz_ConfigItem.unset_rc   s	    r=   c                     | j                   | j                   S | j                  | j                  S | j                  | j                  S | j                  S r^   )rb   ra   r`   rd   rq   s    r;   rG   z_ConfigItem.value   sN    >>%>>!'###??&??""""r=   c                 R    | j                   y| j                  y| j                  yy)NrY   rX   rW   r*   )rb   ra   r`   rq   s    r;   rD   z_ConfigItem.source   s.    >>%"'??&r=   c                     dj                  | j                  j                  | j                  | j                  | j
                  | j                  | j                        S )NzI<{} name={} default={} env_value={} user_value={} remote_config_value={}>)r5   	__class____name__r_   rd   r`   ra   rb   rq   s    r;   __repr__z_ConfigItem.__repr__   sI    ZaaNN##JJOONN
 	
r=   N)rw   
__module____qualname____doc__rj   rl   ro   rr   rG   rD   rx    r=   r;   r\   r\      s)    X B!#
r=   r\   c                 >    t        j                  t        |             S r^   )r   
clean_tagsr    )ss    r;   _parse_global_tagsr     s    !!."344r=   c                  t   t        dddt        fg      t        dddt        fg      t        dd	d
t        fg      t        dd dt        fg      t        dd dt        fg      t        dddt        fg      t        dd	dt        fg      t        dd	dt        fg      t        dd	dt        fg      d	S )Ntrace_enabledTDD_TRACE_ENABLED)r7   r*   rh   trace_sample_rate      ?DD_TRACE_SAMPLE_RATElogs_injectionFDD_LOGS_INJECTIONtrace_http_header_tagsc                      i S r^   r|   r|   r=   r;   <lambda>z!_default_config.<locals>.<lambda>$      B r=   DD_TRACE_HEADER_TAGStagsc                      i S r^   r|   r|   r=   r;   r   z!_default_config.<locals>.<lambda>)  r   r=   DD_TAGStracing_enabledprofiling_enabledDD_PROFILING_ENABLEDasm_enabledDD_APPSEC_ENABLEDdsm_enabledDD_DATA_STREAMS_ENABLED)	_trace_enabled_trace_sample_rater   r   r   _tracing_enabled_profiling_enabled_asm_enabled_dsm_enabled)r\   r   floatr    r   r|   r=   r;   _default_configr     s    & %v./

 *$)512

 &!&/0

 #.))>:;#

 012

 ("%v./

 *$)623

 $&/0

 $,f56
S. .r=   c                   B    e Zd ZdZ e       rdn e       j                  d      Z G d de      Z	d Z
defdZd	eddfd
Zd Zd ZddZd Zd Z e       d        Zd dZd Zd Zd Z fdZd Zd Zd Zd Zd dZd Z de!e"ee#f      de#eef   fdZ$d Z% xZ&S )!ConfigzConfiguration object that exposes an API to set and retrieve
    global settings for each integration. All integrations must use
    this instance to register their defaults, so that they're public
    available and can be updated by users.
    N   c                   ~    e Zd ZdZ ee      Zed        Zej                  d        Zed        Z	 e
       d        Zy)Config._HTTPServerConfigz500-599c                     | j                   S r^   )_error_statusesrq   s    r;   error_statusesz'Config._HTTPServerConfig.error_statusesP  s     '''r=   c                 f    || _         t        |      | _        | j                  j	                          y r^   )r   rV   _error_rangesis_error_code
invalidatern   s     r;   r   z'Config._HTTPServerConfig.error_statusesU  s+     $)D !1%!8D))+r=   c                     | j                   S r^   )r   rq   s    r;   rQ   z%Config._HTTPServerConfig.error_ranges]  s     %%%r=   c                 P    | j                   D ]  }|d   |cxk  r
|d   k  s y  y)a  Returns a boolean representing whether or not a status code is an error code.
            Error status codes by default are 500-599.
            You may also enable custom error codes::

                from ddtrace import config
                config.http_server.error_statuses = '401-404,419'

            Ranges and singular error codes are permitted and can be separated using commas.
            r   r"   TF)rQ   )rg   status_coderS   s      r;   r   z&Config._HTTPServerConfig.is_error_codeb  s<      $00  q>[BKNB C  r=   N)rw   ry   rz   r   rV   r   propertyr   setterrQ   r   r   r|   r=   r;   _HTTPServerConfigr   L  sg    #(9		( 
	( 
			, 
	, 
	& 
	& 
	 
	r=   r   c           	      0   t               | _        i | _        t        t	        j
                  dd            | _        t        t	        j
                  dd            | _        t        t	        j
                  dt                    | _
        t	        j
                  d      | _        t        t	        j
                  dd            | _        t        t	        j
                  d	d
            | _        t        t	        j
                  dd            | _        t        | j                         | _        t        t	        j
                  dd            | _        t'        t	        j
                  dt	        j
                  dd                  | _        t	        j
                  d      | _        t        t	        j
                  dt,                    | _        t        t	        j
                  dt0                    | _        t'        t	        j
                  dt4                    | _        t        t	        j
                  dt8                    | _        t        t        j<                  j?                  dd            | _         t        j<                  j?                  dt        j<                  j?                  d            | _!        t        j<                  j?                  dt        j<                  j?                  d            | _"        t        j<                  j?                  d      | _#        t        j<                  j?                  dt        j<                  j?                  d            | _$        t	        j
                  d      | _%        t	        j
                  d      | _&        t'        t	        j
                  dtN                    | _(        t        t	        j
                  d d!            | _)        t	        j
                  d"d      }t        t	        j
                  d#|            | _*        t	        j
                  d$      | _+        t        t	        j
                  d%d            | _,        t        t	        j
                  d&d            | _-        t	        j
                  d'      xs | j\                  j?                  d(      | _/        t	        j
                  d)| j\                  j?                  d*t`                    | _1        | jb                  Lte               rBt        j<                  j?                  d+t        j<                  j?                  d,            | _1        | jb                  .tg               r$t        j<                  j?                  d-      | _1        ti               | _5        t	        j
                  d.| j\                  j?                  d/            | _6        | jo                         | _8        t	        j
                  d0d1      | _9        tu        | jr                        | _;        | jb                  rd*| j\                  v r| j\                  d*= | jl                  rd/| j\                  v r| j\                  d/= t        t	        j
                  d2d            | _<        t        t	        j
                  d3d            | _=        t        t	        j
                  d4d            | _>        t'        t	        j
                  d5d6            | _?        t        t	        j
                  d7d            | _@        t        t	        j
                  d8d            | _A        t        t	        j
                  d9d            | _B        t        t	        j
                  d:d            | _C        t	        j
                  d;      | _D        t	        j
                  d<      | _E        t        d=t              x| _H        | _I        t        d>d       }||| _H        t        d?d       }||| _I        t        t	        j
                  d@d            | _J        t        t	        j
                  dAdB            }|dCk  rt        dDj                  |            || _M        |dCkD  | _N        t        t	        j
                  dEd            | _O        te               xs
 tg               }t        t	        j
                  dFt	        j
                  dG|                  | _P        t        t	        j
                  dHd            | _Q        t	        j
                  dIt              }d| _S        d | _T        d| _U        |d1k7  r1d| _S        	 t        j                  |j                  dJ            | _T        t        t	        j
                  dMd            | _\        t	        j
                  dNd1      | _]        t        t	        j
                  dOd            | _^        t	        j
                  dPdQ      | __        t        t	        j
                  dRd            | _`        | j                  rdSt        j<                  dT<   d| _a        g | _b        t        t	        j
                  dUd            | _c        t	        j
                  dV      | _d        t	        j
                  dWd       | _e        t	        j
                  dXd       | _f        t	        j
                  dYd       | _g        t	        j
                  dZ      | _h        t	        j
                  d[d\      | _i        t        t	        j
                  d]d            | _j        t'        t	        j
                  d^d_            | _k        t	        j
                  d`      | _l        y # t        $ r" t        j                  dKdL       d| _U        Y $w xY w)aNDD_TRACE_DEBUGFr)   DD_TRACE_STARTUP_LOGSDD_TRACE_RATE_LIMITDD_TRACE_SAMPLING_RULESDD_TRACE_PARTIAL_FLUSH_ENABLEDT DD_TRACE_PARTIAL_FLUSH_MIN_SPANSi,  DD_PRIORITY_SAMPLINGheader_tagsDD_REMOTE_CONFIGURATION_ENABLED&DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDSDD_REMOTECONFIG_POLL_SECONDSg      @DD_TRACE_API_VERSION!DD_TRACE_WRITER_BUFFER_SIZE_BYTES&DD_TRACE_WRITER_MAX_PAYLOAD_SIZE_BYTES DD_TRACE_WRITER_INTERVAL_SECONDS!DD_TRACE_WRITER_REUSE_CONNECTIONS#_DD_TRACE_WRITER_LOG_ERROR_PAYLOADSDD_AGENT_HOSTDD_TRACE_AGENT_HOSTNAMEDD_AGENT_PORTDD_TRACE_AGENT_PORTDD_TRACE_AGENT_URLDD_DOGSTATSD_HOSTDD_DOGSTATSD_PORTDD_DOGSTATSD_URLDD_TRACE_AGENT_TIMEOUT_SECONDS DD_TRACE_SPAN_TRACEBACK_MAX_SIZE   DD_ANALYTICS_ENABLEDDD_TRACE_ANALYTICS_ENABLEDDD_TRACE_CLIENT_IP_HEADERDD_TRACE_CLIENT_IP_ENABLED)DD_TRACE_PROPAGATION_HTTP_BAGGAGE_ENABLEDDD_ENVenv
DD_SERVICEservice	K_SERVICEFUNCTION_NAMEWEBSITE_SITE_NAME
DD_VERSIONversionDD_SERVICE_MAPPING DD_TRACE_REPORT_HOSTNAMEDD_TRACE_HEALTH_METRICS_ENABLED$DD_INSTRUMENTATION_TELEMETRY_ENABLEDDD_TELEMETRY_HEARTBEAT_INTERVAL60*DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLEDDD_RUNTIME_METRICS_ENABLED+DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED(DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLEDDD_SPAN_SAMPLING_RULESDD_SPAN_SAMPLING_RULES_FILEDD_TRACE_PROPAGATION_STYLE"DD_TRACE_PROPAGATION_STYLE_EXTRACT!DD_TRACE_PROPAGATION_STYLE_INJECT"DD_TRACE_PROPAGATION_EXTRACT_FIRST"DD_TRACE_X_DATADOG_TAGS_MAX_LENGTHr   r   zdInvalid value {!r} provided for DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH, only non-negative values allowedDD_TESTING_RAISEDD_TRACE_COMPUTE_STATS"DD_TRACE_STATS_COMPUTATION_ENABLEDr   (DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXPasciiz;Invalid obfuscation pattern, disabling query string tracing)exc_info!DD_CIVISIBILITY_AGENTLESS_ENABLEDDD_CIVISIBILITY_AGENTLESS_URLDD_CIVISIBILITY_ITR_ENABLEDDD_CIVISIBILITY_LOG_LEVELinfoDD_TRACE_OTEL_ENABLEDddcontextvars_contextOTEL_PYTHON_CONTEXTDD_TRACE_SPAN_AGGREGATOR_RLOCKDD_TRACE_METHODSDD_INSTRUMENTATION_INSTALL_IDDD_INSTRUMENTATION_INSTALL_TYPEDD_INSTRUMENTATION_INSTALL_TIME
DD_API_KEYDD_SITEzdatadoghq.comDD_LLMOBS_ENABLEDDD_LLMOBS_SAMPLE_RATEr   DD_LLMOBS_APP_NAME)mr   _config_integration_configsr   r/   r0   _debug_mode_startup_logs_enabledrK   r   _trace_rate_limit_trace_sampling_rules_partial_flush_enabled_partial_flush_min_spans_priority_samplingr#   r   http_remote_config_enabledr   _remote_config_poll_interval
_trace_apir   _trace_writer_buffer_sizer   _trace_writer_payload_sizer   _trace_writer_interval_secondsr   _trace_writer_connection_reuserf   get_trace_writer_log_err_payload_trace_agent_hostname_trace_agent_port_trace_agent_url_stats_agent_hostname_stats_agent_port_stats_agent_urlr   _agent_timeout_seconds_span_traceback_max_sizeanalytics_enabledclient_ip_headerretrieve_client_ip propagation_http_baggage_enabledr   r   r   r   r   r   set_extra_servicesr   r   http_server_unparsed_service_mappingr    service_mappingreport_hostnamehealth_metrics_enabled_telemetry_enabled_telemetry_heartbeat_interval _telemetry_dependency_collection_runtime_metrics_enabled_128_bit_trace_id_enabled!_128_bit_trace_id_logging_enabled_sampling_rules_sampling_rules_filer<   r   _propagation_style_extract_propagation_style_inject_propagation_extract_firstr4   r5   _x_datadog_tags_max_length_x_datadog_tags_enabled_raise_trace_compute_stats_data_streams_enabled0DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP_DEFAULT(global_query_string_obfuscation_disabled!_obfuscation_query_string_patternhttp_tag_query_stringrecompileencode	ExceptionrL   warning _ci_visibility_agentless_enabled_ci_visibility_agentless_url-_ci_visibility_intelligent_testrunner_enabledci_visibility_log_level_otel_enabled_ddtrace_bootstrapped_subscriptions_span_aggregator_rlocktrace_methods_telemetry_install_id_telemetry_install_type_telemetry_install_time_dd_api_key_dd_site_llmobs_enabled_llmobs_sample_rate_llmobs_ml_app)rg   legacy_config_valuepropagation_style_extractpropagation_style_injectx_datadog_tags_max_lengthtrace_compute_stats_default(dd_trace_obfuscation_query_string_regexps          r;   rj   zConfig.__init__s  s   &( %'!!")),<e"LM%+BII6Mu,U%V"!$RYY/DNi%j!k%'YY/H%I"&,RYY7Wae-f&g#(+BII6Xbe,f(g%"(3ISW)X"Y4+F+FG	&,RYY7Xbf-g&h#,1II8"))LjtwBx-
)
 ))$:;),II9CVW*
& +.II>H`a+
' /4II8B]^/
+ /5II9;TU/
+ .4BJJNNChjo4p-q*%'ZZ^^ORZZ^^TmEn%o"!#PeAf!g "

/C D%'ZZ^^ORZZ^^TgEh%i"!#+>!? "		*< =&+BII6VXg,h&i#(+BII6Xbd,e(f%
 !ii(>N!'		2NXk(l!m "		*E F"(3OY^)_"`06IIA5Q1
- 99X&>$))--*>yytyy}}YPi7jk<<O$5::>>+rzz~~o7VWDL<<$F$H::>>*=>DL"uyytyy}}Y7OP113)+3GQS)T&-d.L.LM <<I2		)$ <<I2		)$%bii0JTY&Z[&,RYY7Xbg-h&i#"(3Y[_)`"a-2299=^`d3e-f*06ryyAmos7t0u-(.ryy9UW\/](^%)/		:gim0n)o&17		Blns8t1u.!yy)AB$&II.K$L! Le(2LL
 	
'$*H
 %>>blp$q!$0.GD+#<=`jn#o #/-ED**0;_af1g*h' %(		2V`c(d$e!$q(7&23	  +D''@1'D$ RYY'95AB&5&7&_;];_#$*II("))4XZu*v%
!
 &,BII6OQV,W%X"359968h4
0 9=515.%)"3r9<AD939;<CCGL:6 17ryyAdns7t0u-,.II6U_a,b)=CII3TB>
: (*yy1LV\']$#BII.Eu$MN 1HBJJ,-%*" &,RYY7WY]-^&_#YY'9:%'YY/NPT%U"')yy1RTX'Y$')yy1RTX'Y$99\2		)_=%bii0CU&KL#(3JC)P#Q  ii(<==  3Ydhi-2*3s   )m* *'nnreturnc                     || j                   v r| j                   |   j                         S || j                  vrt        | |      | j                  |<   | j                  |   S r^   )r  rG   r	  r$   )rg   r7   s     r;   __getattr__zConfig.__getattr__-  s\    4<<<<%++--t000.?d.KD%%d+((..r=   service_namec                     | j                   y | j                  r-|| j                  k7  r	 | j                   j                  |       y y y # t        $ r Y y w xY wr^   )_extra_services_queuer  r   
put_nowaitrE  )rg   ra  s     r;   _add_extra_servicezConfig._add_extra_service6  s[    %%-&&<4<<+G**55lC ,H&  s   A 	AAc                 6   | j                   
t               S 	 	 | j                  j                  | j                   j	                  d             t        | j                        dkD  r| j                  j                          h# t        $ r Y | j                  S w xY w)NgMb`?)timeout@   )rc  r'  r(  addr  lenpoprE  rq   s    r;   _get_extra_serviceszConfig._get_extra_services?  s    %%-5L	$$(()C)C)G)GPU)G)VWt++,r1((,,.   	###	s   A)B 	BBc                 x    t        j                  |      }|t        j                  d|       i S |j                  S )zRetrieves the configuration for the given object.
        Any object that has an attached `Pin` must have a configuration
        and if a wrong object is given, an empty `dict` is returned
        for safety reasons.
        zNo configuration found for %s)r!   get_fromrL   debugr  )rg   objpins      r;   rn  zConfig.get_fromL  s5     ll3;II5s;I{{r=   c                     t        | |      }t        |      }|r%t        | |t        ||            | j                  |<   yt        | ||      | j                  |<   y)aS  Internal API that registers an integration with given default
        settings.

        :param str integration: The integration name (i.e. `requests`)
        :param dict settings: A dictionary that contains integration settings;
            to preserve immutability of these values, the dictionary is copied
            since it contains integration defaults.
        :param bool merge: Whether to merge any existing settings with those provided,
            or if we should overwrite the settings with those provided;
            Note: when merging existing settings take precedence.
        N)getattrr   r$   rC   r	  )rg   integrationsettingsmergeexistings        r;   _addzConfig._addY  s`     4-H% 6Gk:h#A6D%%k2 6Gt[Zb5cD%%k2r=   c                 <    | j                   j                  |       | S )a  
        Registers a set of headers to be traced at global level or integration level.
        :param whitelist: the case-insensitive list of traced headers
        :type whitelist: list of str or str
        :return: self
        :rtype: HttpConfig
        )r  trace_headers)rg   	whitelists     r;   rz  zConfig.trace_headersx  s     				*r=   c                 8    | j                   j                  |      S )z
        Returns whether or not the current header should be traced.
        :param header_name: the header name
        :type header_name: str
        :rtype: bool
        )r  header_is_tracedrg   header_names     r;   r}  zConfig.header_is_traced  s     yy))+66r=   c                 8    | j                   j                  |      S r^   )r  _header_tag_namer~  s     r;   r  zConfig._header_tag_name  s     yy))+66r=   c                 6    | j                   | j                   S |S )z
        Returns the globally configured service or the default if none is configured.

        :param default: the default service to use if none is configured or
            found.
        :type default: str
        :rtype: str|None
        )r   )rg   r*   s     r;   _get_servicezConfig._get_service  s      $||7t||DWDr=   c                     | j                   }dj                  | j                  j                               }dj	                  |j
                  |j                  |      S )Nz, z	{}.{}({}))rv   join_integration_configkeysr5   ry   rw   )rg   clsintegrationss      r;   rx   zConfig.__repr__  sE    nnyy!9!9!>!>!@A!!#..#,,MMr=   c                 >    | j                   j                  ||f       y r^   )rM  r6   )rg   r?   handlers      r;   
_subscribezConfig._subscribe  s    ""E7#34r=   c                 v    | j                   D ]%  \  }}|D cg c]	  }||v s| }}|s || |       ' y c c}w r^   )rM  )rg   changed_items	sub_itemssub_handlerisub_updated_itemss         r;   _notify_subscriberszConfig._notify_subscribers  sG    &*&9&9 	5"I{,9 LqQ)^ L L D"34	5 Ls   	66c                     |dk(  rt         | j                  |   ||      S || j                  v r| j	                  ||dfg       y t         | j                  |   ||      S )Nr  rX   )superrv   __setattr__r  _set_config_items)rg   rF   rG   rv   s      r;   r  zConfig.__setattr__  sb    ):3FFDLL ""S%$8#9::3FFr=   c                     g }|D ]6  \  }}}|j                  |       | j                  |   j                  ||       8 | j                  rddlm} |j                  |       | j                  |       y )Nr   )telemetry_writer)r6   r  rl   r.  internal.telemetryr  add_configs_changedr  )rg   r?   
item_namesrF   rG   originr  s          r;   r  zConfig._set_config_items  sn    
"' 	>Cc"LL..uf=	> ""=00<  ,r=   c                 "    t               | _        y r^   )r   r  rq   s    r;   _resetzConfig._reset  s    &(r=   c                 <    | j                   |   j                         S r^   )r  rD   )rg   items     r;   _get_sourcezConfig._get_source  s    ||D!((**r=   c                 Z    ddl m ddlm ddlm} ddlm  G fdd|      }|S )Nr   )PublisherSubscriberConnector)RemoteConfigPublisher)PubSub)RemoteConfigSubscriberc                   0    e Zd ZW ZW Z W         Zd Zy)7Config._remoteconfigPubSub.<locals>._GlobalConfigPubSubc                     | j                  | j                  d       | _        | j                  | j                  |d      | _        y )NGlobalConfig)__publisher_class____shared_data__
_publisher__subscriber_class___subscriber)rg   callbacks     r;   rj   z@Config._remoteconfigPubSub.<locals>._GlobalConfigPubSub.__init__  s<    "&":":4;O;OQU"V#'#<#<T=Q=QS[]k#l r=   N)rw   ry   rz   r  r  r  rj   )r  r  r  s   r;   _GlobalConfigPubSubr    s    "7#9 :<Omr=   r  ))ddtrace.internal.remoteconfig._connectorsr  )ddtrace.internal.remoteconfig._publishersr  %ddtrace.internal.remoteconfig._pubsubr  r  )rg   r  r  r  r  r  s      @@@r;   _remoteconfigPubSubzConfig._remoteconfigPubSub  s+    ZS@P	m 	m& 	m #"r=   c           	         t        |t              rt        |t              rd|vrt        j                  d|       y t	        |d         dk(  rt        j                  d|       y d }|d   D ]  }t        |t
              sd|v s|} n | j                  D ci c]  }|d  }}|rd|v r|d   }d|v r|d   |d<   d|v r|d   |d	<   d
|v r |d
   }|r| j                  |d
         }||d<   d|v r|d   t        |d         |d<   d|v r |d   }|r| j                  |d         }||d<   | j                  |j                         D 	
cg c]
  \  }	}
|	|
df c}
}	       | j                  |       y c c}w c c}
}	w )Nconfigzunexpected RC payload %rr   z#unexpected number of RC payloads %r
lib_configtracing_sampling_rater   log_injection_enabledr   tracing_tagsr   r   r   tracing_header_tagsr   rY   )r@   rA   rL   rF  rj  r   r  _format_tagsr   r  r?    _handle_remoteconfig_header_tags)rg   datatest_tracerr  config_itemnbase_rc_configr  r   krU   s              r;   _handle_remoteconfigzConfig._handle_remoteconfig  s   $%*T4*@XUYEYKK2D9tH~!#KK=tD > 	K+t,;.(F		 ,0<<8a!T'88lf,-J&*47ABY7Z34&*43=>U3V/0+!.1,,Z-GHD)-v& J.:>O3P3\5;JGX<Y5Z12$
2!"78,,Z8M-NOD;?78NDXDXDZ[DAqA 7[\--n=5 90  \s   
E/E4
c                     | j                   d   }|j                  xs i }|j                  xs i }i ||}|j                  d      xs |}t	        |      | _        y)zSImplements precedence order between remoteconfig header tags from code, env, and RCr   r   N)r  r`   ra   r  r#   r  )rg   r  header_tags_confenv_headerscode_headersnon_rc_header_tagsselected_header_tagss          r;   r  z'Config._handle_remoteconfig_header_tags  sg    <<(@A&117R'339r<<<-112JKaOa+?@	r=   r   c                     |si S t        |d   t              r|D cg c]  }|d   |d   f }}n|D cg c]  }|j                  d       }}|D ci c]  \  }}||
 c}}S c c}w c c}w c c}}w )Nr   headertag_name:)r@   r   r1   )rg   r   r  pairstr  rU   s          r;   r  zConfig._format_tags  sy    Id1gt$DHIDd8nd:&67IEI+/0aQWWS\0E0!&'A1'' J0's   A$A)A.c                     ddl m}  | j                         | j                        }|j	                  d|       |j	                  d|       |j	                  d|       y)z+Enable fetching configuration from Datadog.r   )remoteconfig_pollerAPM_TRACINGAGENT_CONFIG
AGENT_TASKN)$ddtrace.internal.remoteconfig.workerr  r  r  register)rg   r  remoteconfig_pubsubs      r;   enable_remote_configurationz"Config.enable_remote_configuration  sW     	M8d6689R9RS$$]4GH$$^5HI$$\3FGr=   )Tr^   )'rw   ry   rz   r{   r   r   Queuerc  objectr   rj   r   r`  strre  rl  rn  rx  rz  r}  r   r  r  rx   r  r  r  r  r  r  r  r  r  r   r
   r   r  r  __classcell__)rv   s   @r;   r   r   C  s     %2OD9I9O9OPS9T%F %Nx>t/3 /s t $d>	7 ^7 7
EN
55G
-)+#",>\A(eCI&6!7 (DcN (Hr=   r   )Gcopyr   r/   rB  systypingr   r   r   r   r   r	   r
   ddtrace.internal.compatr   ddtrace.internal.serverlessr   r   ddtrace.internal.utils.cacher   #ddtrace.internal.utils.deprecationsr   ddtrace.vendor.debtcollectorr   internalr   internal.constantsr   r   r   r   r   r   r   r   r   internal.loggerr   internal.schemar   internal.serverlessr   internal.utils.formatsr   r    rq  r!   r  r#   rt  r$   version_infor'   typing_extensionsrw   rL   r>  r<   rC   rV   _ConfigSourcerK   r   r  boolrZ   r\   r   r   r  r   r|   r=   r;   <module>r     s    	 	 
        2 J 7 5 I 2 " ; 4 9 < : < 0 6 < ( 7 / + 3   * v) )	 1\;~($ EF$UCtK/@$sKGWBXXY	@
 @
F5
0fbHV bHr=   