0iddlmZddlmZmZmZmZmZddlm Z ddl m Z ddl m Z e rddl mZmZmZddlmZdZd Zd Zd Zd Zd ZdZy))SPANDATA)"_COMMANDS_INCLUDING_SENSITIVE_DATA _MAX_NUM_ARGS_MAX_NUM_COMMANDS_MULTI_KEY_COMMANDS_SINGLE_KEY_COMMANDS)should_send_default_pii)SENSITIVE_DATA_SUBSTITUTE) TYPE_CHECKING)AnyOptionalSequence)Spanc|g}|j}t}t|D]\}}|tkDrnt|tvr|j t /|dk(}|r|j t|Q|r|j t|n|j t dj|}|S)Nr ) lowerr enumeraterrappendr reprjoin) nameargs command_partsname_lowsend_default_piiiargarg_is_the_keycommands R/opt/hc_python/lib/python3.12/site-packages/sentry_sdk/integrations/redis/utils.py_get_safe_commandr!sFMzz|H.0D/3 }   9 9  !: ; a   c +$$T#Y/$$%>?""hh}%G Ncxt|tr |jSt |S#t$rYywxYw)N) isinstancebytesdecodeUnicodeDecodeErrorstrkeys r _safe_decoder,/s<#u ::<  s8O"  s - 99ct|tttfrdj d|D}|St|t r t |}|S|d}|St|}|S)Nz, c32K|]}t|ywN)r,).0xs r z!_key_as_string..=s5A Qsr$)r%dictlisttuplerr&r,r)r*s r _key_as_stringr6:sn#dE*+ii555 J C 3 J  J#h Jr"cvd}|#|jtvr t|}|S|Dt|dk\r6t |dt t tfrt|d}|S|df}|S|Id|vrEt |dt tfr!t|ddkDrt|d}|S|d|df}|S)z Gets the key (or keys) from the given method_name. The method_name could be a redis command or a django caching command Nrr+)rrr5lenr%r3r4) method_namerkwargsr+s r _get_safe_keyr<Hs C K--/3FFDk$ J!  c$i1n d1gdE2 3Q.C J7*C J   fUmdE] 36%=!A%F5M* Je}(e}& Jr"c|jSr/)r)rs r _parse_rediscluster_commandr>gs <<r"c |jd||jd|g}t|D]9\}}|tk\rn+||}|jt |d|dd;|j dt ||dy)Nredis.is_clusterzredis.transactionrr8zredis.commands)count first_ten)set_tagrrrr!set_datar9) span is_clusterget_command_args_fnis_transaction commands_seqcommandsrrrs r _set_pipeline_datarKls LL#Z0LL$n5HL)3 ! ! %c*)'!*gabkBC * MM&! r"c&|jd||r2|jd||jtj||rI|rF|j}|tvs|t vr%t |dk(r|jd|dyyyyy)Nr@z redis.commandr8z redis.keyr)rCr DB_OPERATIONrrrr9)rErFrrrs r _set_client_datarNsLL#Z0  _d+ X**D1 ::< , , + +D Q LLd1g .1? +tr"N)sentry_sdk.constsr$sentry_sdk.integrations.redis.constsrrrrrsentry_sdk.scoper sentry_sdk.utilsr typingr r r rsentry_sdk.tracingrr!r,r6r<r>rKrNr"r rVsL&56 ..'8 > 8 /r"