o
    i"                     @   s   d 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 ejraddlmZ eeZejpledZ dZ!dZ"dZ#de$fddZ%de&e$e$f fddZ'de ddfddZ(dS )z$
Datadog trace code for flask_cache
    N)config)_SPAN_MEASURED_KEY)	SpanTypes)db)	COMPONENT)schematize_cache_operation)schematize_service_name)DDTraceDeprecationWarning)tracer)	deprecate   )_extract_client)_extract_conn_tags)_resource_from_cache_prefix)Spanzflask-cachezflask_cache.keyzflask_cache.backendzflask_cache.contact_pointsreturnc                  C   s,   zdd l } t| ddW S  ty   Y dS w )Nr   __version__ )flask_cachinggetattrImportError)r    r   ^/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/flask_cache/patch.pyget_version&   s   r   c                   C   s   ddiS )Nflask_cachez>=0.13r   r   r   r   r   _supported_versions/   s   r   c                    st   | durt ddtdd |du r,z
ddlm} |}W n ty+   ddlm} |}Y nw G  fdd	d	|  S )
z
    Return a traced Cache object that behaves exactly as ``cache_cls``.

    ``cache_cls`` defaults to ``flask.ext.cache.Cache`` if Flask-Cache is installed
    or ``flask_caching.Cache`` if flask-caching is installed.
    Nz"The tracer parameter is deprecatedz'The global tracer will be used instead.z5.0.0)messagecategoryremoval_versionr   )Cachec                       s   e Zd ZdZZZdededdfddZ fdd	Z	 fd
dZ
 fddZ fddZ fddZ fddZ fddZ fddZ  ZS )z%get_traced_cache.<locals>.TracedCachez
        Traced cache backend that monitors any operations done by flask_cache. Observed actions are:
        * get, set, add, delete, clear
        * all ``many_`` operations
        selfcmdr   r   c                 S   s   t jt|ddtj| jd}|ttj	j
 |td |t| jd || j t| j}|durQz
|t| W |S  tyP   tjddd	 Y |S w |S )
zJ
            Start a tracing with default attributes and tags
            r   )cache_provider)	span_typeservicer   
CACHE_TYPENzerror parsing connection tagsT)exc_info)ddtracertracer   r   CACHE_datadog_service_set_tag_strr   r   r   integration_name
set_metricr   CACHE_BACKENDgetset_tags_datadog_metar   cacher   	Exceptionlogdebug)r    r!   sclientr   r   r   __traceX   s&   

z-get_traced_cache.<locals>.TracedCache.__tracec                    s   |  d5}td| j|_t|dkr|t|d  t | j|i |}|	t
j|r.dnd |W  d   S 1 s=w   Y  dS )z1
            Track ``get`` operation
            flask_cache.cmdGETr   r   N)_TracedCache__tracer   r   resourcelenr+   COMMAND_KEYsuperr/   r-   r   ROWCOUNTr    argskwargsspanresultTracedCache	__class__r   r   r/   u   s   $z)get_traced_cache.<locals>.TracedCache.getc                    n   |  d(}td| j|_t|dkr|t|d  t | j|i |W  d   S 1 s0w   Y  dS )z1
            Track ``set`` operation
            r9   SETr   N)	r;   r   r   r<   r=   r+   r>   r?   setr    rB   rC   rD   rF   r   r   rK         $z)get_traced_cache.<locals>.TracedCache.setc                    rI   )z1
            Track ``add`` operation
            r9   ADDr   N)	r;   r   r   r<   r=   r+   r>   r?   addrL   rF   r   r   rO      rM   z)get_traced_cache.<locals>.TracedCache.addc                    rI   )z4
            Track ``delete`` operation
            r9   DELETEr   N)	r;   r   r   r<   r=   r+   r>   r?   deleterL   rF   r   r   rQ      rM   z,get_traced_cache.<locals>.TracedCache.deletec                    sb   |  d"}td| j|_|tt| t | j|i |W  d   S 1 s*w   Y  dS )z9
            Track ``delete_many`` operation
            r9   DELETE_MANYN)	r;   r   r   r<   set_tagr>   listr?   delete_manyrL   rF   r   r   rU      s
   $z1get_traced_cache.<locals>.TracedCache.delete_manyc                    sR   |  d}td| j|_t | j|i |W  d   S 1 s"w   Y  dS )z3
            Track ``clear`` operation
            r9   CLEARN)r;   r   r   r<   r?   clearrL   rF   r   r   rW      s   $z+get_traced_cache.<locals>.TracedCache.clearc                    s   |  d2}td| j|_|tt| t | j|i |}|	t
jtdd |D  |W  d   S 1 s:w   Y  dS )z6
            Track ``get_many`` operation
            r9   GET_MANYc                 s   s    | ]}|rd V  qdS )r   Nr   ).0valr   r   r   	<genexpr>   s    zAget_traced_cache.<locals>.TracedCache.get_many.<locals>.<genexpr>N)r;   r   r   r<   rS   r>   rT   r?   get_manyr-   r   r@   sumrA   rF   r   r   r\      s   $z.get_traced_cache.<locals>.TracedCache.get_manyc                    sv   |  d,}td| j|_t|dkr|tt|d   t	 | j
|i |W  d   S 1 s4w   Y  dS )z6
            Track ``set_many`` operation
            r9   SET_MANYr   N)r;   r   r   r<   r=   rS   r>   rT   keysr?   set_manyrL   rF   r   r   r`      s   $z.get_traced_cache.<locals>.TracedCache.set_many)__name__
__module____qualname____doc__r*   r1   strboolr;   r/   rK   rO   rQ   rU   rW   r\   r`   __classcell__r   rG   metar$   )rH   r   rG   N   s    


	rG   )r   r	   flask.ext.cacher   r   r   )r
   r$   ri   	cache_clsr   r   rh   r   get_traced_cache3   s"   xrl   ))rd   loggingtypingddtracer   ddtrace.constantsr   ddtrace.extr   r   ddtrace.internal.constantsr   ddtrace.internal.schemar   r   #ddtrace.internal.utils.deprecationsr	   ddtrace.tracer
   r'   ddtrace.vendor.debtcollectorr   utilsr   r   r   TYPE_CHECKINGr   Loggerra   r4   r$   DEFAULT_SERVICEr>   r.   CONTACT_POINTSre   r   dictr   rl   r   r   r   r   <module>   s4    
	