o
    i                      @   s
  d dl mZ d dlm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 ej Z!ee"Z#G dd deZ$dS )    )Iterable)contextmanagerN)ObjectProxy)config)Pin)_SPAN_MEASURED_KEY)	SPAN_KIND)parse_addresses)SpanKind)	SpanTypes)db)	memcached)net)	COMPONENT)
get_logger)schematize_cache_operation)schematize_service_name)tracerc                       s   e Zd ZdZdejdf fdd	Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zed'd( Zd)d* Zd+d, Z  ZS )-TracedClientzOTracedClient is a proxy for a pylibmc.Client that times its network operations.Nc                    s   t |tst|d|fi dd | D }ntd tt| | t	|}t
|d}||  z	t|j| _W d	S  tyN   tjddd Y d	S w )
z=Create a traced client that wraps the given memcached client.serversc                 S   s   i | ]\}}|d kr||qS )r    ).0kvr   r   [/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/pylibmc/client.py
<dictcomp>,   s    z)TracedClient.__init__.<locals>.<dictcomp>z|TracedClient instantiation is deprecated and will be remove in future versions (0.6.0). Use patching instead (see the docs).)servicezerror setting addressesTexc_infoN)
isinstance_Clientgetitemslogwarningsuperr   __init__r   r   ontor	   	addresses
_addresses	Exceptiondebug)selfclientr   r   argskwargsschematized_servicepin	__class__r   r   r&   $   s   
(

zTracedClient.__init__c                 O   s:   | j j|i |}t|}t| }|r| | |S N)__wrapped__cloner   r   get_fromr'   )r,   r.   r/   clonedtraced_clientr1   r   r   r   r6   @   s   
zTracedClient.clonec                 O      | j dg|R i |S )Nadd
_trace_cmdr,   r.   r/   r   r   r   r;   I      zTracedClient.addc                 O   r:   )Nr!   r<   r>   r   r   r   r!   L   r?   zTracedClient.getc                 O   r:   )Nsetr<   r>   r   r   r   r@   O   r?   zTracedClient.setc                 O   r:   )Ndeleter<   r>   r   r   r   rA   R   r?   zTracedClient.deletec                 O   r:   )Ngetsr<   r>   r   r   r   rB   U   r?   zTracedClient.getsc                 O   r:   )Ntouchr<   r>   r   r   r   rC   X   r?   zTracedClient.touchc                 O   r:   )Ncasr<   r>   r   r   r   rD   [   r?   zTracedClient.casc                 O   r:   )Nincrr<   r>   r   r   r   rE   ^   r?   zTracedClient.incrc                 O   r:   )Ndecrr<   r>   r   r   r   rF   a   r?   zTracedClient.decrc                 O   r:   )Nappendr<   r>   r   r   r   rG   d   r?   zTracedClient.appendc                 O   r:   )Nprependr<   r>   r   r   r   rH   g   r?   zTracedClient.prependc                 O   r:   )N	get_multi_trace_multi_cmdr>   r   r   r   rI   j   r?   zTracedClient.get_multic                 O   r:   )N	set_multirJ   r>   r   r   r   rL   m   r?   zTracedClient.set_multic                 O   r:   )Ndelete_multirJ   r>   r   r   r   rM   p   r?   zTracedClient.delete_multic                 O   s   t | j|}| |Y}||i |}|du r |W  d   S |r/|tjd||d f  |dkr?|tj|r;dnd n|dkr[|tjt	|t
rXt|dkrX|d rXdnd |W  d   S 1 sgw   Y  dS )zdtrace the execution of the method with the given name and will
        patch the first arg.
        N%s %sr   r!      rB   )getattrr5   _span_set_tag_strr   QUERY
set_metricr   ROWCOUNTr   r   len)r,   method_namer.   r/   methodspanresultr   r   r   r=   s   s   0$zTracedClient._trace_cmdc                 O   s   t | j|}| |K}||i |}|du r |W  d   S |d}|r2|tjd||f  |dkrM|tj	|rJt
|trJtdd |D nd |W  d   S 1 sYw   Y  dS )z=trace the execution of the multi command with the given name.N
key_prefixrN   rI   c                 s   s    | ]}|rd V  qdS )rO   Nr   )r   docr   r   r   	<genexpr>   s    z0TracedClient._trace_multi_cmd.<locals>.<genexpr>r   )rP   r5   rQ   r!   rR   r   rS   rT   r   rU   r   r   sum)r,   rW   r.   r/   rX   rY   rZ   prer   r   r   rK      s   
&$zTracedClient._trace_multi_cmdc                 c   s    d V  d S r4   r   )r,   r   r   r   _no_span   s   
zTracedClient._no_spanc                 C   s   t | }|r| s|  S tjtddd|j|tj	d}|
ttjj |
tjtj |
ttj |td z| | W |S  tyT   tjddd Y |S w )	z'Return a span timing the given command.zmemcached.cmdr   )cache_provider)r   resource	span_typerO   zerror tagging spanTr   )r   r7   enabledr`   r   tracer   r   r   CACHErR   r   r   pylibmcintegration_namer   SYSTEMr   	DBMS_NAMEr   r
   CLIENTrT   r   	_tag_spanr*   r#   r+   )r,   cmd_namer1   rY   r   r   r   rQ      s(   

zTracedClient._spanc                 C   sL   | j r$t| j \}}}}|tj| |tj| |tj| d S d S r4   )	r)   randomchoicerR   r   TARGET_HOSTset_tagTARGET_PORTSERVER_ADDRESS)r,   rY   _hostportr   r   r   rl      s   zTracedClient._tag_span)__name__
__module____qualname____doc__r   SERVICEr&   r6   r;   r!   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rL   rM   r=   rK   r   r`   rQ   rl   __classcell__r   r   r2   r   r   !   s0    	
r   )%collections.abcr   
contextlibr   rn   rg   wraptr   ddtracer   ddtrace._trace.pinr   ddtrace.constantsr   r   &ddtrace.contrib.internal.pylibmc.addrsr	   ddtrace.extr
   r   r   r   r   ddtrace.internal.constantsr   ddtrace.internal.loggerr   ddtrace.internal.schemar   r   ddtrace.tracer   Clientr    rw   r#   r   r   r   r   r   <module>   s.    