U
    ‰d  ã                   @   sX   d Z ddlZddlZddlmZ ddlmZ dZdZdZ	dZ
d	Zd
ZG dd„ deƒZdS )z;Bare-bones implementation of statsD's protocol, client-sideé    N)Úsub)ÚLoggerÚmetricÚvalueÚmtypeÚgaugeÚcounterÚ	histogramc                   @   s„   e Zd Z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d„Zd!dd„Zdd„ Zdd„ ZdS )"ÚStatsdz:statsD-based instrumentation, that passes as a logger
    c                 C   sx   t  | |¡ tdd|jƒ| _z4|j\}}t tjtj¡| _	| j	 
|t|ƒf¡ W n tk
rj   d| _	Y nX |j| _dS )z"host, port: statsD server
        z^(.+[^.]+)\.*$z\g<1>.N)r   Ú__init__r   Zstatsd_prefixÚprefixZstatsd_hostÚsocketÚAF_INETÚ
SOCK_DGRAMÚsockÚconnectÚintÚ	ExceptionÚdogstatsd_tags)ÚselfÚcfgÚhostÚport© r   ú>/tmp/pip-unpacked-wheel-1tw_qy24/gunicorn/instrument/statsd.pyr      s    
zStatsd.__init__c                 O   s$   t j| |f|ž|Ž |  dd¡ d S )Nzgunicorn.log.criticalé   )r   ÚcriticalÚ	increment©r   ÚmsgÚargsÚkwargsr   r   r   r   )   s    zStatsd.criticalc                 O   s$   t j| |f|ž|Ž |  dd¡ d S )Nzgunicorn.log.errorr   )r   Úerrorr   r   r   r   r   r"   -   s    zStatsd.errorc                 O   s$   t j| |f|ž|Ž |  dd¡ d S )Nzgunicorn.log.warningr   )r   Úwarningr   r   r   r   r   r#   1   s    zStatsd.warningc                 O   s$   t j| |f|ž|Ž |  dd¡ d S )Nzgunicorn.log.exceptionr   )r   Ú	exceptionr   r   r   r   r   r$   5   s    zStatsd.exceptionc                 O   s   | j tj|f|ž|Ž d S ©N)ÚlogÚloggingÚINFOr   r   r   r   Úinfo:   s    zStatsd.infoc                 O   s   | j tj|f|ž|Ž d S r%   )r&   r'   ÚDEBUGr   r   r   r   Údebug>   s    zStatsd.debugc           	      O   sÎ   z¤|  dd¡}|dk	rˆ|  td¡}|  td¡}|  td¡}|rˆ|rˆ|rˆ|tkr\|  ||¡ n,|tkrr|  ||¡ n|tkrˆ|  	||¡ n |r¢t
j| ||f|ž|Ž W n$ tk
rÈ   t
j| ddd Y nX dS )zDLog a given statistic if metric, value and type are present
        ÚextraNzFailed to log to statsdT©Úexc_info)ÚgetÚ
METRIC_VARÚ	VALUE_VARÚ	MTYPE_VARÚ
GAUGE_TYPEr   ÚCOUNTER_TYPEr   ÚHISTOGRAM_TYPEr	   r   r&   r   r#   )	r   Zlvlr   r    r!   r,   r   r   Útypr   r   r   r&   A   s"    z
Statsd.logc                 C   sz   t  | ||||¡ |jd t|jƒd  }|j}t|tƒrNt| 	dd¡d ƒ}|  
d|¡ |  dd¡ |  d| d¡ dS )zNMeasure request duration
        request_time is a datetime.timedelta
        iè  Nr   r   zgunicorn.request.durationzgunicorn.requestszgunicorn.request.status.%d)r   ÚaccessÚsecondsÚfloatÚmicrosecondsÚstatusÚ
isinstanceÚstrr   Úsplitr	   r   )r   ÚrespÚreqÚenvironZrequest_timeZduration_in_msr;   r   r   r   r7   [   s    
zStatsd.accessc                 C   s   |   d | j||¡¡ d S )Nz{0}{1}:{2}|g©Ú
_sock_sendÚformatr   ©r   Únamer   r   r   r   r   j   s    zStatsd.gaugeç      ð?c                 C   s   |   d | j|||¡¡ d S )Nz{0}{1}:{2}|c|@{3}rB   ©r   rF   r   Zsampling_rater   r   r   r   m   s    zStatsd.incrementc                 C   s   |   d | j|||¡¡ d S )Nz{0}{1}:-{2}|c|@{3}rB   rH   r   r   r   Ú	decrementp   s    zStatsd.decrementc                 C   s   |   d | j||¡¡ d S )Nz{0}{1}:{2}|msrB   rE   r   r   r   r	   s   s    zStatsd.histogramc                 C   sn   zDt |tƒr| d¡}| jr0|d | j d¡ }| jrB| j |¡ W n$ tk
rh   tj| ddd Y nX d S )NÚasciis   |#zError sending message to statsdTr-   )	r<   r=   Úencoder   r   Úsendr   r   r#   )r   r   r   r   r   rC   v   s    

zStatsd._sock_sendN)rG   )rG   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r"   r#   r$   r)   r+   r&   r7   r   r   rI   r	   rC   r   r   r   r   r
      s   

r
   )rP   r'   r   Úrer   Zgunicorn.gloggingr   r0   r1   r2   r3   r4   r5   r
   r   r   r   r   Ú<module>   s   