
    )5j!              	          d dl  d dlZd dlmZmZmZmZ  edddd      Z ed	ddd      Z ed
ddd      Z	 edddd      Z
 eddddd      Z eddddd      Z eddddgdd      Z eddddgddd      Z eddddgddd      Z edddddd      Z edd ddd!      Z ed"d#ddd!      Z ed$d%ddd!      Z ed&d'ddd!      Z G d( d)e      Zd* Z eddd+,      d-        Z eddd.,      d/        Zy)0    )*N)CmfMetricCounterCmfMetricGaugeCmfMetricSummaryCmfMetricRealtimeCollector	pool_size postgresT)namehelpmodule_nameadd_worker_tagpool_checkedinpool_overflowpool_checkedoutpool_checkout_waitu   Время ожидания получения подключения к БД из пула соединений (включая время создания новый подключений к БД)milliseconds)r   r   r   r   unitpool_create_connectionuE   Время создания новый подключений к БДtable_countu5   Количество записей в таблицеtableF)r   r   r   custom_tagsadd_hostname_tagadd_app_tagu   Размер таблицыmbytes)r   r   r   r   r   r   r   table_index_sizeu5   Размер всех индексов таблицыdb_sizeu   Размер БД)r   r   r   r   r   r   pg_stat_total_connectionsuT   Количество подключений к БД (статистика из БД))r   r   r   r   r   pg_stat_active_connectionsue   Количество активных подключений к БД (статистика из БД)pg_stat_idle_connectionsuY   Количество idle подключений к БД (статистика из БД)pg_stat_idle_in_transactionuh   Количество idle_in_transaction подключений к БД (статистика из БД)c                   ,    e Zd ZdZdZdZdZed        Zy)CmfPostgresStatCollectorun   
    Сохраняем данные о количестве и свойствах подключения
       c                     t         j                  t        j                  j                  j
                  j                  j                  j                                t        j                  t        j                  j                  j
                  j                  j                  j                                t        j                  t        j                  j                  j
                  j                  j                  j                                t        j                  t        j                  j                  j
                  j                  j                  j                                y )N)r   writemodelsCmfGlobalSettingsdpdata_driverenginepoolsizer   	checkedinr   overflowr   
checkedout     !./cmf/metrics/postgres_metrics.pyrunzCmfPostgresStatCollector.run   s    0033??FFKKPPRSV5588DDKKPPZZ\]F4477CCJJOOXXZ[f6699EELLQQ\\^_r2   N)	__name__
__module____qualname____doc__interval_minstart_delay_hard_minutesstart_delay_soft_minutesstaticmethodr4   r1   r2   r3   r#   r#   }   s.     L  ` `r2   r#   c                  >   t         j                  sy d }  | t        j                  j                  j
                  j                  j                  j                        t        j                  j                  j
                  j                  j                  _        d } |t        j                  j                  j
                  j                  j                  j                        t        j                  j                  j
                  j                  j                  _	        y )Nc                       fd}|S )Nc                      t        j                          } | i |}t        j                          |z
  }t        j                  t        |dz               |S Ni  )timer   r&   intargskwargsst_timeresultdurationfuncs        r3   wrapperz@_patch_postgres.<locals>._checkout_command_wrap.<locals>.wrapper   sI    iikG4*6*Fyy{W,H$$S$%78Mr2   r1   rI   rJ   s   ` r3   _checkout_command_wrapz/_patch_postgres.<locals>._checkout_command_wrap       	 r2   c                       fd}|S )Nc                      t        j                          } | i |}t        j                          |z
  }t        j                  t        |dz               |S r@   )rA   r   r&   rB   rC   s        r3   rJ   zI_patch_postgres.<locals>._create_connection_command_wrap.<locals>.wrapper   sI    iikG4*6*Fyy{W,H"((Xd]);<Mr2   r1   rK   s   ` r3   _create_connection_command_wrapz8_patch_postgres.<locals>._create_connection_command_wrap   rM   r2   )
configMETRICS_POSTGRES_DBr'   r(   r)   r*   r+   r,   _do_get_create_connection)rL   rP   s     r3   _patch_postgresrU      s    %% 	v77::FFMMRRZZ[ ++2277? 	((@(@(C(C(O(O(V(V([([(n(no ++2277Jr2   z	@minutely)	only_once
system_jobschedulec                     t         j                  syd} t        j                  j                  j
                  j                         j                  |       j                         d   \  }}}}t        j                  |       t        j                  |       t        j                  |       t        j                  |       y)Y   
    Аналитические метрики, запрошенные из Postgres
    Na  
        SELECT
            COUNT(*) as total_connections,
            COUNT(*) FILTER (WHERE state = 'active') as active_connections,
            COUNT(*) FILTER (WHERE state = 'idle') as idle_connections,
            COUNT(*) FILTER (WHERE state = 'idle in transaction') as idle_in_transaction_connections
        FROM 
            pg_stat_activity
        WHERE 
            datname = current_database();
    r   )rQ   rR   r'   CmfFullSearchr)   r*   Sessionexecutefetchallr   r&   r   r    r!   )sqldata_total_connectionsdata_active_connectionsdata_idle_connections$data_idle_in_transaction_connectionss        r3   postgres_realtime_metricsrd      s    
 %%
C 


!
!
-
-
5
5
7
?
?
D
M
M
OPQ
R q35JLp##$:;$$%<=""#89%%&JKr2   z@hourlyc                  D   t         j                  syd} t        j                  j                  j
                  j                         j                  |       j                         }|D ]M  \  }}}}}t        j                  ||       t        j                  ||       t        j                  ||       O d} t        j                  j                  j
                  j                         j                  |       j                         d   d   }t        j                  |       y)rZ   Na  
        SELECT
            t.table_name,
            (xpath('/row/cnt/text()', query_to_xml(format('SELECT COUNT(*) AS cnt FROM %I', t.table_name), false, true, '')))[1]::text::bigint AS row_count,
            pg_relation_size(quote_ident(t.table_name)) / (1024 * 1024) AS data_size_mb,
            (pg_total_relation_size(quote_ident(t.table_name)) - pg_relation_size(quote_ident(t.table_name))) / (1024 * 1024) AS indexes_size_mb,
            pg_total_relation_size(quote_ident(t.table_name)) / (1024 * 1024) AS total_size_mb
        FROM
            information_schema.tables t
        WHERE
            t.table_schema = current_schema()
            AND t.table_type = 'BASE TABLE'
        ORDER BY
            row_count DESC;
    )r   u  
        SELECT
            pg_database_size(datname) / (1024 * 1024) AS size_mb
        FROM
            pg_database
        WHERE
            datistemplate = false  -- исключаем шаблонные БД
            and datname = current_database();
    r   )rQ   rR   r'   r[   r)   r*   r\   r]   r^   r   r&   
table_sizer   r   )r_   table_sizesdata_table_namedata_table_countdata_table_sizedata_index_size_data_db_sizes           r3   postgres_analytic_metricsrn      s    
 %%C &&))55==?GGLUUWKR] GN)?OQ*/B@oFG
C ''**66>>@HHMVVXYZ[\]^LMM,r2   )cmf.includerA   cmf.util.metricsr   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   r   r    r!   r#   rU   cmf_deferred_jobrd   rn   r1   r2   r3   <module>rr      s     k k 				  			 			 !			 &	 
S	  *	!	P	  		@	 		&		
 "		@		  			 +	$	_  ,	%	p  *	#	d  -	&	s `9 ` p6 DTKHL IL@ DTIF&  G& r2   