zabbix_export: version: '7.0' template_groups: - uuid: 748ad4d098d447d492bb935c907f652f name: Templates/Databases templates: - uuid: e0a7c3e725c445228b03116dc6114fe9 template: 'PostgreSQL by ODBC' name: 'PostgreSQL by ODBC' description: | This template is designed for the effortless deployment of PostgreSQL monitoring by Zabbix via ODBC and doesn't require any external scripts. Setup: 1. Create the PostgreSQL user for monitoring (`` at your discretion) and inherit permissions from the default role `pg_monitor`: CREATE USER zbx_monitor WITH PASSWORD '' INHERIT; GRANT pg_monitor TO zbx_monitor; 2. Edit the `pg_hba.conf` configuration file to allow TCP connections for the user `zbx_monitor`. You can check the PostgreSQL documentation for examples (https://www.postgresql.org/docs/current/auth-pg-hba-conf.html). 3. Install the PostgreSQL ODBC driver. 4. Set up the connection string with the `{$PG.CONNSTRING}` macro. The minimum required parameters are: - `Driver=` - set the name of the driver which will be used for monitoring (from the `odbcinst.ini` file) or specify the path to the driver file (for example `/usr/lib64/psqlodbcw.so`); - `Servername=` - set the host name or IP address of the PostgreSQL instance; - `Port=` - adjust the port number if needed. If you want to use SSL/TLS encryption to protect communications with the remote PostgreSQL instance, you can also specify encryption parameters here. It is assumed that you set up the PostgreSQL instance to work in the desired encryption mode. Check the PostgreSQL documentation (https://www.postgresql.org/docs/current/ssl-tcp.html) for details. For example, to enable required encryption in transport mode without identity checks, the connection string could look like this (replace `` with the address of the PostgreSQL instance): Servername=;Port=5432;Driver=/usr/lib64/psqlodbcw.so;SSLmode=require 5. Set the password that you specified in step 1 in the macro `{$PG.PASSWORD}`. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/384190-%C2%A0discussion-thread-for-official-zabbix-template-db-postgresql Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Databases items: - uuid: 9440208c49134347809eff39109c644f name: 'PostgreSQL: Get archive' type: ODBC key: 'db.odbc.select[pgsql.archive,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | WITH values AS ( SELECT 4096/(ceil(pg_settings.setting::numeric/1024/1024))::int AS segment_parts_count, setting::bigint AS segment_size, ('x' || substring(pg_stat_archiver.last_archived_wal from 9 for 8))::bit(32)::int AS last_wal_div, ('x' || substring(pg_stat_archiver.last_archived_wal from 17 for 8))::bit(32)::int AS last_wal_mod, CASE WHEN pg_is_in_recovery() THEN NULL ELSE ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int END AS current_wal_div, CASE WHEN pg_is_in_recovery() THEN NULL ELSE ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int END AS current_wal_mod FROM pg_settings, pg_stat_archiver WHERE pg_settings.name = 'wal_segment_size') SELECT json_build_object( 'archived_count', (SELECT archived_count FROM pg_stat_archiver), 'failed_count', (SELECT failed_count FROM pg_stat_archiver), 'count_files', (SELECT greatest(coalesce((segment_parts_count - last_wal_mod) + ((current_wal_div - last_wal_div - 1) * segment_parts_count) + current_wal_mod - 1, 0), 0) FROM values), 'size_files', (SELECT greatest(coalesce(((segment_parts_count - last_wal_mod) + ((current_wal_div - last_wal_div - 1) * segment_parts_count) + current_wal_mod - 1) * segment_size, 0), 0) FROM values) ) AS result username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Collect archive status metrics.' tags: - tag: component value: raw - uuid: dd79edeb2d65420fb58d587e411c440f name: 'PostgreSQL: Count of autovacuum workers' type: ODBC key: 'db.odbc.select[pgsql.autovacuum.count,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d value_type: FLOAT params: | SELECT count(*) FROM pg_catalog.pg_stat_activity WHERE query like '%%autovacuum%%' AND state <> 'idle' AND pid <> pg_catalog.pg_backend_pid() username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Number of autovacuum workers.' tags: - tag: component value: system - uuid: ec6e574448804ed5bb71fa6dafa3b3f8 name: 'PostgreSQL: Get bgwriter' type: ODBC key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | SELECT row_to_json(T) FROM ( SELECT checkpoints_timed, checkpoints_req, checkpoint_write_time, checkpoint_sync_time, current_setting('block_size')::int*buffers_checkpoint AS buffers_checkpoint, current_setting('block_size')::int*buffers_clean AS buffers_clean, maxwritten_clean, current_setting('block_size')::int*buffers_backend AS buffers_backend, buffers_backend_fsync, current_setting('block_size')::int*buffers_alloc AS buffers_alloc FROM pg_stat_bgwriter) T username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: | Collect all metrics from pg_stat_bgwriter: https://www.postgresql.org/docs/current/monitoring-stats.html#PG-STAT-BGWRITER-VIEW tags: - tag: component value: raw - uuid: 1d267b6aed064d03b4f464b27c1e897e name: 'PostgreSQL: Get connections sum' type: ODBC key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | SELECT row_to_json(T) FROM ( SELECT sum(CASE WHEN state = 'active' THEN 1 ELSE 0 END) AS active, sum(CASE WHEN state = 'idle' THEN 1 ELSE 0 END) AS idle, sum(CASE WHEN state = 'idle in transaction' THEN 1 ELSE 0 END) AS idle_in_transaction, sum(CASE WHEN state = 'idle in transaction (aborted)' THEN 1 ELSE 0 END) AS idle_in_transaction_aborted, sum(CASE WHEN state = 'fastpath function call' THEN 1 ELSE 0 END) AS fastpath_function_call, sum(CASE WHEN state = 'disabled' THEN 1 ELSE 0 END) AS disabled, count(*) AS total, count(*)*100/(SELECT current_setting('max_connections')::int) AS total_pct, sum(CASE WHEN wait_event IS NOT NULL THEN 1 ELSE 0 END) AS waiting, (SELECT count(*) FROM pg_prepared_xacts) AS prepared FROM pg_stat_activity WHERE datid IS NOT NULL AND state IS NOT NULL) T username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: | Collect all metrics from pg_stat_activity: https://www.postgresql.org/docs/current/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW tags: - tag: component value: raw - uuid: 0f93764d56574a288467ad16dce11a17 name: 'PostgreSQL: Get dbstat' type: ODBC key: 'db.odbc.select[pgsql.dbstat,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | SELECT json_object_agg(coalesce (datname,'null'), row_to_json(T)) FROM ( SELECT datname, numbackends AS numbackends, xact_commit AS xact_commit, xact_rollback AS xact_rollback, blks_read AS blks_read, blks_hit AS blks_hit, tup_returned AS tup_returned, tup_fetched AS tup_fetched, tup_inserted AS tup_inserted, tup_updated AS tup_updated, tup_deleted AS tup_deleted, conflicts AS conflicts, temp_files AS temp_files, temp_bytes AS temp_bytes, deadlocks AS deadlocks, blk_read_time AS blk_read_time, blk_write_time AS blk_write_time FROM pg_catalog.pg_stat_database WHERE datname IS NOT NULL) T; username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: | Collect all metrics from pg_stat_database per database: https://www.postgresql.org/docs/current/monitoring-stats.html#PG-STAT-DATABASE-VIEW tags: - tag: component value: raw - uuid: 6ea1a17fad8b4ef3aba8b49a0922a77d name: 'PostgreSQL: Get dbstat sum' type: ODBC key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | SELECT row_to_json(T) FROM ( SELECT sum(numbackends) AS numbackends, sum(xact_commit) AS xact_commit, sum(xact_rollback) AS xact_rollback, sum(blks_read) AS blks_read, sum(blks_hit) AS blks_hit, sum(tup_returned) AS tup_returned, sum(tup_fetched) AS tup_fetched, sum(tup_inserted) AS tup_inserted, sum(tup_updated) AS tup_updated, sum(tup_deleted) AS tup_deleted, sum(conflicts) AS conflicts, sum(temp_files) AS temp_files, sum(temp_bytes) AS temp_bytes, sum(deadlocks) AS deadlocks, sum(blk_read_time) AS blk_read_time, sum(blk_write_time) AS blk_write_time FROM pg_stat_database) T username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: | Collect all metrics from pg_stat_database as sums for all databases: https://www.postgresql.org/docs/current/monitoring-stats.html#PG-STAT-DATABASE-VIEW tags: - tag: component value: raw - uuid: efa015e294684fdeb711a0fde1256cf9 name: 'PostgreSQL: Get locks' type: ODBC key: 'db.odbc.select[pgsql.locks,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | WITH T AS (SELECT db.datname dbname, lower(replace(Q.mode, 'Lock', '')) AS MODE, coalesce(T.qty, 0) val FROM pg_database db JOIN ( VALUES ('AccessShareLock') ,('RowShareLock') ,('RowExclusiveLock') ,('ShareUpdateExclusiveLock') ,('ShareLock') ,('ShareRowExclusiveLock') ,('ExclusiveLock') ,('AccessExclusiveLock')) Q(MODE) ON TRUE NATURAL LEFT JOIN (SELECT datname, MODE, count(MODE) qty FROM pg_locks lc RIGHT JOIN pg_database db ON db.oid = lc.database GROUP BY 1, 2) T WHERE NOT db.datistemplate ORDER BY 1, 2) SELECT json_object_agg(dbname, row_to_json(T2)) FROM (SELECT dbname, sum(val) AS total, sum(CASE WHEN MODE = 'accessexclusive' THEN val END) AS accessexclusive, sum(CASE WHEN MODE = 'accessshare' THEN val END) AS accessshare, sum(CASE WHEN MODE = 'exclusive' THEN val END) AS EXCLUSIVE, sum(CASE WHEN MODE = 'rowexclusive' THEN val END) AS rowexclusive, sum(CASE WHEN MODE = 'rowshare' THEN val END) AS rowshare, sum(CASE WHEN MODE = 'share' THEN val END) AS SHARE, sum(CASE WHEN MODE = 'sharerowexclusive' THEN val END) AS sharerowexclusive, sum(CASE WHEN MODE = 'shareupdateexclusive' THEN val END) AS shareupdateexclusive FROM T GROUP BY dbname) T2 username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: | Collect all metrics from pg_locks per database: https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-TABLES tags: - tag: component value: raw - uuid: 266a9b5c1e604d97ac5a74ccdb598c97 name: 'PostgreSQL: Age of oldest xid' type: ODBC key: 'db.odbc.select[pgsql.oldest.xid,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d value_type: FLOAT params: | SELECT greatest(max(age(backend_xmin)), max(age(backend_xid))) FROM pg_catalog.pg_stat_activity username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Age of oldest xid.' tags: - tag: component value: transactions triggers: - uuid: 4d32971898d441fb94d5f029649dddfa expression: 'last(/PostgreSQL by ODBC/db.odbc.select[pgsql.oldest.xid,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]) > 18000000' name: 'PostgreSQL: Oldest xid is too big' priority: AVERAGE tags: - tag: scope value: availability - uuid: 3c16a3c2db7641c2b6958649d7b4809e name: 'PostgreSQL: Ping' type: ODBC key: 'db.odbc.select[pgsql.ping,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d params: 'SELECT 1' username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Used to test a connection to see if it is alive. It is set to 0 if the query is unsuccessful.' valuemap: name: 'Service state' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' error_handler: CUSTOM_VALUE error_handler_params: '0' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h tags: - tag: component value: application - tag: component value: health triggers: - uuid: 758e569b51954fcf82c7cb3fa391c882 expression: 'last(/PostgreSQL by ODBC/db.odbc.select[pgsql.ping,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"])=0' name: 'PostgreSQL: Service is down' priority: HIGH description: 'Last test of a connection was unsuccessful.' tags: - tag: scope value: availability - uuid: ee6b3f64e07d4acd875dbd83dccd51d0 name: 'PostgreSQL: Get queries' type: ODBC key: 'db.odbc.select[pgsql.queries,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | WITH T AS (SELECT db.datname, coalesce(T.query_time_max, 0) query_time_max, coalesce(T.tx_time_max, 0) tx_time_max, coalesce(T.mro_time_max, 0) mro_time_max, coalesce(T.query_time_sum, 0) query_time_sum, coalesce(T.tx_time_sum, 0) tx_time_sum, coalesce(T.mro_time_sum, 0) mro_time_sum, coalesce(T.query_slow_count, 0) query_slow_count, coalesce(T.tx_slow_count, 0) tx_slow_count, coalesce(T.mro_slow_count, 0) mro_slow_count FROM pg_database db NATURAL LEFT JOIN ( SELECT datname, extract(epoch FROM now())::integer ts, coalesce(max(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle', 'idle in transaction', 'idle in transaction (aborted)') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) query_time_max, coalesce(max(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) tx_time_max, coalesce(max(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query ~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) mro_time_max, coalesce(sum(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle', 'idle in transaction', 'idle in transaction (aborted)') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) query_time_sum, coalesce(sum(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) tx_time_sum, coalesce(sum(extract('epoch' FROM (clock_timestamp() - query_start))::integer * (state NOT IN ('idle') AND query ~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) mro_time_sum, coalesce(sum((extract('epoch' FROM (clock_timestamp() - query_start)) > {$PG.QUERY_ETIME.MAX.WARN})::integer * (state NOT IN ('idle', 'idle in transaction', 'idle in transaction (aborted)') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) query_slow_count, coalesce(sum((extract('epoch' FROM (clock_timestamp() - query_start)) > {$PG.QUERY_ETIME.MAX.WARN})::integer * (state NOT IN ('idle') AND query !~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) tx_slow_count, coalesce(sum((extract('epoch' FROM (clock_timestamp() - query_start)) > {$PG.QUERY_ETIME.MAX.WARN})::integer * (state NOT IN ('idle') AND query ~* E'^(\\s*(--[^\\n]*\\n|/\\*.*\\*/|\\n))*(autovacuum|VACUUM|ANALYZE|REINDEX|CLUSTER|CREATE|ALTER|TRUNCATE|DROP)')::integer), 0) mro_slow_count FROM pg_stat_activity WHERE pid <> pg_backend_pid() GROUP BY 1) T WHERE NOT db.datistemplate ) SELECT json_object_agg(datname, row_to_json(T)) FROM T username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Collect all metrics by query execution time.' tags: - tag: component value: raw - uuid: d156db3cb35049a88179060583961156 name: 'PostgreSQL: Replication: Standby count' type: ODBC key: 'db.odbc.select[pgsql.replication.count,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d params: 'SELECT count(*) FROM pg_stat_replication' username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Number of standby servers.' tags: - tag: component value: replication - uuid: 669d87ebf9324d6eaa26c3cb44efc850 name: 'PostgreSQL: Replication: Lag in bytes' type: ODBC key: 'db.odbc.select[pgsql.replication.lag.b,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d units: B params: | SELECT CASE WHEN NOT pg_is_in_recovery() OR pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() THEN 0 ELSE COALESCE(EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::integer, 0) END AS lag username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Replication lag with master, in bytes.' tags: - tag: component value: replication - uuid: bb87b83d35784d3ea5be2263fa3722b0 name: 'PostgreSQL: Replication: Lag in seconds' type: ODBC key: 'db.odbc.select[pgsql.replication.lag.sec,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d units: s params: | SELECT CASE WHEN NOT pg_is_in_recovery() OR pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() THEN 0 ELSE COALESCE(EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::integer, 0) END AS lag username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Replication lag with master, in seconds.' tags: - tag: component value: replication - uuid: 3f2b5c02a6be40d4837205f68aaacabb name: 'PostgreSQL: Get replication' type: ODBC key: 'db.odbc.select[pgsql.replication.process,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: '0' trends: '0' value_type: TEXT params: | SELECT json_object_agg(application_name, row_to_json(T)) FROM ( SELECT application_name, EXTRACT(epoch FROM COALESCE(flush_lag,'0'::interval)) AS flush_lag, EXTRACT(epoch FROM COALESCE(replay_lag,'0'::interval)) AS replay_lag, EXTRACT(epoch FROM COALESCE(write_lag, '0'::interval)) AS write_lag FROM pg_stat_replication ) T username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Collect metrics from the pg_stat_replication, which contains information about the WAL sender process, showing statistics about replication to that sender''s connected standby server.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' tags: - tag: component value: raw - uuid: f8205cdd902a4a688b5bcb7f65d8e41d name: 'PostgreSQL: Replication: Recovery role' type: ODBC key: 'db.odbc.select[pgsql.replication.recovery_role,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d params: 'SELECT pg_is_in_recovery()::int' username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Replication role: 1 — recovery is still in progress (standby mode), 0 — master mode.' valuemap: name: 'PostgreSQL recovery role' tags: - tag: component value: replication - uuid: 6cc8c748f6174d3dba9aa9b39570b006 name: 'PostgreSQL: Replication: Status' type: ODBC key: 'db.odbc.select[pgsql.replication.status,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d params: | SELECT CASE WHEN NOT pg_is_in_recovery() THEN 2 ELSE (SELECT count(*) FROM pg_stat_wal_receiver) END AS repl_status username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Replication status: 0 — streaming is down, 1 — streaming is up, 2 — master mode.' valuemap: name: 'PostgreSQL replication status' tags: - tag: component value: replication - uuid: 817c494132044fff88ea4c9fcaacb60a name: 'PostgreSQL: Uptime' type: ODBC key: 'db.odbc.select[pgsql.uptime,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' history: 7d value_type: FLOAT units: s params: 'SELECT date_part(''epoch'', now() - pg_postmaster_start_time())' username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Time since the server started.' tags: - tag: component value: application triggers: - uuid: 22077f0b0ee54becb43ef9ab808c3e43 expression: 'last(/PostgreSQL by ODBC/db.odbc.select[pgsql.uptime,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]) < 10m' name: 'PostgreSQL: Service has been restarted' event_name: 'PostgreSQL: Service has been restarted (uptime < 10m)' priority: AVERAGE description: 'PostgreSQL uptime is less than 10 minutes.' tags: - tag: scope value: notice - uuid: 8af13c6154744e9596a0f96dfbf09d8b name: 'PostgreSQL: Get WAL' type: ODBC key: 'db.odbc.select[pgsql.wal.stat,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' delay: 5m history: '0' trends: '0' value_type: TEXT params: | SELECT row_to_json(T) FROM ( SELECT CASE WHEN pg_is_in_recovery() THEN 0 ELSE pg_wal_lsn_diff(pg_current_wal_lsn(),'0/00000000') END AS WRITE, CASE WHEN NOT pg_is_in_recovery() THEN 0 ELSE pg_wal_lsn_diff(pg_last_wal_receive_lsn(),'0/00000000') END AS RECEIVE, count(*) FROM pg_ls_waldir() AS COUNT ) T username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Collect write-ahead log (WAL) metrics.' tags: - tag: component value: raw - uuid: d69d40f3e7064f668b0bf150ff73aafc name: 'Archive: Count of archived files' type: DEPENDENT key: pgsql.archive.count_archived_files delay: '0' history: 7d value_type: FLOAT description: 'Count of archived files.' preprocessing: - type: JSONPATH parameters: - $.archived_count master_item: key: 'db.odbc.select[pgsql.archive,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: archive - uuid: c1cc1236cf0c412a84e7d1ff3fec14e5 name: 'Archive: Count of files in archive_status need to archive' type: DEPENDENT key: pgsql.archive.count_files_to_archive delay: '0' history: 7d value_type: FLOAT description: 'Count of files to archive.' preprocessing: - type: JSONPATH parameters: - $.count_files master_item: key: 'db.odbc.select[pgsql.archive,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: archive - uuid: 1ea44a48aaf042debc078ad920dd4f02 name: 'Archive: Count of failed attempts to archive files' type: DEPENDENT key: pgsql.archive.failed_trying_to_archive delay: '0' history: 7d value_type: FLOAT description: 'Count of failed attempts to archive files.' preprocessing: - type: JSONPATH parameters: - $.failed_count master_item: key: 'db.odbc.select[pgsql.archive,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: archive - uuid: 13f563e6152a482fb48415d81f916af2 name: 'Archive: Size of files need to archive' type: DEPENDENT key: pgsql.archive.size_files_to_archive delay: '0' history: 7d value_type: FLOAT description: 'Size of files to archive.' preprocessing: - type: JSONPATH parameters: - $.size_files master_item: key: 'db.odbc.select[pgsql.archive,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: archive - uuid: 01b14665e1154c748324612d1e1ac8e3 name: 'Bgwriter: Buffers allocated per second' type: DEPENDENT key: pgsql.bgwriter.buffers_alloc.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of buffers allocated per second.' preprocessing: - type: JSONPATH parameters: - $.buffers_alloc - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: bea9f6c0525c4a03a8ded982da45635d name: 'Bgwriter: Buffers written directly by a backend per second' type: DEPENDENT key: pgsql.bgwriter.buffers_backend.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of buffers written directly by a backend per second.' preprocessing: - type: JSONPATH parameters: - $.buffers_backend - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: c6c5e980ffde4e62a7194602eaaa4c93 name: 'Bgwriter: Times a backend executed its own fsync per second' type: DEPENDENT key: pgsql.bgwriter.buffers_backend_fsync.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of times a backend had to execute its own fsync call per second (normally the background writer handles those even when the backend does its own write).' preprocessing: - type: JSONPATH parameters: - $.buffers_backend_fsync - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: c8cbd79cf23f4ef0a374d2afabe1d204 name: 'Checkpoint: Buffers written during checkpoints per second' type: DEPENDENT key: pgsql.bgwriter.buffers_checkpoint.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of buffers written during checkpoints per second.' preprocessing: - type: JSONPATH parameters: - $.buffers_checkpoint - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: 79563e8b9f054ce7afc93e50c0156f6f name: 'Checkpoint: Buffers written by the background writer per second' type: DEPENDENT key: pgsql.bgwriter.buffers_clean.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of buffers written by the background writer per second.' preprocessing: - type: JSONPATH parameters: - $.buffers_clean - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: 9664a657f80246a687e4f60194abd608 name: 'Checkpoint: Requested per second' type: DEPENDENT key: pgsql.bgwriter.checkpoints_req.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of requested checkpoints that have been performed per second.' preprocessing: - type: JSONPATH parameters: - $.checkpoints_req - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: 1956bd5ce6d1456298efb28b0d41f061 name: 'Checkpoint: Scheduled per second' type: DEPENDENT key: pgsql.bgwriter.checkpoints_timed.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of scheduled checkpoints that have been performed per second.' preprocessing: - type: JSONPATH parameters: - $.checkpoints_timed - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: acdc021b00144e70a8326bd1cc1f2b28 name: 'Checkpoint: Checkpoint sync time per second' type: DEPENDENT key: pgsql.bgwriter.checkpoint_sync_time.rate delay: '0' history: 7d value_type: FLOAT units: s description: 'Total amount of time per second that has been spent in the portion of checkpoint processing where files are synchronized to disk.' preprocessing: - type: JSONPATH parameters: - $.checkpoint_sync_time - type: MULTIPLIER parameters: - '0.001' - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: 6db37bd846e8406a965c0638bb55b230 name: 'Checkpoint: Checkpoint write time per second' type: DEPENDENT key: pgsql.bgwriter.checkpoint_write_time.rate delay: '0' history: 7d value_type: FLOAT units: s description: 'Total amount of time per second that has been spent in the portion of checkpoint processing where files are written to disk.' preprocessing: - type: JSONPATH parameters: - $.checkpoint_write_time - type: MULTIPLIER parameters: - '0.001' - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: 073572decc084ff39d5a58cabb4860a5 name: 'Bgwriter: Number of bgwriter cleaning scan stopped per second' type: DEPENDENT key: pgsql.bgwriter.maxwritten_clean.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of times the background writer stopped a cleaning scan because it had written too many buffers per second.' preprocessing: - type: JSONPATH parameters: - $.maxwritten_clean - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.bgwriter,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: bgwriter - uuid: 6444043a810b4b2f89740c1c794a47c0 name: 'PostgreSQL: Cache hit ratio, %' type: CALCULATED key: pgsql.cache.hit history: 7d value_type: FLOAT units: '%' params: 'last(//pgsql.dbstat.sum.blks_hit.rate) * 100 / (last(//pgsql.dbstat.sum.blks_hit.rate) + last(//pgsql.dbstat.sum.blks_read.rate))' description: 'Cache hit ratio.' tags: - tag: component value: cache - uuid: 5e3e5b6a244c4dfdacc7167196e28d7d name: 'Connections sum: Active' type: DEPENDENT key: pgsql.connections.sum.active delay: '0' history: 7d description: 'Total number of connections executing a query.' preprocessing: - type: JSONPATH parameters: - $.active master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 2dd753d41b5e4c4098fef4fe5ac51060 name: 'Connections sum: Disabled' type: DEPENDENT key: pgsql.connections.sum.disabled delay: '0' history: 7d description: 'Total number of disabled connections.' preprocessing: - type: JSONPATH parameters: - $.disabled master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 6d379fe1fe424ed68dea03a90da81da0 name: 'Connections sum: Fastpath function call' type: DEPENDENT key: pgsql.connections.sum.fastpath_function_call delay: '0' history: 7d description: 'Total number of connections executing a fast-path function.' preprocessing: - type: JSONPATH parameters: - $.fastpath_function_call master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 8b777c5628c4462580f1ae70790fb584 name: 'Connections sum: Idle' type: DEPENDENT key: pgsql.connections.sum.idle delay: '0' history: 7d description: 'Total number of connections waiting for a new client command.' preprocessing: - type: JSONPATH parameters: - $.idle master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 7851bc86735e46a48fd5c82d83ef066a name: 'Connections sum: Idle in transaction' type: DEPENDENT key: pgsql.connections.sum.idle_in_transaction delay: '0' history: 7d description: 'Total number of connections in a transaction state but not executing a query.' preprocessing: - type: JSONPATH parameters: - $.idle_in_transaction master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 9267653f21b445beaacd3de3e55ad4ae name: 'Connections sum: Idle in transaction (aborted)' type: DEPENDENT key: pgsql.connections.sum.idle_in_transaction_aborted delay: '0' history: 7d description: 'Total number of connections in a transaction state but not executing a query, and where one of the statements in the transaction caused an error.' preprocessing: - type: JSONPATH parameters: - $.idle_in_transaction_aborted master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 512e90360d4d4b95aa23014181697afe name: 'Connections sum: Prepared' type: DEPENDENT key: pgsql.connections.sum.prepared delay: '0' history: 7d description: | Total number of prepared transactions: https://www.postgresql.org/docs/current/sql-prepare-transaction.html preprocessing: - type: JSONPATH parameters: - $.prepared master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 4d092ed405e2410f9e1a4cdb31249fe0 name: 'Connections sum: Total' type: DEPENDENT key: pgsql.connections.sum.total delay: '0' history: 7d description: 'Total number of connections.' preprocessing: - type: JSONPATH parameters: - $.total master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 2b2ca7abb85b4ae1992cbfc6902206a1 name: 'Connections sum: Total, %' type: DEPENDENT key: pgsql.connections.sum.total_pct delay: '0' history: 7d units: '%' description: 'Total number of connections, in percentage.' preprocessing: - type: JSONPATH parameters: - $.total_pct master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections triggers: - uuid: 3b6662191c3b46ac930af02797a7162b expression: 'min(/PostgreSQL by ODBC/pgsql.connections.sum.total_pct,5m) > {$PG.CONN_TOTAL_PCT.MAX.WARN}' name: 'PostgreSQL: Total number of connections is too high' event_name: 'PostgreSQL: Total number of connections is too high (over {$PG.CONN_TOTAL_PCT.MAX.WARN}% in 5m)' priority: AVERAGE description: 'Total number of current connections exceeds the limit of {$PG.CONN_TOTAL_PCT.MAX.WARN}% out of the maximum number of concurrent connections to the database server (the "max_connections" setting).' tags: - tag: scope value: performance - uuid: 7f525a9b9b6a494db660649388b8cb21 name: 'Connections sum: Waiting' type: DEPENDENT key: pgsql.connections.sum.waiting delay: '0' history: 7d description: | Total number of waiting connections: https://www.postgresql.org/docs/current/monitoring-stats.html#WAIT-EVENT-TABLE preprocessing: - type: JSONPATH parameters: - $.waiting master_item: key: 'db.odbc.select[pgsql.connections.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: connections - uuid: 6cb6aaa39f494f13b792ea0d1570f0af name: 'Dbstat: Hit blocks read per second' type: DEPENDENT key: pgsql.dbstat.sum.blks_hit.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of times per second disk blocks were found already in the buffer cache.' preprocessing: - type: JSONPATH parameters: - $.blks_hit - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: cache - uuid: 8861dbcc607b481e9f7ca6b3081530a8 name: 'Dbstat: Disk blocks read per second' type: DEPENDENT key: pgsql.dbstat.sum.blks_read.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of disk blocks read per second.' preprocessing: - type: JSONPATH parameters: - $.blks_read - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: storage - uuid: a8a7afddbe7546068e3d629747d73848 name: 'Dbstat: Blocks read time' type: DEPENDENT key: pgsql.dbstat.sum.blk_read_time delay: '0' history: 7d value_type: FLOAT units: s description: 'Time spent reading data file blocks by backends.' preprocessing: - type: JSONPATH parameters: - $.blk_read_time - type: MULTIPLIER parameters: - '0.001' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: storage - uuid: 40b1da9a55cf4312a66dffa9031b9b15 name: 'Dbstat: Blocks write time' type: DEPENDENT key: pgsql.dbstat.sum.blk_write_time delay: '0' history: 7d value_type: FLOAT units: s description: 'Time spent writing data file blocks by backends.' preprocessing: - type: JSONPATH parameters: - $.blk_write_time - type: MULTIPLIER parameters: - '0.001' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: storage - uuid: ef6c8945243f41e88a08d93e66eec666 name: 'Dbstat: Conflicts per second' type: DEPENDENT key: pgsql.dbstat.sum.conflicts.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of queries canceled per second due to conflicts with recovery (conflicts occur only on standby servers; see pg_stat_database_conflicts for details).' preprocessing: - type: JSONPATH parameters: - $.conflicts - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: queries - uuid: 5adcf2ce06984da2b0b0600d88e88451 name: 'Dbstat: Deadlocks per second' type: DEPENDENT key: pgsql.dbstat.sum.deadlocks.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of deadlocks detected per second.' preprocessing: - type: JSONPATH parameters: - $.deadlocks - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: deadlocks - uuid: 26da7e85356644cdbe4d9efd20e43dd2 name: 'Dbstat: Backends connected' type: DEPENDENT key: pgsql.dbstat.sum.numbackends delay: '0' history: 7d description: 'Number of connected backends.' preprocessing: - type: JSONPATH parameters: - $.numbackends master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: backends - uuid: 4c18ecf383154136ad68d5d938fc83d7 name: 'Dbstat: Number temp bytes per second' type: DEPENDENT key: pgsql.dbstat.sum.temp_bytes.rate delay: '0' history: 7d value_type: FLOAT units: b description: 'Total amount of data written per second to temporary files by queries.' preprocessing: - type: JSONPATH parameters: - $.temp_bytes - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: storage - uuid: 0c7ad16e40e3454aaad27a6fe4b5e62d name: 'Dbstat: Number temp files per second' type: DEPENDENT key: pgsql.dbstat.sum.temp_files.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of temporary files created by queries per second.' preprocessing: - type: JSONPATH parameters: - $.temp_files - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: storage - uuid: e3cd2d8ec2b8454f949c69bb00e0db57 name: 'Dbstat: Rows deleted per second' type: DEPENDENT key: pgsql.dbstat.sum.tup_deleted.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of rows deleted by queries per second.' preprocessing: - type: JSONPATH parameters: - $.tup_deleted - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: queries - uuid: 9f09f94dcd6744e8b6a53167b1835a16 name: 'Dbstat: Rows fetched per second' type: DEPENDENT key: pgsql.dbstat.sum.tup_fetched.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of rows fetched by queries per second.' preprocessing: - type: JSONPATH parameters: - $.tup_fetched - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: queries - uuid: 916291299e624959993f8a585da6c9c0 name: 'Dbstat: Rows inserted per second' type: DEPENDENT key: pgsql.dbstat.sum.tup_inserted.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of rows inserted by queries per second.' preprocessing: - type: JSONPATH parameters: - $.tup_inserted - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: queries - uuid: fc8f68f5068240f3acd2d18443efc624 name: 'Dbstat: Rows returned per second' type: DEPENDENT key: pgsql.dbstat.sum.tup_returned.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of rows returned by queries per second.' preprocessing: - type: JSONPATH parameters: - $.tup_returned - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: queries - uuid: 802d541dd0314f8fba827e6d28013b5c name: 'Dbstat: Rows updated per second' type: DEPENDENT key: pgsql.dbstat.sum.tup_updated.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of rows updated by queries per second.' preprocessing: - type: JSONPATH parameters: - $.tup_updated - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: queries - uuid: c00a09d04d4443d885006b29c5c14546 name: 'Dbstat: Committed transactions per second' type: DEPENDENT key: pgsql.dbstat.sum.xact_commit.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of transactions that have been committed per second.' preprocessing: - type: JSONPATH parameters: - $.xact_commit - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: transactions - uuid: 8f2259521add4cc0bd5e274604172d04 name: 'Dbstat: Roll backed transactions per second' type: DEPENDENT key: pgsql.dbstat.sum.xact_rollback.rate delay: '0' history: 7d value_type: FLOAT description: 'Number of transactions that have been rolled back per second.' preprocessing: - type: JSONPATH parameters: - $.xact_rollback - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.dbstat.sum,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: transactions - uuid: 59722a42ba084a4f9a65f6b11f1180f4 name: 'WAL: Segments count' type: DEPENDENT key: pgsql.wal.count delay: '0' history: 7d description: 'Number of WAL segments.' preprocessing: - type: JSONPATH parameters: - $.count master_item: key: 'db.odbc.select[pgsql.wal.stat,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: wal - uuid: 5ffd0e54dd464b5c941ba40b696beda9 name: 'WAL: Bytes received' type: DEPENDENT key: pgsql.wal.receive delay: '0' history: 7d units: B description: 'WAL receive, in bytes.' preprocessing: - type: JSONPATH parameters: - $.receive - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.wal.stat,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: wal - uuid: 0dec7fe5cbe24fcf802cb387ca8edf98 name: 'WAL: Bytes written' type: DEPENDENT key: pgsql.wal.write delay: '0' history: 7d units: B description: 'WAL write, in bytes.' preprocessing: - type: JSONPATH parameters: - $.write - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'db.odbc.select[pgsql.wal.stat,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: wal discovery_rules: - uuid: 1c51decca55847a8adba4260f53e0acf name: 'Database discovery' type: ODBC key: 'db.odbc.select[pgsql.db.discovery,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' delay: 1h params: | WITH T AS ( SELECT datname AS "{#DBNAME}" FROM pg_database WHERE NOT datistemplate AND datallowconn AND datname != 'postgres' ) SELECT '{"data":'|| regexp_replace(coalesce(json_agg(T), '[]'::json)::text, E'[\\n\\r\\s]+', '', 'g') || '}' FROM T username: '{$PG.USER}' password: '{$PG.PASSWORD}' filter: evaltype: AND conditions: - macro: '{#DBNAME}' value: '{$PG.LLD.FILTER.DBNAME}' formulaid: A description: | Discovers databases (DB) in the database management system (DBMS), except: - templates; - default "postgres" DB; - DBs that do not allow connections. item_prototypes: - uuid: 98b74e578a3e48f3990bc16eb0217a17 name: 'DB [{#DBNAME}]: Database age' type: ODBC key: 'db.odbc.select[pgsql.db.age,,"Database={#DBNAME};{$PG.CONNSTRING}"]' delay: 10m history: 7d params: | SELECT age(datfrozenxid) FROM pg_catalog.pg_database WHERE datname = '{#DBNAME}' username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Database age.' tags: - tag: component value: application - tag: database value: '{#DBNAME}' - uuid: cb7067b756bc4b3eb5be2ee2361df6f8 name: 'DB [{#DBNAME}]: Bloating tables' type: ODBC key: 'db.odbc.select[pgsql.db.bloating_tables,,"Database={#DBNAME};{$PG.CONNSTRING}"]' history: 7d params: | SELECT count(*) FROM pg_catalog.pg_stat_all_tables WHERE (n_dead_tup/(n_live_tup+n_dead_tup)::float8) > 0.2 AND (n_live_tup+n_dead_tup) > 50 username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Number of bloating tables.' tags: - tag: component value: tables - tag: database value: '{#DBNAME}' - uuid: f6bc4dd7f66a4a399a16230b6a7a8f2d name: 'DB [{#DBNAME}]: Database size' type: ODBC key: 'db.odbc.select[pgsql.db.size,,"Database={#DBNAME};{$PG.CONNSTRING}"]' delay: 5m history: 7d units: B params: 'SELECT pg_database_size(current_database())' username: '{$PG.USER}' password: '{$PG.PASSWORD}' description: 'Database size.' tags: - tag: component value: storage - tag: database value: '{#DBNAME}' - uuid: d6c61f75147e414a99dfba56ea8ba422 name: 'DB [{#DBNAME}]: Blocks hit per second' type: DEPENDENT key: 'pgsql.dbstat.blks_hit.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of times per second disk blocks were found already in the buffer cache, so that a read was not necessary.' preprocessing: - type: JSONPATH parameters: - $.blks_hit - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: cache - tag: database value: '{#DBNAME}' - uuid: 086c614609174dabab3b7a231353f4fa name: 'DB [{#DBNAME}]: Disk blocks read per second' type: DEPENDENT key: 'pgsql.dbstat.blks_read.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of disk blocks read per second in this database.' preprocessing: - type: JSONPATH parameters: - $.blks_read - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: storage - tag: database value: '{#DBNAME}' - uuid: 3ce43b1b7b874278abef353c6c791c95 name: 'DB [{#DBNAME}]: Disk blocks read time per second' type: DEPENDENT key: 'pgsql.dbstat.blk_read_time.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT units: s description: 'Time spent reading data file blocks by backends per second.' preprocessing: - type: JSONPATH parameters: - $.blk_read_time - type: MULTIPLIER parameters: - '0.001' - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: storage - tag: database value: '{#DBNAME}' - uuid: 9c443a5bae6b4b4c84e6272cb254a38e name: 'DB [{#DBNAME}]: Disk blocks write time per second' type: DEPENDENT key: 'pgsql.dbstat.blk_write_time.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT units: s description: 'Time spent writing data file blocks by backends per second.' preprocessing: - type: JSONPATH parameters: - $.blk_write_time - type: MULTIPLIER parameters: - '0.001' - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: storage - tag: database value: '{#DBNAME}' - uuid: 8a772dae1d8f40978bfcceebfabe87de name: 'DB [{#DBNAME}]: Detected conflicts per second' type: DEPENDENT key: 'pgsql.dbstat.conflicts.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of queries canceled due to conflicts with recovery in this database per second.' preprocessing: - type: JSONPATH parameters: - $.conflicts - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' trigger_prototypes: - uuid: 8dc225c8a2824e5cb62b0ce4dd11dc1e expression: 'min(/PostgreSQL by ODBC/pgsql.dbstat.conflicts.rate["{#DBNAME}"],5m) > {$PG.CONFLICTS.MAX.WARN:"{#DBNAME}"}' name: 'DB [{#DBNAME}]: Too many recovery conflicts' event_name: 'DB [{#DBNAME}]: Too many recovery conflicts (over {$PG.CONFLICTS.MAX.WARN:"{#DBNAME}"} in 5m)' priority: AVERAGE description: | The primary and standby servers are in many ways loosely connected. Actions on the primary will have an effect on the standby. As a result, there is potential for negative interactions or conflicts between them. https://www.postgresql.org/docs/current/hot-standby.html#HOT-STANDBY-CONFLICT tags: - tag: scope value: performance - uuid: c4f382ef370640aa93c265dabe0b6dcd name: 'DB [{#DBNAME}]: Detected deadlocks per second' type: DEPENDENT key: 'pgsql.dbstat.deadlocks.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of detected deadlocks in this database per second.' preprocessing: - type: JSONPATH parameters: - $.deadlocks - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: deadlocks - tag: database value: '{#DBNAME}' trigger_prototypes: - uuid: 7e9c3fad615448deafbd21abdac7936d expression: 'min(/PostgreSQL by ODBC/pgsql.dbstat.deadlocks.rate["{#DBNAME}"],5m) > {$PG.DEADLOCKS.MAX.WARN:"{#DBNAME}"}' name: 'DB [{#DBNAME}]: Deadlock occurred' event_name: 'DB [{#DBNAME}]: Deadlock occurred (over {$PG.DEADLOCKS.MAX.WARN:"{#DBNAME}"} in 5m)' priority: HIGH description: 'Number of deadlocks detected per second exceeds {$PG.DEADLOCKS.MAX.WARN:"{#DBNAME}"} for 5m.' tags: - tag: scope value: availability - uuid: 4e977e75b4044928a75dcdd713be1169 name: 'DB [{#DBNAME}]: Get dbstat' type: DEPENDENT key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Get dbstat metrics for database "{#DBNAME}".' preprocessing: - type: JSONPATH parameters: - '$[''{#DBNAME}'']' error_handler: DISCARD_VALUE master_item: key: 'db.odbc.select[pgsql.dbstat,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: raw - tag: database value: '{#DBNAME}' - uuid: d65dc8860c6e4e00aca8dfc35c5e3346 name: 'DB [{#DBNAME}]: Backends connected' type: DEPENDENT key: 'pgsql.dbstat.numbackends["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of backends currently connected to this database.' preprocessing: - type: JSONPATH parameters: - $.numbackends master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: backends - tag: database value: '{#DBNAME}' - uuid: 65ce0c82404340bbb180bdb734573596 name: 'DB [{#DBNAME}]: Temp_bytes written per second' type: DEPENDENT key: 'pgsql.dbstat.temp_bytes.rate["{#DBNAME}"]' delay: '0' history: 7d units: B description: 'Total amount of data written to temporary files by queries in this database.' preprocessing: - type: JSONPATH parameters: - $.temp_bytes - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: storage - tag: database value: '{#DBNAME}' - uuid: 9b079ed6377841ee87005af6ebaaa830 name: 'DB [{#DBNAME}]: Temp_files created per second' type: DEPENDENT key: 'pgsql.dbstat.temp_files.rate["{#DBNAME}"]' delay: '0' history: 7d description: 'Total number of temporary files created by queries in this database.' preprocessing: - type: JSONPATH parameters: - $.temp_files - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: storage - tag: database value: '{#DBNAME}' - uuid: 207b2e99c61044e091007f45cceb7088 name: 'DB [{#DBNAME}]: Tuples deleted per second' type: DEPENDENT key: 'pgsql.dbstat.tup_deleted.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of rows deleted by queries in this database per second.' preprocessing: - type: JSONPATH parameters: - $.tup_deleted - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 7e6add2efe2f4cc79982351c448bd921 name: 'DB [{#DBNAME}]: Tuples fetched per second' type: DEPENDENT key: 'pgsql.dbstat.tup_fetched.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of rows fetched by queries in this database per second.' preprocessing: - type: JSONPATH parameters: - $.tup_fetched - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 43bb96408a9e4832b7e272770c989593 name: 'DB [{#DBNAME}]: Tuples inserted per second' type: DEPENDENT key: 'pgsql.dbstat.tup_inserted.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of rows inserted by queries in this database per second.' preprocessing: - type: JSONPATH parameters: - $.tup_inserted - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 638cde24706448d09fa06c9571657a9d name: 'DB [{#DBNAME}]: Tuples returned per second' type: DEPENDENT key: 'pgsql.dbstat.tup_returned.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Number of rows returned by queries in this database per second.' preprocessing: - type: JSONPATH parameters: - $.tup_returned - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 73f71c2f1b9043b48152e91a3e3c41a1 name: 'DB [{#DBNAME}]: Tuples updated per second' type: DEPENDENT key: 'pgsql.dbstat.tup_updated.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of rows updated by queries in this database per second.' preprocessing: - type: JSONPATH parameters: - $.tup_updated - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 7ff29324ad4c48b7b28faaf3e16efbd6 name: 'DB [{#DBNAME}]: Commits per second' type: DEPENDENT key: 'pgsql.dbstat.xact_commit.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Number of transactions in this database that have been committed per second.' preprocessing: - type: JSONPATH parameters: - $.xact_commit - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: transactions - tag: database value: '{#DBNAME}' - uuid: a840bb06684140c8b70406a7f8b14873 name: 'DB [{#DBNAME}]: Rollbacks per second' type: DEPENDENT key: 'pgsql.dbstat.xact_rollback.rate["{#DBNAME}"]' delay: '0' history: 7d value_type: FLOAT description: 'Total number of transactions in this database that have been rolled back.' preprocessing: - type: JSONPATH parameters: - $.xact_rollback - type: CHANGE_PER_SECOND parameters: - '' master_item: key: 'pgsql.dbstat.get_metrics["{#DBNAME}"]' tags: - tag: component value: transactions - tag: database value: '{#DBNAME}' - uuid: e9fa95b198b14da9b416bd1bc7c00911 name: 'DB [{#DBNAME}]: Num of accessexclusive locks' type: DEPENDENT key: 'pgsql.locks.accessexclusive["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of accessexclusive locks for this database.' preprocessing: - type: JSONPATH parameters: - $.accessexclusive master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: fbc1bb60b8214041b64095672995e8ec name: 'DB [{#DBNAME}]: Num of accessshare locks' type: DEPENDENT key: 'pgsql.locks.accessshare["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of accessshare locks for this database.' preprocessing: - type: JSONPATH parameters: - $.accessshare master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: a98106f8644b4f77b8e2cf1dc7ed9586 name: 'DB [{#DBNAME}]: Num of exclusive locks' type: DEPENDENT key: 'pgsql.locks.exclusive["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of exclusive locks for this database.' preprocessing: - type: JSONPATH parameters: - $.exclusive master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: 350ebc4e054c4290a92293ba625c40dd name: 'DB [{#DBNAME}]: Get locks' type: DEPENDENT key: 'pgsql.locks.get_metrics["{#DBNAME}"]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Get locks metrics for database "{#DBNAME}".' preprocessing: - type: JSONPATH parameters: - '$[''{#DBNAME}'']' error_handler: DISCARD_VALUE master_item: key: 'db.odbc.select[pgsql.locks,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: raw - tag: database value: '{#DBNAME}' - uuid: 0abfbce470824232a7516747f6f2714a name: 'DB [{#DBNAME}]: Num of rowexclusive locks' type: DEPENDENT key: 'pgsql.locks.rowexclusive["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of rowexclusive locks for this database.' preprocessing: - type: JSONPATH parameters: - $.rowexclusive master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: 24347f06596f4fc1af2753fbdd0b720c name: 'DB [{#DBNAME}]: Num of rowshare locks' type: DEPENDENT key: 'pgsql.locks.rowshare["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of rowshare locks for this database.' preprocessing: - type: JSONPATH parameters: - '$[''{#DBNAME}''].rowshare' error_handler: DISCARD_VALUE master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: dedcbbc9ee234e778b48947561077850 name: 'DB [{#DBNAME}]: Num of sharerowexclusive locks' type: DEPENDENT key: 'pgsql.locks.sharerowexclusive["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of total sharerowexclusive for this database.' preprocessing: - type: JSONPATH parameters: - $.sharerowexclusive master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: acaaf4e4ae97426589ea7fe351da0a48 name: 'DB [{#DBNAME}]: Num of shareupdateexclusive locks' type: DEPENDENT key: 'pgsql.locks.shareupdateexclusive["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of shareupdateexclusive locks for this database.' preprocessing: - type: JSONPATH parameters: - $.shareupdateexclusive master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: 03df53fbfc2f4ac2a5d0793e0ed14f4c name: 'DB [{#DBNAME}]: Num of share locks' type: DEPENDENT key: 'pgsql.locks.share["{#DBNAME}"]' delay: '0' history: 7d description: 'Number of share locks for this database.' preprocessing: - type: JSONPATH parameters: - $.share master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: 02f319126deb4de19d95443304d97c0d name: 'DB [{#DBNAME}]: Num of locks total' type: DEPENDENT key: 'pgsql.locks.total["{#DBNAME}"]' delay: '0' history: 7d description: 'Total number of locks in this database.' preprocessing: - type: JSONPATH parameters: - $.total master_item: key: 'pgsql.locks.get_metrics["{#DBNAME}"]' tags: - tag: component value: locks - tag: database value: '{#DBNAME}' - uuid: 16fd0bd835fd4db7b5ebb635780d9fe6 name: 'DB [{#DBNAME}]: Get queries' type: DEPENDENT key: 'pgsql.queries.get_metrics["{#DBNAME}"]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Get queries metrics for database "{#DBNAME}".' preprocessing: - type: JSONPATH parameters: - '$[''{#DBNAME}'']' error_handler: DISCARD_VALUE master_item: key: 'db.odbc.select[pgsql.queries,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: component value: raw - tag: database value: '{#DBNAME}' - uuid: 100a8f6b18644a308f8117913862dcf4 name: 'DB [{#DBNAME}]: Queries slow maintenance count' type: DEPENDENT key: 'pgsql.queries.mro.slow_count["{#DBNAME}"]' delay: '0' history: 7d description: 'Slow maintenance query count for this database.' preprocessing: - type: JSONPATH parameters: - $.mro_slow_count master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: f430eda6eae54a918a03b27f34709f54 name: 'DB [{#DBNAME}]: Queries max maintenance time' type: DEPENDENT key: 'pgsql.queries.mro.time_max["{#DBNAME}"]' delay: '0' history: 7d units: s description: 'Max maintenance query time for this database.' preprocessing: - type: JSONPATH parameters: - $.mro_time_max master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 856a7e26192848e1aadb5bdff25cb92a name: 'DB [{#DBNAME}]: Queries sum maintenance time' type: DEPENDENT key: 'pgsql.queries.mro.time_sum["{#DBNAME}"]' delay: '0' history: 7d units: s description: 'Sum maintenance query time for this database.' preprocessing: - type: JSONPATH parameters: - $.mro_time_sum master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: b324beea02f742c381d8241ba1e9382b name: 'DB [{#DBNAME}]: Queries slow query count' type: DEPENDENT key: 'pgsql.queries.query.slow_count["{#DBNAME}"]' delay: '0' history: 7d description: 'Slow query count for this database.' preprocessing: - type: JSONPATH parameters: - $.query_slow_count master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' trigger_prototypes: - uuid: bc790cd8e2c24638ad8a6552af1b9bbe expression: 'min(/PostgreSQL by ODBC/pgsql.queries.query.slow_count["{#DBNAME}"],5m)>{$PG.SLOW_QUERIES.MAX.WARN:"{#DBNAME}"}' name: 'DB [{#DBNAME}]: Too many slow queries' event_name: 'DB [{#DBNAME}]: Too many slow queries (over {$PG.SLOW_QUERIES.MAX.WARN:"{#DBNAME}"} in 5m)' priority: WARNING description: 'The number of detected slow queries exceeds the limit of {$PG.SLOW_QUERIES.MAX.WARN:"{#DBNAME}"}.' tags: - tag: scope value: performance - uuid: 0c0717a146344ec4a7abf4e6c35cb7ae name: 'DB [{#DBNAME}]: Queries max query time' type: DEPENDENT key: 'pgsql.queries.query.time_max["{#DBNAME}"]' delay: '0' history: 7d units: s description: 'Max query time for this database.' preprocessing: - type: JSONPATH parameters: - $.query_time_max master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: e2e686428e2b4f65b7dcbb9a6a3b0f93 name: 'DB [{#DBNAME}]: Queries sum query time' type: DEPENDENT key: 'pgsql.queries.query.time_sum["{#DBNAME}"]' delay: '0' history: 7d units: s description: 'Sum query time for this database.' preprocessing: - type: JSONPATH parameters: - $.query_time_sum master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 06fb68c43e0144e8aa85c0acceeafbfc name: 'DB [{#DBNAME}]: Queries slow transaction count' type: DEPENDENT key: 'pgsql.queries.tx.slow_count["{#DBNAME}"]' delay: '0' history: 7d description: 'Slow transaction query count for this database.' preprocessing: - type: JSONPATH parameters: - $.tx_slow_count master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: 0eced9bbc0d94332a1ec9fb45913b931 name: 'DB [{#DBNAME}]: Queries max transaction time' type: DEPENDENT key: 'pgsql.queries.tx.time_max["{#DBNAME}"]' delay: '0' history: 7d units: s description: 'Max transaction query time for this database.' preprocessing: - type: JSONPATH parameters: - $.tx_time_max master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' - uuid: a51a95891cd849de9eeaa6c4dbcbefbe name: 'DB [{#DBNAME}]: Queries sum transaction time' type: DEPENDENT key: 'pgsql.queries.tx.time_sum["{#DBNAME}"]' delay: '0' history: 7d units: s description: 'Sum transaction query time for this database.' preprocessing: - type: JSONPATH parameters: - $.tx_time_sum master_item: key: 'pgsql.queries.get_metrics["{#DBNAME}"]' tags: - tag: component value: queries - tag: database value: '{#DBNAME}' graph_prototypes: - uuid: 7b2e7e0542174a7a996bac8014f9a664 name: 'DB [{#DBNAME}]: Locks' graph_items: - drawtype: GRADIENT_LINE color: 199C0D item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.total["{#DBNAME}"]' - sortorder: '1' color: F63100 item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.accessexclusive["{#DBNAME}"]' - sortorder: '2' color: 00611C item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.accessshare["{#DBNAME}"]' - sortorder: '3' color: F7941D item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.exclusive["{#DBNAME}"]' - sortorder: '4' color: FC6EA3 item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.rowexclusive["{#DBNAME}"]' - sortorder: '5' color: 6C59DC item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.rowshare["{#DBNAME}"]' - sortorder: '6' color: C7A72D item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.sharerowexclusive["{#DBNAME}"]' - sortorder: '7' color: BA2A5D item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.shareupdateexclusive["{#DBNAME}"]' - sortorder: '8' color: F230E0 item: host: 'PostgreSQL by ODBC' key: 'pgsql.locks.share["{#DBNAME}"]' - uuid: 70065416f33d4a3a9046576a344e965a name: 'DB [{#DBNAME}]: Number of bloating tables' graph_items: - drawtype: GRADIENT_LINE color: 199C0D item: host: 'PostgreSQL by ODBC' key: 'db.odbc.select[pgsql.db.bloating_tables,,"Database={#DBNAME};{$PG.CONNSTRING}"]' - uuid: f9162816d4f740dd8e4863c726b64105 name: 'DB [{#DBNAME}]: pg_stat_database metrics' graph_items: - color: 199C0D item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.blks_hit.rate["{#DBNAME}"]' - sortorder: '1' color: F63100 item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.blks_read.rate["{#DBNAME}"]' - sortorder: '2' color: 00611C item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.conflicts.rate["{#DBNAME}"]' - sortorder: '3' color: F7941D item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.deadlocks.rate["{#DBNAME}"]' - sortorder: '4' color: FC6EA3 item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.temp_bytes.rate["{#DBNAME}"]' - sortorder: '5' color: 6C59DC item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.temp_files.rate["{#DBNAME}"]' - sortorder: '6' color: C7A72D item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.tup_deleted.rate["{#DBNAME}"]' - sortorder: '7' color: BA2A5D item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.tup_fetched.rate["{#DBNAME}"]' - sortorder: '8' color: F230E0 item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.tup_inserted.rate["{#DBNAME}"]' - sortorder: '9' color: 5CCD18 item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.tup_returned.rate["{#DBNAME}"]' - sortorder: '10' color: BB2A02 item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.tup_updated.rate["{#DBNAME}"]' - sortorder: '11' color: AC41A5 item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.xact_commit.rate["{#DBNAME}"]' - sortorder: '12' color: 89ABF8 item: host: 'PostgreSQL by ODBC' key: 'pgsql.dbstat.xact_rollback.rate["{#DBNAME}"]' - uuid: 79b2ba5736054e8a93e70d7af063a0b9 name: 'DB [{#DBNAME}]: Queries' ymin_type_1: FIXED graph_items: - color: 199C0D yaxisside: RIGHT item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.mro.time_max["{#DBNAME}"]' - sortorder: '1' color: F63100 yaxisside: RIGHT item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.query.time_max["{#DBNAME}"]' - sortorder: '2' color: 00611C yaxisside: RIGHT item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.tx.time_max["{#DBNAME}"]' - sortorder: '3' drawtype: GRADIENT_LINE color: F7941D item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.mro.time_sum["{#DBNAME}"]' - sortorder: '4' drawtype: GRADIENT_LINE color: FC6EA3 item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.query.time_sum["{#DBNAME}"]' - sortorder: '5' drawtype: GRADIENT_LINE color: 6C59DC item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.tx.time_sum["{#DBNAME}"]' - uuid: 7ee8911784824e8380dd07235779a5ea name: 'DB [{#DBNAME}]: Size' graph_items: - drawtype: GRADIENT_LINE color: 199C0D item: host: 'PostgreSQL by ODBC' key: 'db.odbc.select[pgsql.db.size,,"Database={#DBNAME};{$PG.CONNSTRING}"]' - uuid: 88a09d63e9214cf1bf8ee82ae485f442 name: 'DB [{#DBNAME}]: Slow queries' ymin_type_1: FIXED graph_items: - color: 199C0D item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.mro.slow_count["{#DBNAME}"]' - sortorder: '1' color: F63100 item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.query.slow_count["{#DBNAME}"]' - sortorder: '2' color: 00611C item: host: 'PostgreSQL by ODBC' key: 'pgsql.queries.tx.slow_count["{#DBNAME}"]' - uuid: 46a6f3cdfff244a28cb712c4186afc7f name: 'Replication discovery' type: ODBC key: 'db.odbc.select[pgsql.replication.process.discovery,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' delay: 15m params: | SELECT json_build_object('data',COALESCE(json_agg(json_build_object('{#APPLICATION_NAME}',application_name)), '[]')) FROM pg_stat_replication username: '{$PG.USER}' password: '{$PG.PASSWORD}' filter: evaltype: AND conditions: - macro: '{#APPLICATION_NAME}' value: '{$PG.LLD.FILTER.APPLICATION}' formulaid: A description: 'Discovers replication lag metrics.' item_prototypes: - uuid: 9e7797789d2c47efb9af2c86f8c6a93e name: 'Application [{#APPLICATION_NAME}]: Get replication' type: DEPENDENT key: 'pgsql.replication.get_metrics["{#APPLICATION_NAME}"]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Collect metrics from the "pg_stat_replication" about the application "{#APPLICATION_NAME}" that is connected to this WAL sender, which contains information about the WAL sender process, showing statistics about replication to that sender''s connected standby server.' preprocessing: - type: JSONPATH parameters: - '$[''{#APPLICATION_NAME}'']' error_handler: DISCARD_VALUE master_item: key: 'db.odbc.select[pgsql.replication.process,,"Database={$PG.DATABASE};{$PG.CONNSTRING}"]' tags: - tag: application value: '{#APPLICATION_NAME}' - tag: component value: raw - uuid: 86109b6d1b084de186dcda5d455da992 name: 'Application [{#APPLICATION_NAME}]: Replication flush lag' type: DEPENDENT key: 'pgsql.replication.process.flush_lag["{#APPLICATION_NAME}"]' delay: '0' history: 7d value_type: FLOAT units: s description: 'Time elapsed between flushing recent WAL locally and receiving notification that this standby server has written and flushed it (but not yet applied it). This can be used to gauge the delay that synchronous_commit level on incurred while committing if this server was configured as a synchronous standby.' preprocessing: - type: JSONPATH parameters: - $.flush_lag master_item: key: 'pgsql.replication.get_metrics["{#APPLICATION_NAME}"]' tags: - tag: application value: '{#APPLICATION_NAME}' - tag: component value: replication - uuid: 2cad17fa29c24f0da0fffe962c337f13 name: 'Application [{#APPLICATION_NAME}]: Replication replay lag' type: DEPENDENT key: 'pgsql.replication.process.replay_lag["{#APPLICATION_NAME}"]' delay: '0' history: 7d value_type: FLOAT units: s description: 'Time elapsed between flushing recent WAL locally and receiving notification that this standby server has written, flushed and applied it. This can be used to gauge the delay that synchronous_commit level remote_apply incurred while committing if this server was configured as a synchronous standby.' preprocessing: - type: JSONPATH parameters: - $.replay_lag master_item: key: 'pgsql.replication.get_metrics["{#APPLICATION_NAME}"]' tags: - tag: application value: '{#APPLICATION_NAME}' - tag: component value: replication - uuid: f5f62a5cac254d5eb891beadd6ca950d name: 'Application [{#APPLICATION_NAME}]: Replication write lag' type: DEPENDENT key: 'pgsql.replication.process.write_lag["{#APPLICATION_NAME}"]' delay: '0' history: 7d value_type: FLOAT units: s description: 'Time elapsed between flushing recent WAL locally and receiving notification that this standby server has written it (but not yet flushed it or applied it). This can be used to gauge the delay that synchronous_commit level remote_write incurred while committing if this server was configured as a synchronous standby.' preprocessing: - type: JSONPATH parameters: - $.write_lag master_item: key: 'pgsql.replication.get_metrics["{#APPLICATION_NAME}"]' tags: - tag: application value: '{#APPLICATION_NAME}' - tag: component value: replication graph_prototypes: - uuid: 52b70e3a3691467d8ca7a420d2f7f3c5 name: 'Application [{#APPLICATION_NAME}]: Replication lag' graph_items: - color: 199C0D item: host: 'PostgreSQL by ODBC' key: 'pgsql.replication.process.flush_lag["{#APPLICATION_NAME}"]' - sortorder: '1' color: F63100 item: host: 'PostgreSQL by ODBC' key: 'pgsql.replication.process.replay_lag["{#APPLICATION_NAME}"]' - sortorder: '2' color: 00611C item: host: 'PostgreSQL by ODBC' key: 'pgsql.replication.process.write_lag["{#APPLICATION_NAME}"]' preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h tags: - tag: class value: database - tag: target value: postgresql macros: - macro: '{$PG.CONFLICTS.MAX.WARN}' value: '0' description: 'Maximum number of recovery conflicts for trigger expression.' - macro: '{$PG.CONNSTRING}' value: Servername=localhost;Port=5432;Driver=/usr/lib64/psqlodbcw.so description: 'Connection string for the PostgreSQL instance.' - macro: '{$PG.CONN_TOTAL_PCT.MAX.WARN}' value: '90' description: 'Maximum percentage of current connections for trigger expression.' - macro: '{$PG.DATABASE}' value: postgres description: 'Default PostgreSQL database for the connection.' - macro: '{$PG.DEADLOCKS.MAX.WARN}' value: '0' description: 'Maximum number of detected deadlocks for trigger expression.' - macro: '{$PG.LLD.FILTER.APPLICATION}' value: .+ description: 'Filter of discoverable applications.' - macro: '{$PG.LLD.FILTER.DBNAME}' value: .+ description: 'Filter of discoverable databases.' - macro: '{$PG.PASSWORD}' value: '' description: 'PostgreSQL user password.' - macro: '{$PG.QUERY_ETIME.MAX.WARN}' value: '30' description: 'Execution time limit for count of slow queries.' - macro: '{$PG.SLOW_QUERIES.MAX.WARN}' value: '5' description: 'Slow queries count threshold for a trigger.' - macro: '{$PG.USER}' value: zbx_monitor description: 'PostgreSQL username.' dashboards: - uuid: 6f15f8b6e90b4d09b9e1d4fb323ac438 name: 'PostgreSQL databases' pages: - widgets: - type: graphprototype width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'PostgreSQL by ODBC' name: 'DB [{#DBNAME}]: pg_stat_database metrics' - type: graphprototype x: '12' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'PostgreSQL by ODBC' name: 'DB [{#DBNAME}]: Locks' - type: graphprototype 'y': '5' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'PostgreSQL by ODBC' name: 'DB [{#DBNAME}]: Size' - type: graphprototype x: '12' 'y': '5' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'PostgreSQL by ODBC' name: 'DB [{#DBNAME}]: Number of bloating tables' - type: graphprototype 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'PostgreSQL by ODBC' name: 'DB [{#DBNAME}]: Queries' - type: graphprototype x: '12' 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'PostgreSQL by ODBC' name: 'DB [{#DBNAME}]: Slow queries' valuemaps: - uuid: 6e5062ae5345454f95cb8608b35eddf4 name: 'PostgreSQL recovery role' mappings: - value: '0' newvalue: Master - value: '1' newvalue: Standby - uuid: 75393338fb514612a5f0ba57cec318b3 name: 'PostgreSQL replication status' mappings: - value: '0' newvalue: Down - value: '1' newvalue: Up - value: '2' newvalue: Master - uuid: f2af00a32d1e471a98b9e4e6148f68f3 name: 'Service state' mappings: - value: '0' newvalue: Down - value: '1' newvalue: Up