U 췀gIu @sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z ddl m Z ddlmZmZddlmZmZddlZddlmZmZmZmZmZmZddlmZmZddlmZm Z m!Z!m"Z"dd l#m$Z$e$rdd l#m%Z%dd l#m&Z&dd l#m'Z'dd l#m(Z(ddl#m)Z)ddl#m*Z*ddl#m+Z+ddl#m,Z,ddl#m-Z-ddl#m.Z.ddl/m0Z0ddl/m1Z1ddl/m2Z2ddl/m3Z3ddl/m4Z4ddl/m5Z5ddl/m6Z6ddl/m7Z7ddl/m8Z8ddl/m9Z9ej:de;dd ed!d"d#Ze?ee e!e"gZ@eeAd$jBd%ZCeeAd&jBd'ZDeeAd(jBd%ZEd)d*ZFd+d,ZGe d-d.ZHd/d0ZIGd1d2d2e ZJGd3d4d4eJZKGd5d6d6eJZLGd7d8d8eJZMGd9d:d:eJZNd;d<ZOd=d>ZPeKeLeMeNd?ZQed@dAdBdAedCdAdDdAdEdAdFdAdGZRGdHdIdIZSGdJdKdKZTdLdMZUdNdOZVdPdQZWdRdSZXdcdVdWZYeYZZGdXdYdYZ[ddd[d\Z\ded]d^Z]dfd_d`Z=dgdadbZ^dS)hN)ABCabstractmethod)contextmanager)datetimetimezone)wrapspartial) ContextVarnownanosecond_time to_timestampserialize_frame json_dumps)EnvelopeItem)TRANSACTION_SOURCE_ROUTETRANSACTION_SOURCE_VIEWTRANSACTION_SOURCE_COMPONENTTRANSACTION_SOURCE_TASK) TYPE_CHECKING)Any)Callable)Dict) Generator)Iterable)List)Optional)Set)Tuple)Union) BucketKey) DurationUnit)FlushedMetricValue)MeasurementUnit) MetricMetaKey)MetricTagValue) MetricTags)MetricTagsInternal) MetricType) MetricValuezThe sentry_sdk.metrics module is deprecated and will be removed in the next major release. Sentry will reject all metrics sent after October 7, 2024. Learn more: https://sentry.zendesk.com/hc/en-us/articles/26369339769883-Upcoming-API-Changes-to-Metrics) stacklevel in_metricsF)defaultz[^a-zA-Z0-9_]+z[^a-zA-Z0-9_\-.]+_z[^a-zA-Z0-9_\-.\/]+c Cs"tddddddd}||S)Nz\nz\rz\tz\\z\u{7c}z\u{2c})   \|,)str maketrans translate)valuetabler;@/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/metrics.py_sanitize_tag_valueSs r=cCs4zt|}Wntk r$YdSXt|dddS)NFT)Zinclude_local_variablesZinclude_source_context)sys _getframe Exceptionr )r+Zfrmr;r;r<get_code_locationbsrAc cs.t}tdz |VW5t|XdS)z5Enters recursion protection and returns the old flag.TN) _in_metricsgetset)Zold_in_metricsr;r;r<recursion_protectionns   rEcstfdd}|S)zYConvenient decorator that uses `recursion_protection` to make a function a noop. c s0t }|s"||W5QRSW5QRXdSN)rE)argskwargsr,funcr;r<new_funcszmetrics_noop..new_func)r)rJrKr;rIr< metrics_noopzsrLc@sDeZdZdZeddZeeddZeddZedd Z d S) Metricr;cCsdSrFr;selffirstr;r;r<__init__szMetric.__init__cCsdSrFr;rOr;r;r<weightsz Metric.weightcCsdSrFr;rOr9r;r;r<addsz Metric.addcCsdSrFr;rRr;r;r<serialize_valueszMetric.serialize_valueN) __name__ __module__ __qualname__ __slots__rrQpropertyrSrUrVr;r;r;r<rMs   rMc@s4eZdZdZddZeddZddZdd Zd S) CounterMetricr9cCst||_dSrFfloatr9rNr;r;r<rQszCounterMetric.__init__cCsdSNr;rRr;r;r<rSszCounterMetric.weightcCs|jt|7_dSrF)r9r_rTr;r;r<rUszCounterMetric.addcCs|jfSrFr]rRr;r;r<rVszCounterMetric.serialize_valueN rWrXrYrZrQr[rSrUrVr;r;r;r<r\s  r\c@s4eZdZdZddZeddZddZdd Zd S) GaugeMetriclastminmaxsumcountcCs*t|}||_||_||_||_d|_dSr`r_rerfrgrhrirNr;r;r<rQs zGaugeMetric.__init__cCsdS)Nr;rRr;r;r<rSszGaugeMetric.weightcCsJt|}||_t|j||_t|j||_|j|7_|jd7_dSr`rjrTr;r;r<rUs zGaugeMetric.addcCs|j|j|j|j|jfSrFrdrRr;r;r<rVs zGaugeMetric.serialize_valueNrbr;r;r;r<rcs    rcc@s4eZdZdZddZeddZddZdd Zd S) DistributionMetricr]cCst|g|_dSrFr^rNr;r;r<rQszDistributionMetric.__init__cCs t|jSrFlenr9rRr;r;r<rSszDistributionMetric.weightcCs|jt|dSrF)r9appendr_rTr;r;r<rUszDistributionMetric.addcCs|jSrFr]rRr;r;r<rVsz"DistributionMetric.serialize_valueNrbr;r;r;r<rls  rlc@s4eZdZdZddZeddZddZdd Zd S) SetMetricr]cCs |h|_dSrFr]rNr;r;r<rQszSetMetric.__init__cCs t|jSrFrmrRr;r;r<rSszSetMetric.weightcCs|j|dSrF)r9rUrTr;r;r<rUsz SetMetric.addcsddfdd|jDS)NcSs&t|trt|dd@St|S)Nutf-8l) isinstancer6zlibcrc32encodeint)xr;r;r<_hashs z(SetMetric.serialize_value.._hashc3s|]}|VqdSrFr;).0r9rxr;r< !sz,SetMetric.serialize_value..r]rRr;rzr<rVszSetMetric.serialize_valueNrbr;r;r;r<rps  rpcCsBt}|j}|D]$\}}|D]\}}|\}}} } t|}t| } ||d|d|| d|D]} |d|t| dqv|d||d| r|dd} | D]P\} }t | } | sq| rd} n|d || d|d|t |dq|d |t|d|d q$q| S) Nrq@:|asciis|#TF,s|T ) ioBytesIOwriteitems_sanitize_metric_key_sanitize_unitrurVr6_sanitize_tag_keyr=getvalue)flushable_bucketsout_write timestampbuckets bucket_keymetric metric_typeZ metric_nameZ metric_unitZ metric_tagsZserialized_valuerPZtag_key tag_valuer;r;r<_encode_metrics$s@    rc CsZi}|D]B\}}|\}}}d|t|t|}d|d<||g|qt||dS)Nz{}:{}@{}locationtype)rmapping)formatrr setdefaultror) rcode_locationsrkeylocrnameunitZmrir;r;r<_encode_locationsTs  r)cgdscCs tdS)Ng@@r r;r;r;r<nrcCs tdS)Ng.Arr;r;r;r<rorcCs tdS)NgN@r r;r;r;r<rqrcCs tdS)N @rr;r;r;r<rrrcCstddS)Nr8@rr;r;r;r<rsrcCstdddS)Nrrg@rr;r;r;r<rtr)Z nanosecond microsecondZ millisecondsecondminutehourdayweekc@s(eZdZdZddZddZddZdS) LocalAggregator _measurementscCs i|_dSrFrrRr;r;r<rQ{szLocalAggregator.__init__c Csd|||f}||f}|j|}|dk r\|\} } } } t| |} t| |} | d7} | |7} n|} } } d} | | | | f|j|<dS)Nz%s:%s@%sra)rrCrfrg) rOtyrr9rtags export_keyroldv_minv_maxv_countv_sumr;r;r<rUs       zLocalAggregator.addc CsJi}|jD]6\\}}\}}}}||gt|||||dq|S)N)rrfrgrirh)rrrro _tags_to_dict)rOrvrrrrrrr;r;r<to_jsons   zLocalAggregator.to_jsonN)rWrXrYrZrQrUrr;r;r;r<rxsrc@seZdZdZdZdZd!ddZddZd d Zd d Z d dZ ddZ e d"ddZ d#ddZe ddZddZe ddZddZdd ZdS)$MetricsAggregatorg$@ig@FcCsfi|_||_t|_i|_d|_||_d|_t |_ t |_ d|_ t|j|_d|_d|_dS)NrTF)r_enable_code_locations_set_seen_locations_pending_locations_buckets_total_weight _capture_func_running threadingLock_lockEvent _flush_event _force_flushrandomROLLUP_IN_SECONDS _flush_shift_flusher _flusher_pid)rOZ capture_funcZenable_code_locationsr;r;r<rQs  zMetricsAggregator.__init__c Cs|js dSt}|j|kr dS|jr|j|kr@W5QRdS||_tj|jd|_d|j_ z|j Wn&t k rd|_YW5QRdSXW5QRXdS)zFor forking processes we might need to restart this thread. This ensures that our process actually has that thread running. FT)target) rosgetpidrrrThread _flush_looprdaemonstart RuntimeError)rOpidr;r;r<_ensure_threads"  z MetricsAggregator._ensure_threadcCs8td|js|jr4|jr*|j|j|q dSNT)rBrDrrrwaitFLUSHER_SLEEP_TIME_flushrRr;r;r<rs   zMetricsAggregator._flush_loopcCs|||dSrF)_emit_flushable_buckets_flushable_locationsrRr;r;r<rszMetricsAggregator._flushc Cs|j|j}t|j|j}d}d}|rL|j}i|_d|_d|_njg}|jD]\}}||krZ|||fqZ|D](\}}| D]}||j 7}q|j|=q~|j|8_W5QRX|S)Nr;rF) rrtimerrrrrrovaluesrS)rOZ force_flushcutoffrZweight_to_removeZbuckets_timestamprrr;r;r<rs(     z$MetricsAggregator._flushable_bucketsc Cs"|j|j}i|_W5QRX|SrF)rr)rO locationsr;r;r<rsz&MetricsAggregator._flushable_locationsNrc  Cs$|r|jdkrdS|dkr(t}nt|tr:t|}t||j|j} t|} |||| f} |j x|j | i} | | } | dk r| j }| |nt||} | | <d}| j |}|dk r|||||d|W5QRX||dk r t|dkr|n|}|||||| dS)Nrr*r)rrrrrrr rvr_serialize_tagsrrrrCrSrU METRIC_TYPESrecord_code_location_consider_force_flushr_)rOrrr9rrrlocal_aggregatorr+Zbucket_timestampZserialized_tagsrZ local_bucketsrZprevious_weightaddedZ local_valuer;r;r<rU"s<        zMetricsAggregator.addc Cs|js dS|dkrt}|||f}t|tjjdddddd}tt|}||f|j kr|j ||ft |d}|dk r|j |g||fdS)Nrrrrrtzinfo)rrr fromtimestamprutcreplacervr rrUrArrro) rOrrrr+rmeta_key start_of_dayrr;r;r<rZs(    z&MetricsAggregator.record_code_locationcCsL|jr dS|||f}t|tjjdddddd}tt|}||f|jkS)NFrr) rrrrrrrvr r)rOrrrrrrr;r;r<need_code_locationws   z$MetricsAggregator.need_code_locationcCs(|jdkrdSd|_|jd|_dS)NF)rrrrDrRr;r;r<kills   zMetricsAggregator.killcCsd|_|dSr)rrrRr;r;r<flushszMetricsAggregator.flushcCs.t|j|j}||jkr*d|_|jdSr)rnrr MAX_WEIGHTrrrD)rOZ total_weightr;r;r<rs z'MetricsAggregator._consider_force_flushcCsjt}|r$t|}|t|dd|D]$\}}t||}|t|ddq,|jrf|||SdS)NZstatsd)payloadrZ metric_meta)rrZadd_itemrrrr)rOrrenvelopeZencoded_metricsrrZencoded_locationsr;r;r<rs  zMetricsAggregator._emit)F)NNr)N)rWrXrYrrrrQrrrrrrLrUrrrrrrr;r;r;r<rs0 ! =    rcCsx|sdSg}|D]V\}}t|ttfrP|D]}|dk r.||t|fq.q|dk r||t|fqtt|S)Nr;)rrrlisttupleror6sorted)rrrr9Z inner_valuer;r;r<rsrcCsTi}|D]F\}}||}|dk rFt|tr8||qN||g||<q|||<q|SrF)rCrrrro)rrZtag_namer old_valuer;r;r<rs     rcCs$t}|r |jdk r |jSdSrF) sentry_sdk get_client is_activemetrics_aggregator)clientr;r;r<_get_aggregatorsrc Cst}|r|jdkr$dd|fSt|p,d}|d|jd|d|jdt}d}|j d}|t kr|j } | r|d| |j dk r|j }|j di} | d} | dk rt.} | s| ||||sdd|fW5QRSW5QRX|j||fS)Nr;release environmentsourceZ transactionZ _experimentsZbefore_emit_metric)rrrrdictroptionsZget_current_scopeZ_transaction_inforCGOOD_TRANSACTION_SOURCESZ _transaction_spanZ_get_local_aggregatorrE) rr9rrrZ updated_tagsscoperZtransaction_sourceZtransaction_nameZ experimentsZbefore_emit_callbackr,r;r;r<_get_aggregator_and_update_tagss.        r ?nonec Cs8t||||\}}}|dk r4|d|||||||dS)zIncrements a counter.Nrr rUrr9rrrr+ aggregatorrr;r;r< increments"  rc@s4eZdZddZddZddZddZd d Zd S) _TimingcCs4||_||_||_||_||_d|_d|_||_dSrF)rrrr9renteredr r+)rOrrrr9rr+r;r;r<rQs z_Timing.__init__cCs|jdk rtd|dS)Nz0cannot use timing as %s when a value is provided)r9 TypeError)rOcontextr;r;r<_validate_invocation2s z_Timing._validate_invocationcCst|j|_|dtjd|jd|_|jrt|j D]8\}}t |t t frdd ttt|}|j||q:|jt}|dk r|d|j|j|j|S)Nzcontext-managerz metric.timing)oprr5r)TIMING_FUNCTIONSrrrrZ start_spanrr rrrrrrjoinrmapr6Zset_tag __enter__rrr+)rOrr9rr;r;r<r9s  z_Timing.__enter__c Cs||jstdt|j|j|j|j\}}}|dk rbt|j|j}| d|j||j||j |d|j |||d|_dS)Nz did not enterr) r AssertionErrorr rr9rrrrrUr__exit__)rOexc_type exc_valuetbrrrelapsedr;r;r<rLs*  z_Timing.__exit__cs$dtfdd}|S)N decoratorc sBtjjjjjdd||W5QRSQRXdS)Nra)rrrrr+)timingrrrrr+)rGrHfrOr;r< timed_funcisz$_Timing.__call__..timed_func)rr)rOr%r&r;r$r<__call__es  z_Timing.__call__N)rWrXrYrQrrrr'r;r;r;r<rs rrc CsN|dk rrrwarningsrsabcrr contextlibrrr functoolsrrrZsentry_sdk.utilsr r r r r rZsentry_sdk.enveloperrZsentry_sdk.tracingrrrrtypingrrrrrrrrrrrZsentry_sdk._typesr r!r"r#r$r%r&r'r(r)warnDeprecationWarningrBrDr frozensetrcompilesubrrrr=rArErLrMr\rcrlrprrrrrrrrrr rincrrr#r(r)r;r;r;r<s                           00  6  $ \