From 174cac4ca65aa6b057ed43c1f55fa0c98ca04a3e Mon Sep 17 00:00:00 2001 From: James Campbell Date: Sat, 29 Nov 2025 02:42:04 -0500 Subject: [PATCH 1/3] Add queries for tmp and ready files --- sample-config/pgmon-metrics.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/sample-config/pgmon-metrics.yml b/sample-config/pgmon-metrics.yml index 8c1045d..14030f7 100644 --- a/sample-config/pgmon-metrics.yml +++ b/sample-config/pgmon-metrics.yml @@ -116,6 +116,34 @@ metrics: FROM pg_stat_io GROUP BY backend_type + temp_files: + type: row + query: + 120000: > + SELECT count(*) AS count, sum(size) AS size + FROM pg_ls_tmpdir() + WHERE name LIKE 'pgsql_tmp%' + *: > + SELECT count(*) AS count, sum(size) AS size + FROM pg_ls_dir('base/pgsql_tmp/') + WHERE name LIKE 'pgsql_tmp%' + + ready_archive_files: + type: value + query: + 120000: > + SELECT count(*) AS count + FROM pg_ls_archive_statusdir() + WHERE name LIKE '%.ready' + 100000: > + SELECT count(*) AS count + FROM pg_ls_dir('pg_wal/pgsql_tmp/') + WHERE name LIKE '%.ready' + *: > + SELECT count(*) AS count + FROM pg_ls_dir('pg_xlog/pgsql_tmp/') + WHERE name LIKE '%.ready' + ## # Per-database metrics From 590425fae71bf398b3b5a848e253cf69ff19a52d Mon Sep 17 00:00:00 2001 From: James Campbell Date: Tue, 2 Dec 2025 01:05:16 -0500 Subject: [PATCH 2/3] Handle situations where directories don't exist - The pgsql_tmp and archive_ready directories don't always exist. Since PG <=9.4 doesn't have the "missing_ok" parameter, we have to work around the missing directories explicitly. --- sample-config/pgmon-metrics.yml | 49 +++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/sample-config/pgmon-metrics.yml b/sample-config/pgmon-metrics.yml index 14030f7..fbb78c1 100644 --- a/sample-config/pgmon-metrics.yml +++ b/sample-config/pgmon-metrics.yml @@ -120,13 +120,26 @@ metrics: type: row query: 120000: > - SELECT count(*) AS count, sum(size) AS size + SELECT count(*) AS count, coalesce(sum(size), 0) AS size FROM pg_ls_tmpdir() - WHERE name LIKE 'pgsql_tmp%' - *: > - SELECT count(*) AS count, sum(size) AS size - FROM pg_ls_dir('base/pgsql_tmp/') - WHERE name LIKE 'pgsql_tmp%' + WHERE name LIKE 'pgsql_tmp%%' + 90500: > + SELECT count(*) AS count, coalesce(sum((pg_stat_file(name)).size), 0) AS size + FROM pg_ls_dir('base/pgsql_tmp/', true, false) AS name + WHERE name LIKE 'pgsql_tmp%%' + 0: > + SELECT + CASE WHEN ( + SELECT count(*) + FROM pg_ls_dir('base') AS + base WHERE base = 'pgsql_tmp') = 0 + THEN 0 + ELSE ( + SELECT count(*) + FROM pg_ls_dir('base/pgsql_tmp/') AS name + WHERE name LIKE 'pgsql_tmp%%') + END + ready_archive_files: type: value @@ -134,15 +147,27 @@ metrics: 120000: > SELECT count(*) AS count FROM pg_ls_archive_statusdir() - WHERE name LIKE '%.ready' + WHERE name LIKE '%%.ready' 100000: > SELECT count(*) AS count - FROM pg_ls_dir('pg_wal/pgsql_tmp/') - WHERE name LIKE '%.ready' - *: > + FROM pg_ls_dir('pg_wal/archive_status/', true, false) AS name + WHERE name LIKE '%%.ready' + 90500: > SELECT count(*) AS count - FROM pg_ls_dir('pg_xlog/pgsql_tmp/') - WHERE name LIKE '%.ready' + FROM pg_ls_dir('pg_xlog/archive_status/', true, false) AS name + WHERE name LIKE '%%.ready' + 0: > + SELECT + CASE WHEN ( + SELECT count(*) + FROM pg_ls_dir('pg_xlog/') AS f + WHERE f = 'archive_status') = 0 + THEN 0 + ELSE ( + SELECT count(*) AS count + FROM pg_ls_dir('pg_xlog/archive_status/') AS name + WHERE name LIKE '%%.ready') + END ## From 9b48535a0945ab2e9697a4c97eb0665985439a08 Mon Sep 17 00:00:00 2001 From: James Campbell Date: Tue, 2 Dec 2025 01:43:24 -0500 Subject: [PATCH 3/3] Add archive ready and temp file items to template - Add the initital item definitions to the template for archive ready files and temp files. - Fix the temp file query to be able to return both columns in all cases. --- sample-config/pgmon-metrics.yml | 30 ++++++++------ zabbix_templates/pgmon_templates.yaml | 58 +++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 13 deletions(-) diff --git a/sample-config/pgmon-metrics.yml b/sample-config/pgmon-metrics.yml index fbb78c1..4509863 100644 --- a/sample-config/pgmon-metrics.yml +++ b/sample-config/pgmon-metrics.yml @@ -120,25 +120,27 @@ metrics: type: row query: 120000: > - SELECT count(*) AS count, coalesce(sum(size), 0) AS size + SELECT count(*) AS count, + coalesce(sum(size), 0) AS size FROM pg_ls_tmpdir() WHERE name LIKE 'pgsql_tmp%%' 90500: > - SELECT count(*) AS count, coalesce(sum((pg_stat_file(name)).size), 0) AS size + SELECT count(*) AS count, + coalesce(sum((pg_stat_file(name)).size), 0) AS size FROM pg_ls_dir('base/pgsql_tmp/', true, false) AS name WHERE name LIKE 'pgsql_tmp%%' 0: > - SELECT - CASE WHEN ( - SELECT count(*) - FROM pg_ls_dir('base') AS - base WHERE base = 'pgsql_tmp') = 0 - THEN 0 - ELSE ( - SELECT count(*) + SELECT count(*) AS count, + coalesce(sum((pg_stat_file(files.name)).size), 0) AS size + FROM ( + SELECT name + FROM pg_ls_dir('base') AS name + WHERE name = 'pgsql_tmp') AS dir + LEFT JOIN ( + SELECT name FROM pg_ls_dir('base/pgsql_tmp/') AS name - WHERE name LIKE 'pgsql_tmp%%') - END + WHERE name LIKE 'pgsql_tmp%%') AS files + ON dir.name IS NOT NULL ready_archive_files: @@ -162,7 +164,9 @@ metrics: SELECT count(*) FROM pg_ls_dir('pg_xlog/') AS f WHERE f = 'archive_status') = 0 - THEN 0 + THEN ( + SELECT 0 AS count + ) ELSE ( SELECT count(*) AS count FROM pg_ls_dir('pg_xlog/archive_status/') AS name diff --git a/zabbix_templates/pgmon_templates.yaml b/zabbix_templates/pgmon_templates.yaml index 17dd276..1feacef 100644 --- a/zabbix_templates/pgmon_templates.yaml +++ b/zabbix_templates/pgmon_templates.yaml @@ -282,6 +282,39 @@ zabbix_export: expression: 'last(/PostgreSQL by pgmon/pgmon.release.supported)<>1' name: 'PostgreSQL major release is lo longer supported' priority: INFO + - uuid: d0651ffc203949e3a24b1e1a2beb3dd7 + name: 'Temp file size' + type: DEPENDENT + key: 'pgmon.temp_files[bytes]' + delay: '0' + history: 90d + units: b + description: 'Total size of all temp files' + preprocessing: + - type: JSONPATH + parameters: + - $.size + master_item: + key: 'pgmon[temp_files]' + tags: + - tag: Application + value: PostgreSQL + - uuid: deb355b26c37441189c85ac82465f21e + name: 'Temp file count' + type: DEPENDENT + key: 'pgmon.temp_files[count]' + delay: '0' + history: 90d + description: 'Total number of temp flies' + preprocessing: + - type: JSONPATH + parameters: + - $.count + master_item: + key: 'pgmon[temp_files]' + tags: + - tag: Application + value: PostgreSQL - uuid: 763920af8da84db8a9a2667d9653cb21 name: 'PostgreSQL Agent Version' type: HTTP_AGENT @@ -295,6 +328,17 @@ zabbix_export: tags: - tag: Application value: PostgreSQL + - uuid: a0bd4a987b7643c5a86e160dd9f9afcb + name: 'PostgreSQL Archive ready count' + type: HTTP_AGENT + key: 'pgmon[archive_ready]' + history: 90d + trends: '0' + description: 'Number of WAL files ready and waiting to be archived' + url: 'http://localhost:{$AGENT_PORT}/ready_archive_files' + tags: + - tag: Application + value: PostgreSQL - uuid: 91baea76ebb240b19c5a5d3913d0b989 name: 'PostgreSQL BGWriter Info' type: HTTP_AGENT @@ -369,6 +413,20 @@ zabbix_export: value: PostgreSQL - tag: Type value: Raw + - uuid: bd3026ef3b82419d8a004e2d4684554a + name: 'PostgreSQL Temp Ffle info' + type: HTTP_AGENT + key: 'pgmon[temp_files]' + history: '0' + value_type: TEXT + trends: '0' + description: 'PostgreSQL temp file stats' + url: 'http://localhost:{$AGENT_PORT}/temp_files' + tags: + - tag: Application + value: PostgreSQL + - tag: Type + value: Raw - uuid: ee88f5f4d2384f97946d049af5af4502 name: 'PostgreSQL version' type: HTTP_AGENT