
    i;                         d dl  d dlZd dlZd dlZd dlmZ  G d de      Z G d de      Z G d	 d
e      Z	 G d de      Z
 G d de      Z G d d      Z G d de      Z G d de      Zd Zy)    )*N)make_prof_pointc                   &     e Zd ZdZi Z fdZ xZS )MetricRegistryu   
    В APP.metrics не сохраняем, т.к. на момент инициализации APP еще может не быть
    c                 X    t        |   |i |}|| j                  |j                  <   |S N)super__call___metricsname)clsargskwargsinstance	__class__s       ./cmf/util/metrics.pyr
   zMetricRegistry.__call__+   s.    7#T4V4&.X]]#    )__name__
__module____qualname____doc__r   r
   __classcell__r   s   @r   r   r   &   s     H r   r   c                   4    e Zd Zdddd e       fdZd Zd Zy)	CmfMetric FTc	                 6   d| d| | _         || _        || _        i | _        || _        | j                  r"| xj                   d| j                   z  c_         |rd| j                  d<   |r!t        j                         | j                  d<   || _        i | _        y)ue   
        TODO1: save_to_pg - сохранять в PostgeSQL (TODO нейминг и итп)
        eva__eva_appapphostnameN)	r   helpcustom_tagstagsunitsocketgethostnameadd_worker_tagdata)	selfr   r#   module_namer&   r)   add_hostname_tagadd_app_tagr$   s	            r   __init__zCmfMetric.__init__4   s     ;-q/		&		99II1TYYK(I(DIIe$*$6$6$8DIIj!,	r   c                 T   | j                   r"	 dd l}|j                         | j                  d<   t        | j                        t        |j                               k(  sJ | j                  }t        | j                  j                               D ]  }|d| j                  |    z  } t        | j                        D ]C  }||   }|d}t        |      j                         }t        j                  dd|      }|d| z  }E |S # t        t
        f$ r d| j                  d<   Y w xY w)Nr   	worker_idunknown___r   z[^a-zA-Z0-9_.-])r)   uwsgir1   r%   	NameErrorImportErrorlistr$   keysr   sortedstrstripresub)r+   r$   r4   	redis_keyk	valid_tags         r   get_redis_keyzCmfMetric.get_redis_keyM   s"   3).):		+& D$$%k.>.>.@)AAAAII			() 	.A3tyy|n--I	.(() 	+A#AI 	I,,.I12yAI3yk**I	+  {+ 3)2		+&3s   !D D'&D'c                     i }d}|j                  d      ^}}t        | j                  j                               D ]  }||   ||<   |dz  } t        | j                        D ]  }||   ||<   |dz  } |S )Nr   r3      )splitr9   r%   r8   r$   )r+   keyr%   i_nametag_valsr?   s          r   parse_redis_keyzCmfMetric.parse_redis_keyc   s    99U+		() 	AqkDGFA	 (() 	AqkDGFA	 r   N)r   r   r   tupler/   rA   rI    r   r   r   r   2   s$      %"&!"W2,
r   r   )	metaclassc                       e Zd Zd Zd Zd Zy)CmfMetricGaugec                 D    | j                  |      }|| j                  |<   y r   rA   r*   r+   r*   r$   rE   s       r   writezCmfMetricGauge.writeq   s      -		#r   c                     g }| j                   j                         D ]  \  }}|j                  d||g        i | _         |S )Nupdate)r*   itemsappendr+   resrE   r*   s       r   dump_to_rediszCmfMetricGauge.dump_to_redisu   sD    * 	.ICJJ#t,-	.	
r   c                    d| j                    d| j                   d}|d| j                    dz  }| j                  r |d| j                    d| j                   dz  }d}t        |j	                               D ]z  }|j                  | j                   dz         s"d	}| j                  |      }d
j                  d |j                         D              }||   }||= || j                    d| d| dz  }| |sy|S )N# HELP  
# TYPE z gauge
# UNIT Fr3   T,c              3   2   K   | ]  \  }}| d | d  ywz=""NrK   .0tag_nametag_vals      r   	<genexpr>z/CmfMetricGauge.render_metric.<locals>.<genexpr>   "     `>Oh8*Bwiq 9`   {} r   )	r   r#   r&   r7   r8   
startswithrI   joinrU   )r+   
redis_datarX   foundrE   r%   tags_strr*   s           r   render_metriczCmfMetricGauge.render_metric|   s   		{!DII;b18,,99WTYYKq266C
)* 		9C>>$))E/2E'',Dxx`SWS]S]S_``Hc?D3dii[8*CvR88C		9 
r   Nr   r   r   rR   rY   rr   rK   r   r   rN   rN   p   s    r   rN   c                       e Zd Zd Zd Zd Zy)CmfMetricCounterc                     | j                  |      }|| j                  v r| j                  |xx   |z  cc<   y || j                  |<   y r   rP   rQ   s       r   rR   zCmfMetricCounter.write   s=      -$))IIcNd"N!DIIcNr   c           	          g }| j                   j                         D ]K  \  }}|j                  d||g       |j                  d|dz   t        t	        j                               g       M i | _         |S )Nincrhsetnx#created)r*   rU   rV   inttimerW   s       r   rY   zCmfMetricCounter.dump_to_redis   sj    * 	EICJJT*+JJ#j.#diik2BCD	E 	
r   c                 d   d| j                    d| j                   d}|d| j                    dz  }| j                  r |d| j                    d| j                   dz  }d}t        |j	                               D ]  }|j                  | j                   dz         s"|j                  d	      r4d
}| j                  |      }dj                  d |j                         D              }||   }||d	z      }||= ||d	z   = || j                    d| d| dz  }|| j                    d| d| dz  } |sy|S )Nr[   r\   r]   r^   	 counter
r_   Fr3   rz   Tr`   c              3   2   K   | ]  \  }}| d | d  ywrb   rK   rd   s      r   rh   z1CmfMetricCounter.render_metric.<locals>.<genexpr>   ri   rj   z_total{rl   	_created{r   
r   r#   r&   r7   r8   rm   endswithrI   rn   rU   )	r+   ro   rX   rp   rE   r%   rq   r*   data_createds	            r   rr   zCmfMetricCounter.render_metric   sQ   		{!DII;b1:..99WTYYKq266C
)* 	IC>>$))E/2||J'E'',Dxx`SWS]S]S_``Hc?D%c*n5L33z>*dii[
#dV2>>Cdii[
8*C~RHHC	I 
r   Nrs   rK   r   r   ru   ru      s    "r   ru   c                       e Zd Zd Zd Zd Zy)CmfMetricSummaryc                     | j                  |      }|| j                  v r2| j                  |xx   |z  cc<   | j                  |dz   xx   dz  cc<   y || j                  |<   d| j                  |dz   <   y )N#countrC   rP   rQ   s       r   rR   zCmfMetricSummary.write   sg      -$))IIcNd"NIIc(l#q(#!DIIcN&'DIIc(l#r   c           	         g }| j                   j                         D ]]  \  }}|j                  d||g       |j                  d      r,|j                  d|dz   t	        t        j
                               g       _ i | _         |S )Nrx   r   ry   rz   )r*   rU   rV   r   r{   r|   rW   s       r   rY   zCmfMetricSummary.dump_to_redis   sv    * 	IICJJT*+<<)

Hc*nc$))+6FGH		I
 	
r   c                    d| j                    d| j                   d}|d| j                    dz  }| j                  r |d| j                    d| j                   dz  }d}t        |j	                               D ]  }|j                  | j                   dz         s"|j                  d	      s|j                  d
      rEd}| j                  |      }dj                  d |j                         D              }||   }||d	z      }||d
z      }	||= ||d	z   = ||d
z   = || j                    d| d| dz  }|| j                    d| d| dz  }|| j                    d| d|	 dz  } |sy|S )Nr[   r\   r]   r^   r~   r_   Fr3   r   rz   Tr`   c              3   2   K   | ]  \  }}| d | d  ywrb   rK   rd   s      r   rh   z1CmfMetricSummary.render_metric.<locals>.<genexpr>   ri   rj   z_sum{rl   z_count{r   r   r   )
r+   ro   rX   rp   rE   r%   rq   r*   
data_countr   s
             r   rr   zCmfMetricSummary.render_metric   s   		{!DII;b1:..99WTYYKq266C
)* 	IC>>$))E/2||H%j)AE'',Dxx`SWS]S]S_``Hc?D#CL1J%c*n5L33x<(3z>*dii[xjD6<<Cdii[
#j\DDCdii[
8*C~RHHC#	I$ 
r   Nrs   rK   r   r   r   r      s    (r   r   c                   \    e Zd Zed        Zed        Zed        Zed        Zed        Zy)MetricManagerc                 .   t         j                  j                  j                  dd      D ci c]  \  }}|j	                         t        |      ! }}}d}t        j                  j                         D ]  }||j                  |      z  } |S c c}}w )NEVA_METRICSi  )countr   )
APPREDIS_DBredis
hscan_iterdecoder{   r   r   valuesrr   )r   r?   vro   rX   metrics         r   renderzMetricManager.render   s    36<<3E3E3P3PQ^fj3P3klCAaahhjQ'l
l$--446 	4F6''
33C	4
 ms   $Bc                 p   g }g }g }t         j                  j                         D ]  }|j                         D ]k  \  }}}|dk(  r|j	                  ||g        |dk(  r|j	                  ||g       9|dk(  r|j	                  ||g       Rt        d| d|j                           t        j                  j                  j                         }|D ]  \  }}|j                  d||        |D ]  \  }}|j                  d||        |D ]  \  }}|j                  d||        |j                          y )Nrx   rT   ry   zUnknown op=u    в dump_to_redis у r   )r   r   r   rY   rV   	Exceptionr   r   r   r   pipelinehincrbyhsetry   execute)	r   
redis_inrsredis_updatesredis_hsetnxr   oprE   r*   pipes	            r   save_to_rediszMetricManager.save_to_redis   sG    
$--446 		ZF!'!5!5!7 ZC<%%sDk28^!((#t58^ ''d4#k"5J6;;-$XYYZ		Z ||!!**,# 	3ICLLT2	3& 	0ICIImS$/	0% 	2ICKKsD1	2r   c                     t         j                  | j                         t         j                  | j                         y r   )geventspawn_worker_redis_writer_worker_collector)r   s    r   spawn_gevent_workersz"MetricManager.spawn_gevent_workers  s(     	S--.S**+r   c                     d}	 t         j                  |d       	 | j                          )# t        $ r t        j                  d       Y !w xY w)NrC   Frefu>   Metrics save_to_redis завершился с ошибкой. )r   sleepr   r   logging	exception)r   intervals     r   r   z"MetricManager._worker_redis_writer  sR    LLuL-!!#   !!Ts   - AAc                    ddl m} d}	 t        j                  |d        |       5  t	        dd      }t
        j                  j                         D ]s  \  }}t
        j                  |   }t        j                         |k  r1	 |j                          t        j                         |j                  z   t
        j                  |<   u  |        d d d        # t        $ r t        j                  d| d	       Y hw xY w# 1 sw Y   2xY w)
Nr   )cmf_contextrC   Fr   z$MetricManager._worker_collector_iterd   z!MetricManager._worker_collector: u,   .run завершился с ошибкой.)cmf.appr   r   r   r   MetricRealtimeCollectorRegistry_metric_collectorsrU   _metric_collector_timingsr|   runr   r   r   interval_min)r   r   r   
prof_pointcolelctor_namecollector_cls	next_times          r   r   zMetricManager._worker_collector"  s   'LLuL- ,-SUXY
5T5g5g5m5m5o 
I1NM ? Y YZh iIyy{Y. %))+
 ae`i`i`kn{  oI  oI  aI3MMn]
I   % ))??OO{| s0   ADC;D"C>;D=C>>DD
N)	r   r   r   classmethodr   r   r   r   r   rK   r   r   r   r      sd       2 , ,
 	 	  r   r   c                   &     e Zd Zi Zi Z fdZ xZS )r   c                 .   t         |   | |||      }|dk7  r|||_        || j                  |j                  <   t	        j                         t        j                  |j                  |j                  dz         dz  z   | j                  |j                  <   |S )NCmfMetricRealtimeCollectorrC   <   )
r	   __new__r   r   r|   random	randrangestart_delay_hard_minutesstart_delay_soft_minutesr   )mclsr   basesdct	new_classr   s        r   r   z'MetricRealtimeCollectorRegistry.__new__<  s    GOD$s;	//!IN6?D##INN3		v//	0R0RT]TvTvwxTxy|~~ **9>>:r   )r   r   r   r   r   r   r   r   s   @r   r   r   8  s     " r   r   c                   (    e Zd ZdZdZdZed        Zy)r   r         c                       y r   rK   rK   r   r   r   zCmfMetricRealtimeCollector.runQ  s    r   N)r   r   r   r   r   r   staticmethodr   rK   r   r   r   r   F  s'     L ! r   r   c                  L    t         j                  syt        j                         S )Nr   )configADVANCED_METRICSr   r   rK   r   r   get_metrics_textr   b  s    ""!!r   )cmf.includer|   r   r'   cmf.util.cmfutilr   typer   r   rN   ru   r   r   r   r   r   rK   r   r   <module>r      s        ,@	T 	;. ;|Y @'y 'T.y .dI IXd +J 8"r   