o
    QDi.                     @   sr   d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	m
Z
mZ G dd dZG dd deZG d	d
 d
eZdS )    )MiddlewareMixin)Counter	Histogram)	NAMESPACEPROMETHEUS_LATENCY_BUCKETS)PowersOfTime	TimeSincec                   @   s6   e Zd ZdZedd ZdddZdd Zd	d
 ZdS )MetricsNc                 C   s   | j s|  | _ | j S N)	_instance)cls r   U/var/www/Datamplify/venv/lib/python3.10/site-packages/django_prometheus/middleware.pyget_instance   s   zMetrics.get_instancer   c                 K   s   |||fd|i|S )N
labelnamesr   )self
metric_clsnamedocumentationr   kwargsr   r   r   register_metric   s   zMetrics.register_metricc                 O   s   |    d S r   )registerr   argsr   r   r   r   __init__   s   zMetrics.__init__c                 C   s  | j tddtd| _| j tddtd| _| j tddttd| _| j td	d
td| _| j tddddgttd| _	| j tddtd| _
| j tddtd| _| j tdddgtd| _| j tdddgtd| _| j tddg dtd| _| j tddtddtd| _| j tdd d!gtd| _| j td"d#d$gtd| _| j td%d&g d'td| _| j td(d)tddtd| _| j td*d+d,gtd| _| j td-d.td| _| j td/d0d1gtd| _| j td2d3dgtd| _d S )4N-django_http_requests_before_middlewares_totalz/Total count of requests before middlewares run.)	namespace.django_http_responses_before_middlewares_totalz0Total count of responses before middlewares run.:django_http_requests_latency_including_middlewares_secondszMHistogram of requests processing time (including middleware processing time).)bucketsr   @django_http_requests_unknown_latency_including_middlewares_totalzCount of requests for which the latency was unknown (when computing django_http_requests_latency_including_middlewares_seconds).3django_http_requests_latency_seconds_by_view_methodz6Histogram of request processing time labelled by view.viewmethod*django_http_requests_unknown_latency_totalz4Count of requests for which the latency was unknown.django_http_ajax_requests_totalzCount of AJAX requests.$django_http_requests_total_by_methodzCount of requests by method.'django_http_requests_total_by_transportzCount of requests by transport.	transport3django_http_requests_total_by_view_transport_methodz-Count of requests by view, transport, method.r#   r)   r$   %django_http_requests_body_total_bytesz#Histogram of requests by body size.      +django_http_responses_total_by_templatenamez$Count of responses by template name.templatename%django_http_responses_total_by_statuszCount of responses by status.status1django_http_responses_total_by_status_view_methodz+Count of responses by status, view, method.r2   r#   r$   &django_http_responses_body_total_bytesz$Histogram of responses by body size.&django_http_responses_total_by_charsetzCount of responses by charset.charset%django_http_responses_streaming_totalzCount of streaming responses.$django_http_exceptions_total_by_typez#Count of exceptions by object type.type$django_http_exceptions_total_by_viewzCount of exceptions by view.)r   r   r   requests_totalresponses_totalr   r   requests_latency_beforerequests_unknown_latency_beforerequests_latency_by_view_methodrequests_unknown_latencyrequests_ajaxrequests_by_methodrequests_by_transport!requests_by_view_transport_methodr   requests_body_bytesresponses_by_templatenameresponses_by_statusresponses_by_status_view_methodresponses_body_bytesresponses_by_charsetresponses_streamingexceptions_by_typeexceptions_by_view)r   r   r   r   r      s   	zMetrics.register)r   )	__name__
__module____qualname__r   classmethodr   r   r   r   r   r   r   r   r
      s    

r
   c                       s4   e Zd ZdZeZ fddZdd Zdd Z  Z	S )PrometheusBeforeMiddlewarez?Monitoring middleware that should run before other middlewares.c                    "   t  j|i | | j | _d S r   superr   metrics_clsr   metricsr   	__class__r   r   r         z#PrometheusBeforeMiddleware.__init__c                 C   s   | j j  t |_d S r   )rX   r<   incr   "prometheus_before_middleware_eventr   requestr   r   r   process_request   s   z*PrometheusBeforeMiddleware.process_requestc                 C   s>   | j j  t|dr| j jt|j |S | j j  |S )Nr]   )	rX   r=   r\   hasattrr>   observer	   r]   r?   r   r_   responser   r   r   process_response   s   
z+PrometheusBeforeMiddleware.process_response)
rO   rP   rQ   __doc__r
   rW   r   r`   re   __classcell__r   r   rY   r   rS      s    rS   c                       sn   e Zd ZdZeZ fddZdd Zdd Zdd	d
Z	dd Z
dd Zdd Zdd Zdd Zdd Z  ZS )PrometheusAfterMiddlewarez>Monitoring middleware that should run after other middlewares.c                    rT   r   rU   r   rY   r   r   r      r[   z"PrometheusAfterMiddleware.__init__c                 C   s   |  rdS dS )Nhttpshttp)	is_securer^   r   r   r   
_transport   s   z$PrometheusAfterMiddleware._transportc                 C   s   |j }|dvr	dS |S )N)	GETHEADPOSTPUTDELETETRACEOPTIONSCONNECTPATCHz<invalid method>r$   )r   r_   mr   r   r   _method   s   z!PrometheusAfterMiddleware._methodNc                 K   s   |r
|j di |S |S )Nr   )labels)r   metricr_   rd   ry   r   r   r   label_metric   s   z&PrometheusAfterMiddleware.label_metricc                 C   s   |  |}| |}| j| jj||d  | j| jj||d  |jddkr4| | jj	|  t
|jdp<d}| | jj|| t |_d S )Nrv   )r)   zx-requested-withXMLHttpRequestzcontent-lengthr   )rl   rx   r{   rX   rC   r\   rD   headersgetrB   intrF   rb   r   !prometheus_after_middleware_event)r   r_   r)   r$   content_lengthr   r   r   r`      s   

z)PrometheusAfterMiddleware.process_requestc                 C   s0   d}t |dr|jd ur|jjd ur|jj}|S )N<unnamed view>resolver_match)ra   r   	view_name)r   r_   r   r   r   r   _get_view_name   s   

z(PrometheusAfterMiddleware._get_view_namec                 O   sN   |  |}| |}t|dr%|jjpd}| j| jj||||d  d S d S )Nr   r   r+   )	rl   rx   ra   r   r   r{   rX   rE   r\   )r   r_   	view_func	view_argsview_kwargsr)   r$   r   r   r   r   process_view   s   



z&PrometheusAfterMiddleware.process_viewc                 C   s.   t |dr| j| jj||t|jd  |S )Ntemplate_name)rd   r0   )ra   r{   rX   rG   strr   r\   rc   r   r   r   process_template_response   s   
z3PrometheusAfterMiddleware.process_template_responsec                 C   s"  |  |}| |}t|j}| j| jj|||d  | j| jj|||||d  t	|dr@| j| jj
||t|jd  t	|drS|jrS| | jj||  t	|drg| | jj||t|j t	|dr| j| jj||| ||jdt|j |S | | jj||  |S )	N)r2   r4   r7   )r7   	streamingcontentr   r#   r$   )rx   r   r   status_coder{   rX   rH   r\   rI   ra   rK   r7   r   rL   rJ   rb   lenr   r@   r$   r	   r   rA   )r   r_   rd   r$   r   r2   r   r   r   re     sJ   





z*PrometheusAfterMiddleware.process_responsec                 C   s   | j | jj|t|jd  t|dr&|jjpd}| j | jj	||d  t|drB| j | jj
|| ||jdt|j d S |  | jj|  d S )N)r:   r   r   )r#   r   r   )r{   rX   rM   r:   rO   r\   ra   r   r   rN   r@   r   r$   rb   r	   r   rA   )r   r_   	exceptionr   r   r   r   process_exception(  s   

z+PrometheusAfterMiddleware.process_exceptionr   )rO   rP   rQ   rf   r
   rW   r   rl   rx   r{   r`   r   r   r   re   r   rg   r   r   rY   r   rh      s    

$rh   N)django.utils.deprecationr   prometheus_clientr   r   django_prometheus.confr   r   django_prometheus.utilsr   r   r	   r
   rS   rh   r   r   r   r   <module>   s     