o
    i                     @   s,  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 g dZdgZee Zdedeeeeef  defddZdej fddZ!deeef fddZ"dd Z#edd Z$edd  Z%d!S )"    )contextmanager)Optional)Union)	SPAN_KIND)trace_utils)SpanKind)	SpanTypes)db)net)redis)core)	COMPONENT)schematize_cache_operation)stringify_cache_args)GETGETDELGETEXGETRANGEGETSETLINDEXLRANGERPOPLPOPHGETHGETALLHKEYSHMGET
HRANDFIELDHVALSMGETredis_commandresultreturnc                    sl   dg i d g | vr4| dkr fdd|D }t |S | dkr2 fdd|D }t |dkr0dS dS dS dS )	N    r   c                       g | ]}| vr|qS  r%   .0xempty_resultsr%   X/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/redis_utils.py
<listcomp>-       z'determine_row_count.<locals>.<listcomp>r   c                    r$   r%   r%   r&   r)   r%   r+   r,   1   r-   r      )lenr    r!   r%   r)   r+   determine_row_count'   s   r1   ctxc                    s   t |}|dd }d }d }z1z&||i |I d H }|W W |d u r)t||d}|tvr/d }td| |g S  tyA   d} w |d u rLt||d}|tvrRd }td| |g w )N r   r0   zredis.async_command.post)r   splitr1   ROW_RETURNING_COMMANDSr   dispatchBaseException)r2   funcargskwargsparsed_commandr    rowcountr!   r%   r%   r+   _run_redis_command_async9   s,   r=   c              
   C   sh   z(t j| d t j| d t j| d tj| dpdi}| d}|r&||tj< |W S  ty3   i  Y S w )Nhostportr	   r   client_name)	r
   TARGET_HOSTTARGET_PORTSERVER_ADDRESSredisxDBgetCLIENT_NAME	Exception)conn_kwargs	conn_tagsr@   r%   r%   r+   _extract_conn_tagsL   s   




rK   c                 C   s   t  }tj|t< ||t< tj|tj< | d ur"t	tj
tjd}| ||< |jr3|j D ]\}}|||< q*t|drIt|jj D ]\}}|||< q@|S )Ncache_providerconnection_pool)dictr   CLIENTr   r   rD   APPr	   SYSTEMr   RAWCMDtagsitemshasattrrK   rN   connection_kwargs)querypininstanceintegration_nameret	span_namekeyvaluer%   r%   r+   _build_tags\   s   



r`   c                 c   s    d | }}|jrd dd |D }tjdttjtjd|t	| |t
j| dt|| ||jd}td|| |d ||g |jV  W d    d S 1 sOw   Y  d S )N
c                 S   s   g | ]	}| d d qS )r3   r   )r4   )r'   cmdr%   r%   r+   r,   s   s    z6_instrument_redis_execute_pipeline.<locals>.<listcomp>redis.execute_pipelinerL   T)r]   resourceservice	span_typerY   measuredrT   )joinresource_only_commandr   context_with_datar   rD   CMDrQ   r   ext_servicer   REDISr`   r[   r6   span)rY   config_integrationcmdsrZ   
cmd_stringrd   r2   r%   r%   r+   "_instrument_redis_execute_pipelineo   s$   
	
"rr   c                 c   s    t ||jd}tjdttjtjd| t	| |t
j|jr$|dd n|dt|| ||jd}td|| ||||g |V  W d    d S 1 sKw   Y  d S )	N)cmd_max_lenzredis.commandrL   r3   r   T)r]   rY   re   rf   rd   rg   rT   rc   )r   cmd_max_lengthr   rj   r   rD   rk   rQ   r   rl   r   rm   ri   r4   r`   r[   r6   )rY   ro   rZ   r9   rX   r2   r%   r%   r+   _instrument_redis_cmd   s    
	"ru   N)&
contextlibr   typingr   r   ddtrace.constantsr   ddtrace.contribr   ddtrace.extr   r   r	   r
   r   rD   ddtrace.internalr   ddtrace.internal.constantsr   ddtrace.internal.schemar   ddtrace.internal.utils.formatsr   SINGLE_KEY_COMMANDSMULTI_KEY_COMMANDSr5   strlistrO   intr1   ExecutionContextr=   rK   r`   rr   ru   r%   r%   r%   r+   <module>   s2    $
