
    i6*                     .   U 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	m
Z
mZmZ ddlmZmZmZ g dZd	hZdae	ed
<   dae
ed<   ej,                  d        Zd ZdddZdefdZdedefdZd Zddee   dz  de ddfdZ!d Z"d Z#dee   fdZ$d Z%y)     N)default_timer)engines)OpenMetricsFamily   )HistogramStorageCounterStorageVoidHistogramVoidCounterStorage)count_errorcount_exceptionerrors_per_engines)
initializeget_engines_statsget_engine_errors	histogramhistogram_observehistogram_observe_timecountercounter_inccounter_addr   r   searchhistogram_storagecounter_storagec               '      K   t        j                  |  }t               }| t               |z
  }|r|j                  |       y t	        dt        g |       z   dz         wNz
histogram z doesn't not exist)r   getr   observe
ValueErrorrepr)argshbeforedurations       '/root/searxng/searx/metrics/__init__.pyr   r   #   s[     t$A_F
L'H			(XtX69MMNNs   AA!c                 F    t        j                  | j                  |        y N)r   r   r   )r#   r    s     r$   r   r   /   s    4 ((2    T)raise_on_not_foundc                 l    t        j                  | }| r|t        dt        g |      z   dz         |S r   )r   r   r   r   )r(   r    r!   s      r$   r   r   3   s<    t$AaiXtX69MMNNHr'   r    c                  0    t        j                  dg|   y Nr   r   addr    s    r$   r   r   :   s    !D!r'   valuec                 0    t        j                  | g|  y r&   r,   )r/   r    s     r$   r   r   >   s    %%r'   c                  &    t        j                  |  S r&   )r   r   r.   s    r$   r   r   B   s    %%r'   engine_namesenabledreturnc           	      x   |rt               at               ant	               at        t
              ad}| xs t        D ](  }|t        v st        |t        |   j                        }* d}t        d|z  |z        }| xs t        D ]  }t        j                  d|ddd       t        j                  d|ddd	       t        j                  d|ddd
       t        j                  d|d       t        j                  ddd|dd       t        j                  ||d|dd       t        j                  ||d|dd        y)z
    Initialize metrics
    )histogram_class   g?g      ?enginer   countsent
successfulerrorscorer   d   resulttimehttptotalN)r   r   r   r   r
   r	   r   maxtimeoutint	configure)r2   r3   max_timeoutengine_namehistogram_widthhistogram_sizes         r$   r   r   F   s<    (*,.,.,]K K#.w I'!k7;+?+G+GHKI
 O{*_<=N $.w m!!(K7FS!!(K7LY!!(K7GT!!(KA##AsHk8WU##O^X{\bdjk 	##O^X{\bdklmr'   c                 2   i }t        t        j                               }|j                          |D ]  }|| vrt        |   }t	        t        d|ddd      d      }t        |j                         d       }g }|D ]  \  }}	t        d|	z  |z        d	z  }
|j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   |j"                  |
d
	        t        |dd       ||<    |S )Nr8   r   r9   r:   r   c                     | d   S r+    )context_counts    r$   <lambda>z#get_engine_errors.<locals>.<lambda>y   s    ZghiZj r'   )key      )	filenamefunctionline_nocodeexception_classnamelog_messagelog_parameters	secondary
percentageTc                     | d   S )Nr[   rM   )ds    r$   rO   z#get_engine_errors.<locals>.<lambda>   s
    AlO r'   )reverserP   )listr   keyssortrC   r   sorteditemsroundappendrS   rT   rU   rV   rW   rX   rY   rZ   )engline_name_listr?   r2   rH   error_statssent_search_countsorted_context_count_listrcontextr9   r[   s              r$   r   r   o   s'   F*//12L# U//(5+xRX Y[\]$*;+<+<+>Dj$k!7 	NGUrEz,==>BJHH ' 0 0 ' 0 0&#LL+2+F+F#*#6#6&-&<&<!(!2!2",
	 %Q:ST{/U0 Mr'   c           
         i }t        |       }| D ]h  }|j                  |      xs g }t        d|ddd      }|dk(  rd }n1dt        |D cg c]  }|j                  d      r|d    c}      z
  }|||d	||<   j |S c c}w )
Nr8   r   r9   r:   r   r>   rZ   r[   )reliability
sent_counterrors)r   r   r   sum)rf   reliabilitiesengine_errorsrH   ro   rn   rm   r<   s           r$   get_reliabilitiesrs      s    M%&78M( 
"";/52X{HgvN
?K f$kUTYT]T]^iTjU<%8$k llK '$&
k"
   %ls   	A= A=engine_name_listc                    t         J t        J g }d x}}| D ]  }t        d|ddd      }|dk(  rt        d|dd      j	                  d      }t        d|dd      j
                  }t        d|ddd      }t        d|d	d
      j	                  d      }	t        |	xs d|xs d      }t        |xs d|xs d      }|d d d d d d d d d dd|d}
|r%|r#t        d|d      }||
d<   |t        |      z  |
d<   t        d|d	d      j	                  d      }dx}}|gt        d|d	d      j	                  d      }t        d|d	d      j	                  d      }t        |d      |
d<   t        |d      |
d<   t        |d      |
d<   |	t        d|d	d
      j	                  d      }t        d|d	d
      j	                  d      }t        |	d      |
d
<   t        |d      |
d<   t        |d      |
d<   t        |	|xs dz
  d      |
d<   t        ||z
  d      |
d<   t        ||z
  d      |
d<   |j                  |
        |t        j                  |xs d      t        j                  |xs d      dS )Nr8   r   r9   r:   r   r?   2   r;   r@   rB   )namerB   	total_p80	total_p95rA   http_p80http_p95
processingprocessing_p80processing_p95r=   score_per_resultresult_countr=   r   rA   P   _   r   rz   r{   rx   ry   r|   r}   r~   )r@   max_timemax_result_count)r   r   r   r   r[   rp   rC   floatrd   re   mathceil)rt   	list_timemax_time_totalr   rH   rn   r   result_count_sumsuccessful_count
time_totalstatsr=   	time_httptime_http_p80time_http_p95time_total_p80time_total_p95s                    r$   r   r      s   &&&(((I(,,N%' = X{HgvN
? ;'JUUVXY$X{HgNRR"8[(G\ZxfgFQQRTU
Z_1n.AB|0q2B2GaH  "" !(
   0Hk7;E"E'N(-6F0G(GE$%hVVDOOPRS	()) %hVVLWWXZ[M%hVVLWWXZ[M!)Q/E&M %mQ 7E* %mQ 7E*!&xfgNYYZ\]N&xfgNYYZ\]N":q1E'N!&~q!9E+!&~q!9E+"'
in1(Eq"IE,&+N],JA&NE"#&+N],JA&NE"#{= @ IIn12 II&6&;!< r'   c                 4   t        ddd| d   D cg c]	  }d|d   i c}| d   D cg c]  }|d   xs d c}	      t        d
dd| d   D cg c]	  }d|d   i c}| d   D cg c]  }|d   xs d c}	      t        ddd| d   D cg c]	  }d|d   i c}| d   D cg c]  }|d   xs d c}	      t        ddd| d   D cg c]	  }d|d   i c}| d   D cg c]  }|d   xs d c}	      t        ddd| d   D cg c]	  }d|d   i c}| d   D cg c]+  }|j                  |d   i       j                  dd      xs d- c}	      t        ddd| d   D cg c]	  }d|d   i c}| d   D cg c]+  }|j                  |d   i       j                  dd      xs d- c}	      g}dj                  |D cg c]  }t        |       c}      S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )N+searxng_engines_response_time_total_secondsgaugez-The average total response time of the enginer@   rH   rw   rB   r   )rP   	type_hint	help_hint	data_infodata0searxng_engines_response_time_processing_secondsz2The average processing response time of the enginer|   *searxng_engines_response_time_http_secondsz,The average HTTP response time of the enginerA   "searxng_engines_result_count_totalr   z2The total amount of results returned by the enginer   #searxng_engines_request_count_totalz5The total amount of user requests made to this enginern   !searxng_engines_reliability_totalz%The overall reliability of the enginerm    )r   r   joinstr)engine_statsengine_reliabilitiesr8   metricsmetrics        r$   openmetricsr      s   =EEQRXEYZ6vf~6Z5A&5IJ6&/&Q&J	
 	BJEQRXEYZ6vf~6Z:Fv:NO&&+!+O	
 	<DEQRXEYZ6vf~6Z4@4HI&&.%A%I	
 	4JEQRXEYZ6vf~6Z<H<PQ&&(-A-Q	
 	5MEQRXEYZ6vf~6Z +62 %((<@@qQVUVV		
 	3=EQRXEYZ6vf~6Z +62 %((<@@PQRWVWW		
O1Gd 77g6FCK677[ [J [O [I [Q [ [ 7sL   GGG#$G(
G-!G2G7G<H0H!H80H H)NT)&r   
contextlibtimeitr   searx.enginesr   searx.openmetricsr   modelsr   r   r	   r
   error_recorderr   r   r   __all__	ENDPOINTSr   __annotations__r   contextmanagerr   r   r   r   r   rE   r   r   r_   boolr   r   rs   r   r   rM   r'   r$   <module>r      s        ! / W W L L J	 '+ # *"& & O O3 )- "s "&s &3 &&&mT#Y- &mt &mt &mR>0JS	 JZ38r'   