Skip to content

Commit f3a7926

Browse files
gbartolinileonardocemnenciaNiccoloFei
committed
fix: schema-qualify catalog references in monitoring queries (cloudnative-pg#10576)
Unqualified references to `pg_catalog` functions and views are resolved via `search_path`, which can be manipulated by a database user to shadow built-in objects. Use explicit `pg_catalog`. qualification throughout the shipped default-monitoring config and documentation samples. Closes cloudnative-pg#10575 Assisted-by: Claude Signed-off-by: Gabriele Bartolini <gabriele.bartolini@enterprisedb.com> Signed-off-by: Leonardo Cecchi <leonardo.cecchi@enterprisedb.com> Signed-off-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com> Signed-off-by: Niccolò Fei <niccolo.fei@enterprisedb.com> Co-authored-by: Leonardo Cecchi <leonardo.cecchi@enterprisedb.com> Co-authored-by: Marco Nenciarini <marco.nenciarini@enterprisedb.com> Co-authored-by: Niccolò Fei <niccolo.fei@enterprisedb.com> (cherry picked from commit 6a3a85b)
1 parent 81dc0d2 commit f3a7926

5 files changed

Lines changed: 40 additions & 40 deletions

File tree

config/manager/default-monitoring.yaml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ data:
2727
, state
2828
, usename
2929
, COALESCE(application_name, '') AS application_name
30-
, COUNT(*)
31-
, COALESCE(EXTRACT (EPOCH FROM (max(now() - xact_start))), 0) AS max_tx_secs
30+
, pg_catalog.count(*)
31+
, COALESCE(EXTRACT (EPOCH FROM (pg_catalog.max(pg_catalog.now() OPERATOR(pg_catalog.-) xact_start))), 0) AS max_tx_secs
3232
FROM pg_catalog.pg_stat_activity
3333
GROUP BY datname, state, usename, application_name
34-
) sa ON states.state = sa.state
34+
) sa ON states.state OPERATOR(pg_catalog.=) sa.state
3535
WHERE sa.usename IS NOT NULL
3636
metrics:
3737
- datname:
@@ -55,10 +55,10 @@ data:
5555
5656
backends_waiting:
5757
query: |
58-
SELECT count(*) AS total
58+
SELECT pg_catalog.count(*) AS total
5959
FROM pg_catalog.pg_locks blocked_locks
6060
JOIN pg_catalog.pg_locks blocking_locks
61-
ON blocking_locks.locktype = blocked_locks.locktype
61+
ON blocking_locks.locktype OPERATOR(pg_catalog.=) blocked_locks.locktype
6262
AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
6363
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
6464
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
@@ -68,8 +68,8 @@ data:
6868
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
6969
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
7070
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
71-
AND blocking_locks.pid != blocked_locks.pid
72-
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
71+
AND blocking_locks.pid OPERATOR(pg_catalog.<>) blocked_locks.pid
72+
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid OPERATOR(pg_catalog.=) blocking_locks.pid
7373
WHERE NOT blocked_locks.granted
7474
metrics:
7575
- total:
@@ -110,14 +110,14 @@ data:
110110
pg_replication:
111111
query: "SELECT CASE WHEN (
112112
NOT pg_catalog.pg_is_in_recovery()
113-
OR pg_catalog.pg_last_wal_receive_lsn() = pg_catalog.pg_last_wal_replay_lsn())
113+
OR pg_catalog.pg_last_wal_receive_lsn() OPERATOR(pg_catalog.=) pg_catalog.pg_last_wal_replay_lsn())
114114
THEN 0
115115
ELSE GREATEST (0,
116-
EXTRACT(EPOCH FROM (now() - pg_catalog.pg_last_xact_replay_timestamp())))
116+
EXTRACT(EPOCH FROM (pg_catalog.now() OPERATOR(pg_catalog.-) pg_catalog.pg_last_xact_replay_timestamp())))
117117
END AS lag,
118118
pg_catalog.pg_is_in_recovery() AS in_recovery,
119-
EXISTS (TABLE pg_stat_wal_receiver) AS is_wal_receiver_up,
120-
(SELECT count(*) FROM pg_catalog.pg_stat_replication) AS streaming_replicas"
119+
EXISTS (TABLE pg_catalog.pg_stat_wal_receiver) AS is_wal_receiver_up,
120+
(SELECT pg_catalog.count(*) FROM pg_catalog.pg_stat_replication) AS streaming_replicas"
121121
metrics:
122122
- lag:
123123
usage: "GAUGE"
@@ -165,17 +165,17 @@ data:
165165
query: |
166166
SELECT archived_count
167167
, failed_count
168-
, COALESCE(EXTRACT(EPOCH FROM (now() - last_archived_time)), -1) AS seconds_since_last_archival
169-
, COALESCE(EXTRACT(EPOCH FROM (now() - last_failed_time)), -1) AS seconds_since_last_failure
168+
, COALESCE(EXTRACT(EPOCH FROM (pg_catalog.now() OPERATOR(pg_catalog.-) last_archived_time)), -1) AS seconds_since_last_archival
169+
, COALESCE(EXTRACT(EPOCH FROM (pg_catalog.now() OPERATOR(pg_catalog.-) last_failed_time)), -1) AS seconds_since_last_failure
170170
, COALESCE(EXTRACT(EPOCH FROM last_archived_time), -1) AS last_archived_time
171171
, COALESCE(EXTRACT(EPOCH FROM last_failed_time), -1) AS last_failed_time
172-
, COALESCE(CAST(CAST('x'||pg_catalog.right(pg_catalog.split_part(last_archived_wal, '.', 1), 16) AS pg_catalog.bit(64)) AS pg_catalog.int8), -1) AS last_archived_wal_start_lsn
173-
, COALESCE(CAST(CAST('x'||pg_catalog.right(pg_catalog.split_part(last_failed_wal, '.', 1), 16) AS pg_catalog.bit(64)) AS pg_catalog.int8), -1) AS last_failed_wal_start_lsn
172+
, COALESCE(CAST(CAST('x' OPERATOR(pg_catalog.||) pg_catalog.right(pg_catalog.split_part(last_archived_wal, '.', 1), 16) AS pg_catalog.bit(64)) AS pg_catalog.int8), -1) AS last_archived_wal_start_lsn
173+
, COALESCE(CAST(CAST('x' OPERATOR(pg_catalog.||) pg_catalog.right(pg_catalog.split_part(last_failed_wal, '.', 1), 16) AS pg_catalog.bit(64)) AS pg_catalog.int8), -1) AS last_failed_wal_start_lsn
174174
, EXTRACT(EPOCH FROM stats_reset) AS stats_reset_time
175175
FROM pg_catalog.pg_stat_archiver
176176
predicate_query: |
177177
SELECT NOT pg_catalog.pg_is_in_recovery()
178-
OR pg_catalog.current_setting('archive_mode') = 'always'
178+
OR pg_catalog.current_setting('archive_mode') OPERATOR(pg_catalog.=) 'always'
179179
metrics:
180180
- archived_count:
181181
usage: "COUNTER"

docs/src/monitoring.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -489,14 +489,14 @@ metadata:
489489
data:
490490
custom-queries: |
491491
pg_replication:
492-
query: "SELECT CASE WHEN NOT pg_is_in_recovery()
492+
query: "SELECT CASE WHEN NOT pg_catalog.pg_is_in_recovery()
493493
THEN 0
494494
ELSE GREATEST (0,
495-
EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp())))
495+
EXTRACT(EPOCH FROM (pg_catalog.now() OPERATOR(pg_catalog.-) pg_catalog.pg_last_xact_replay_timestamp())))
496496
END AS lag,
497-
pg_is_in_recovery() AS in_recovery,
498-
EXISTS (TABLE pg_stat_wal_receiver) AS is_wal_receiver_up,
499-
(SELECT count(*) FROM pg_stat_replication) AS streaming_replicas"
497+
pg_catalog.pg_is_in_recovery() AS in_recovery,
498+
EXISTS (TABLE pg_catalog.pg_stat_wal_receiver) AS is_wal_receiver_up,
499+
(SELECT pg_catalog.count(*) FROM pg_catalog.pg_stat_replication) AS streaming_replicas"
500500
501501
metrics:
502502
- lag:
@@ -532,7 +532,7 @@ some_query: |
532532
FROM some_table
533533
query: |
534534
SELECT
535-
count(*) as rows
535+
pg_catalog.count(*) as rows
536536
FROM some_table
537537
metrics:
538538
- rows:
@@ -565,8 +565,8 @@ as in the following example:
565565
some_query: |
566566
query: |
567567
SELECT
568-
current_database() as datname,
569-
count(*) as rows
568+
pg_catalog.current_database() as datname,
569+
pg_catalog.count(*) as rows
570570
FROM some_table
571571
metrics:
572572
- datname:
@@ -597,8 +597,8 @@ aforementioned query):
597597
some_query: |
598598
query: |
599599
SELECT
600-
current_database() as datname,
601-
count(*) as rows
600+
pg_catalog.current_database() as datname,
601+
pg_catalog.count(*) as rows
602602
FROM some_table
603603
metrics:
604604
- datname:

docs/src/samples/cluster-example-monitoring.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ data:
4040
- "*"
4141
query: |
4242
SELECT
43-
current_database() datname,
43+
pg_catalog.current_database() datname,
4444
schemaname,
4545
relname,
4646
seq_scan,
@@ -63,7 +63,7 @@ data:
6363
analyze_count,
6464
autoanalyze_count
6565
FROM
66-
pg_stat_user_tables
66+
pg_catalog.pg_stat_user_tables
6767
metrics:
6868
- datname:
6969
usage: "LABEL"
@@ -133,7 +133,7 @@ data:
133133
description: "Number of times this table has been analyzed by the autovacuum daemon"
134134
135135
pg_statio_user_tables:
136-
query: "SELECT current_database() datname, schemaname, relname, heap_blks_read, heap_blks_hit, idx_blks_read, idx_blks_hit, toast_blks_read, toast_blks_hit, tidx_blks_read, tidx_blks_hit FROM pg_statio_user_tables"
136+
query: "SELECT pg_catalog.current_database() datname, schemaname, relname, heap_blks_read, heap_blks_hit, idx_blks_read, idx_blks_hit, toast_blks_read, toast_blks_hit, tidx_blks_read, tidx_blks_hit FROM pg_catalog.pg_statio_user_tables"
137137
metrics:
138138
- datname:
139139
usage: "LABEL"
@@ -177,7 +177,7 @@ data:
177177
application_name,
178178
SUM(EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - state_change))::bigint)::float AS process_idle_seconds_sum,
179179
COUNT(*) AS process_idle_seconds_count
180-
FROM pg_stat_activity
180+
FROM pg_catalog.pg_stat_activity
181181
WHERE state = 'idle'
182182
GROUP BY application_name
183183
),
@@ -192,7 +192,7 @@ data:
192192
END
193193
)::bigint AS bucket
194194
FROM
195-
pg_stat_activity,
195+
pg_catalog.pg_stat_activity,
196196
UNNEST(ARRAY[1, 2, 5, 15, 30, 60, 90, 120, 300]) AS le
197197
GROUP BY application_name, le
198198
ORDER BY application_name, le
@@ -222,7 +222,7 @@ metadata:
222222
stringData:
223223
pg-database: |
224224
pg_database:
225-
query: "SELECT pg_database.datname, pg_database_size(pg_database.datname) as size_bytes FROM pg_database"
225+
query: "SELECT pg_database.datname, pg_catalog.pg_database_size(pg_database.datname) as size_bytes FROM pg_catalog.pg_database"
226226
primary: true
227227
cache_seconds: 30
228228
metrics:

tests/e2e/fixtures/metrics/custom-queries-with-target-databases.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ data:
99
some_query:
1010
query: |
1111
SELECT
12-
current_database() as datname,
12+
pg_catalog.current_database() as datname,
1313
count(*) as rows
1414
FROM test_table
1515
metrics:
@@ -35,7 +35,7 @@ stringData:
3535
some_query_test:
3636
query: |
3737
SELECT
38-
current_database() as datname,
38+
pg_catalog.current_database() as datname,
3939
count(*) as rows
4040
metrics:
4141
- datname:

tests/e2e/fixtures/metrics/custom-queries.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ metadata:
77
data:
88
queries.yaml: |
99
pg_postmaster: # wokeignore:rule=master
10-
query: "SELECT EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time())) AS start_time_seconds" # wokeignore:rule=master
10+
query: "SELECT EXTRACT(EPOCH FROM (pg_catalog.now() - pg_catalog.pg_postmaster_start_time())) AS start_time_seconds" # wokeignore:rule=master
1111
primary: false
1212
metrics:
1313
- start_time_seconds:
1414
usage: "COUNTER"
1515
description: "Seconds since the postgres server start"
1616
additional-queries: |
1717
pg_wal_files:
18-
query: "SELECT COALESCE(sum(1), 0) AS total FROM pg_ls_waldir() AS d (file) WHERE file ~ '^[0-9A-F]{8}[0-9A-F]{8}[0-9A-F]{8}$'"
18+
query: "SELECT COALESCE(pg_catalog.sum(1), 0) AS total FROM pg_catalog.pg_ls_waldir() AS d (file) WHERE file ~ '^[0-9A-F]{8}[0-9A-F]{8}[0-9A-F]{8}$'"
1919
primary: false
2020
metrics:
2121
- total:
@@ -47,7 +47,7 @@ metadata:
4747
data:
4848
queries.yaml: |
4949
pg_database:
50-
query: "SELECT pg_database.datname, pg_database_size(pg_database.datname) as size_bytes FROM pg_database"
50+
query: "SELECT pg_database.datname, pg_catalog.pg_database_size(pg_database.datname) as size_bytes FROM pg_catalog.pg_database"
5151
primary: false
5252
metrics:
5353
- datname:
@@ -59,7 +59,7 @@ data:
5959
6060
additional-queries: |
6161
e2e_tests_replication_slots_status:
62-
query: "SELECT count(*) AS inactive FROM pg_replication_slots WHERE NOT active"
62+
query: "SELECT pg_catalog.count(*) AS inactive FROM pg_catalog.pg_replication_slots WHERE NOT active"
6363
primary: false
6464
metrics:
6565
- inactive:
@@ -75,7 +75,7 @@ metadata:
7575
stringData:
7676
queries.yaml: |
7777
pg_stat_archiver:
78-
query: "SELECT archived_count, failed_count FROM pg_stat_archiver"
78+
query: "SELECT archived_count, failed_count FROM pg_catalog.pg_stat_archiver"
7979
primary: false
8080
metrics:
8181
- archived_count:
@@ -88,7 +88,7 @@ stringData:
8888
additional-queries: |
8989
pg_locks:
9090
query: |
91-
SELECT count(*) as blocked_queries
91+
SELECT pg_catalog.count(*) as blocked_queries
9292
FROM pg_catalog.pg_locks blocked_locks
9393
JOIN pg_catalog.pg_locks blocking_locks
9494
ON blocking_locks.locktype = blocked_locks.locktype

0 commit comments

Comments
 (0)