
    ji!              	          d dl  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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 eddd#$      d%        Z eddd&$      d'        Zy())    )*)CmfMetricCounterCmfMetricGaugeCmfMetricSummaryCmfMetricRealtimeCollector	pool_size postgresT)namehelpmodule_nameadd_worker_tagpool_checkedinpool_overflowpool_checkedouttable_countu5   Количество записей в таблицеtableF)r   r   r   custom_tagsadd_hostname_tagadd_app_tagu   Размер таблицыmbytes)r   r   r   r   unitr   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.runr   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\\^_r/   N)	__name__
__module____qualname____doc__interval_minstart_delay_hard_minutesstart_delay_soft_minutesstaticmethodr1   r.   r/   r0   r    r    j   s.     L  ` `r/   r    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   )configMETRICS_POSTGRES_DBr$   CmfFullSearchr&   r'   Sessionexecutefetchallr   r#   r   r   r   )sqldata_total_connectionsdata_active_connectionsdata_idle_connections$data_idle_in_transaction_connectionss        r0   postgres_realtime_metricsrJ   z   s    
 %%
C 


!
!
-
-
5
5
7
?
?
D
M
M
OPQ
R q35JLp##$:;$$%<=""#89%%&JKr/   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)r>   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   )r?   r@   r$   rA   r&   r'   rB   rC   rD   r   r#   
table_sizer   r   )rE   table_sizesdata_table_namedata_table_countdata_table_sizedata_index_size_data_db_sizes           r0   postgres_analytic_metricsrT      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,r/   N)cmf.includecmf.util.metricsr   r   r   r   r   r   r   r   r   rL   r   r   r   r   r   r   r    cmf_deferred_jobrJ   rT   r.   r/   r0   <module>rX      s    k k 				  			 			 !			 		@	 		&		
 "		@		  			 +	$	_  ,	%	p  *	#	d  -	&	s `9 `  DTKHL IL@ DTIF&  G& r/   