
    \jj                        d dl mZ d dlmZmZmZmZ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 erd dlmZmZmZmZ d	ed
ddefdZdddefdZdddefdZded
dddddfdZd"dZdddedddeddddfd Zddded	ed
dddf
d!Zy)#    )SPANDATA)"_COMMANDS_INCLUDING_SENSITIVE_DATA_MAX_NUM_ARGS_MAX_NUM_COMMANDS_MULTI_KEY_COMMANDS_SINGLE_KEY_COMMANDS)should_send_default_pii)StreamedSpan)Span)SENSITIVE_DATA_SUBSTITUTE)TYPE_CHECKING)AnyOptionalSequenceUnionnameargsSequence[Any]returnc                    | g}| j                         }t               }t        |      D ]  \  }}|t        kD  r nt|t        v r|j                  t               /|dk(  }|r|j                  t        |             Q|r|j                  t        |             n|j                  t                dj                  |      }|S )Nr    )	lowerr	   	enumerater   r   appendr   reprjoin)	r   r   command_partsname_lowsend_default_piiiargarg_is_the_keycommands	            M/root/env/lib/python3.12/site-packages/sentry_sdk/integrations/redis/utils.py_get_safe_commandr%      s    FMzz|H.0D/ @3}99  !:;a  c+$$T#Y/$$%>?@" hh}%GN    keyr   c                 x    t        | t              r	 | j                         S t	        |       S # t        $ r Y yw xY w)N )
isinstancebytesdecodeUnicodeDecodeErrorstrr'   s    r$   _safe_decoder0   /   s<    #u	::< s8O " 		s   - 	99c                     t        | t        t        t        f      rdj	                  d | D              } | S t        | t
              rt        |       } | S | d} | S t        |       } | S )Nz, c              3   2   K   | ]  }t        |        y wN)r0   ).0xs     r$   	<genexpr>z!_key_as_string.<locals>.<genexpr>;   s     5AQ5s   r)   )r*   dictlisttupler   r+   r0   r.   r/   s    r$   _key_as_stringr:   9   sn    #dE*+ii555 J 
C	3 J 
 J #hJr&   method_namezOptional[tuple[Any, ...]]kwargszOptional[dict[str, Any]]zOptional[tuple[str, ...]]c                 v   d}|#| j                         t        v rt        |      }|S |Dt        |      dk\  r6t	        |d   t
        t        t        f      rt        |d         }|S |d   f}|S |Id|v rEt	        |d   t        t        f      r!t        |d         dkD  rt        |d         }|S |d   |d   f}|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
    N   r   r'   )r   r   r9   lenr*   r7   r8   )r;   r   r<   r'   s       r$   _get_safe_keyr@   F   s     CK--/3FFDk$ J! 
	c$i1nd1gdE23Q.C J 7*C J 
	fUmdE]36%=!A%F5M*
 J e}(e}&Jr&   c                     | j                   S r3   )r   )r#   s    r$   _parse_rediscluster_commandrB   h   s    <<r&   spanzUnion[Span, StreamedSpan]
is_clusterget_command_args_fnis_transactioncommands_seqNc           	      <   t        | t              ry | j                  d|       | j                  d|       g }t        |      D ]9  \  }}|t        k\  r n+ ||      }|j                  t        |d   |dd               ; | j                  dt        |      |d       y )Nredis.is_clusterzredis.transactionr   r>   zredis.commands)count	first_ten)	r*   r
   set_tagr   r   r   r%   set_datar?   )	rC   rD   rE   rF   rG   commandsr    r!   r#   s	            r$   _set_pipeline_datarO   l   s     $%LL#Z0LL$n5HL) D3!!%c*)'!*gabkBCD 	MM&!	
r&   c                    t        | t              r#|rg| j                  t        j                  |       nF| j                  d|       |r2| j                  d|       | j                  t        j                  |       |ro|rl|j                         }|t        v s|t        v rKt        |      dk(  r<t        | t              r| j                  d|d          y | j                  d|d          y y y y y )NrI   zredis.commandr>   zdb.redis.keyr   z	redis.key)r*   r
   set_attributer   DB_OPERATION_NAMErL   DB_OPERATIONr   r   r   r?   )rC   rD   r   r   r   s        r$   _set_client_datarT      s     $%x994@'4LL$/LL..5::<,,++D	Q$-"">47;[$q'2 1?+ tr&   )r#   r   r   r   )sentry_sdk.constsr   $sentry_sdk.integrations.redis.constsr   r   r   r   r   sentry_sdk.scoper	   sentry_sdk.tracesr
   sentry_sdk.tracingr   sentry_sdk.utilsr   typingr   r   r   r   r   r.   r%   r0   r:   r@   rB   boolrO   rT    r&   r$   <module>r^      s   &  5 * # 6  55C  3 6e  
 
# 

% ' !	D
%  	
 " 
>3
%3373?B3KP3	3r&   