Skip to content

Commit 5f0e6fd

Browse files
committed
PMM-14368 Fix some collectors for old PG versions
1 parent e59a236 commit 5f0e6fd

File tree

6 files changed

+139
-38
lines changed

6 files changed

+139
-38
lines changed

collector/pg_stat_bgwriter.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -216,23 +216,35 @@ const statBGWriterQueryPost17 = `SELECT
216216
,stats_reset
217217
FROM pg_stat_bgwriter;`
218218

219-
const statCheckpointerQuery = `
220-
WITH server_version AS (
221-
SELECT current_setting('server_version_num')::int AS ver
222-
)
219+
const statCheckpointerQueryPrePG18 = `
223220
SELECT
224221
num_timed,
225222
num_requested,
226-
CASE WHEN ver >= 180000 THEN COALESCE(num_done, 0) ELSE 0 END as num_done,
223+
num_done,
227224
restartpoints_timed,
228225
restartpoints_req,
229226
restartpoints_done,
230227
write_time,
231228
sync_time,
232229
buffers_written,
233-
CASE WHEN ver >= 180000 THEN COALESCE(slru_written, 0) ELSE 0 END as slru_written,
230+
slru_written,
234231
stats_reset
235-
FROM pg_stat_checkpointer, server_version;`
232+
FROM pg_stat_checkpointer;`
233+
234+
const statCheckpointerQueryPostPG18 = `
235+
SELECT
236+
num_timed,
237+
num_requested,
238+
NULL::bigint as num_done,
239+
restartpoints_timed,
240+
restartpoints_req,
241+
restartpoints_done,
242+
write_time,
243+
sync_time,
244+
buffers_written,
245+
NULL::bigint as slru_written,
246+
stats_reset
247+
FROM pg_stat_checkpointer;`
236248

237249
func (p PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
238250
db := instance.getDB()
@@ -243,6 +255,11 @@ func (p PGStatBGWriterCollector) Update(ctx context.Context, instance *instance,
243255

244256
v18plus := instance.version.GTE(semver.Version{Major: 18})
245257

258+
statCheckpointerQuery := statCheckpointerQueryPrePG18
259+
if v18plus {
260+
statCheckpointerQuery = statCheckpointerQueryPostPG18
261+
}
262+
246263
if instance.version.GE(semver.MustParse("17.0.0")) {
247264
row := db.QueryRowContext(ctx,
248265
statBGWriterQueryPost17)

collector/pg_stat_database.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,32 @@ var (
226226
prometheus.Labels{},
227227
)
228228

229-
statDatabaseQuery = `
230-
WITH server_version AS (
231-
SELECT current_setting('server_version_num')::int AS ver
232-
)
229+
statDatabaseQueryPrePG18 = `
230+
SELECT
231+
datid,
232+
datname,
233+
numbackends,
234+
xact_commit,
235+
xact_rollback,
236+
blks_read,
237+
blks_hit,
238+
tup_returned,
239+
tup_fetched,
240+
tup_inserted,
241+
tup_updated,
242+
tup_deleted,
243+
conflicts,
244+
temp_files,
245+
temp_bytes,
246+
deadlocks,
247+
blk_read_time,
248+
blk_write_time,
249+
stats_reset,
250+
NULL::bigint as parallel_workers_to_launch,
251+
NULL::bigint as parallel_workers_launched
252+
FROM pg_stat_database;`
253+
254+
statDatabaseQueryPostPG18 = `
233255
SELECT
234256
datid,
235257
datname,
@@ -250,16 +272,21 @@ var (
250272
blk_read_time,
251273
blk_write_time,
252274
stats_reset,
253-
CASE WHEN ver >= 180000 THEN parallel_workers_to_launch ELSE NULL END as parallel_workers_to_launch,
254-
CASE WHEN ver >= 180000 THEN parallel_workers_launched ELSE NULL END as parallel_workers_launched
255-
FROM pg_stat_database, server_version;`
275+
parallel_workers_to_launch,
276+
parallel_workers_launched
277+
FROM pg_stat_database;`
256278
)
257279

258280
func (c *PGStatDatabaseCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
259281
db := instance.getDB()
260282

261283
v18plus := instance.version.GTE(semver.Version{Major: 18})
262284

285+
statDatabaseQuery := statDatabaseQueryPrePG18
286+
if v18plus {
287+
statDatabaseQuery = statDatabaseQueryPostPG18
288+
}
289+
263290
rows, err := db.QueryContext(ctx, statDatabaseQuery)
264291
if err != nil {
265292
return err

collector/pg_stat_database_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestPGStatDatabaseCollector(t *testing.T) {
9090
2,
9191
)
9292

93-
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
93+
mock.ExpectQuery(sanitizeQuery(statDatabaseQueryPostPG18)).WillReturnRows(rows)
9494

9595
ch := make(chan prometheus.Metric)
9696
go func() {
@@ -221,7 +221,7 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
221221
3,
222222
2,
223223
)
224-
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
224+
mock.ExpectQuery(sanitizeQuery(statDatabaseQueryPostPG18)).WillReturnRows(rows)
225225

226226
ch := make(chan prometheus.Metric)
227227
go func() {
@@ -375,7 +375,7 @@ func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
375375
3,
376376
2,
377377
)
378-
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
378+
mock.ExpectQuery(sanitizeQuery(statDatabaseQueryPostPG18)).WillReturnRows(rows)
379379

380380
ch := make(chan prometheus.Metric)
381381
go func() {
@@ -499,7 +499,7 @@ func TestPGStatDatabaseCollectorTestNilStatReset(t *testing.T) {
499499
2,
500500
)
501501

502-
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
502+
mock.ExpectQuery(sanitizeQuery(statDatabaseQueryPostPG18)).WillReturnRows(rows)
503503

504504
ch := make(chan prometheus.Metric)
505505
go func() {

collector/pg_stat_io.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,31 +134,51 @@ var (
134134
prometheus.Labels{},
135135
)
136136

137-
statIOQuery = `
138-
WITH server_version AS (
139-
SELECT current_setting('server_version_num')::int AS ver
140-
)
137+
statIOQueryPrePG18 = `
141138
SELECT
142139
backend_type,
143140
object,
144141
context,
145142
reads,
146-
CASE WHEN server_version.ver >= 180000 THEN read_bytes ELSE NULL END as read_bytes,
143+
NULL:bigint as read_bytes,
147144
read_time,
148145
writes,
149-
CASE WHEN server_version.ver >= 180000 THEN write_bytes ELSE NULL END as write_bytes,
146+
NULL:bigint as write_bytes,
150147
write_time,
151148
writebacks,
152149
writeback_time,
153150
extends,
154-
CASE WHEN server_version.ver >= 180000 THEN extend_bytes ELSE NULL END as extend_bytes,
151+
NULL:numeric as extend_bytes,
155152
extend_time,
156153
hits,
157154
evictions,
158155
reuses,
159156
fsyncs,
160157
fsync_time
161-
FROM pg_stat_io, server_version;`
158+
FROM pg_stat_io;`
159+
160+
statIOQueryPostPG18 = `
161+
SELECT
162+
backend_type,
163+
object,
164+
context,
165+
reads,
166+
read_bytes,
167+
read_time,
168+
writes,
169+
write_bytes,
170+
write_time,
171+
writebacks,
172+
writeback_time,
173+
extends,
174+
extend_bytes,
175+
extend_time,
176+
hits,
177+
evictions,
178+
reuses,
179+
fsyncs,
180+
fsync_time
181+
FROM pg_stat_io;`
162182
)
163183

164184
func (c *PGStatIOCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
@@ -171,6 +191,11 @@ func (c *PGStatIOCollector) Update(ctx context.Context, instance *instance, ch c
171191

172192
v18plus := instance.version.GTE(semver.Version{Major: 18})
173193

194+
statIOQuery := statIOQueryPrePG18
195+
if v18plus {
196+
statIOQuery = statIOQueryPostPG18
197+
}
198+
174199
rows, err := db.QueryContext(ctx, statIOQuery)
175200
if err != nil {
176201
return err

collector/pg_stat_user_tables.go

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,7 @@ var (
182182
prometheus.Labels{},
183183
)
184184

185-
statUserTablesQuery = `
186-
WITH server_version AS (
187-
SELECT current_setting('server_version_num')::int AS ver
188-
)
185+
statUserTablesQueryPrePG18 = `
189186
SELECT
190187
current_database() datname,
191188
schemaname,
@@ -210,19 +207,54 @@ var (
210207
analyze_count,
211208
autoanalyze_count,
212209
pg_total_relation_size(relid) as total_size,
213-
CASE WHEN server_version.ver >= 180000 THEN total_vacuum_time ELSE NULL END as total_vacuum_time,
214-
CASE WHEN server_version.ver >= 180000 THEN total_autovacuum_time ELSE NULL END as total_autovacuum_time,
215-
CASE WHEN server_version.ver >= 180000 THEN total_analyze_time ELSE NULL END as total_analyze_time,
216-
CASE WHEN server_version.ver >= 180000 THEN total_autoanalyze_time ELSE NULL END as total_autoanalyze_time
217-
FROM
218-
pg_stat_user_tables, server_version;`
210+
NULL::double as total_vacuum_time,
211+
NULL::double as total_autovacuum_time,
212+
NULL::double as total_analyze_time,
213+
NULL::double as total_autoanalyze_time
214+
FROM pg_stat_user_tables;`
215+
216+
statUserTablesQueryPostPG18 = `
217+
SELECT
218+
current_database() datname,
219+
schemaname,
220+
relname,
221+
seq_scan,
222+
seq_tup_read,
223+
idx_scan,
224+
idx_tup_fetch,
225+
n_tup_ins,
226+
n_tup_upd,
227+
n_tup_del,
228+
n_tup_hot_upd,
229+
n_live_tup,
230+
n_dead_tup,
231+
n_mod_since_analyze,
232+
COALESCE(last_vacuum, '1970-01-01Z') as last_vacuum,
233+
COALESCE(last_autovacuum, '1970-01-01Z') as last_autovacuum,
234+
COALESCE(last_analyze, '1970-01-01Z') as last_analyze,
235+
COALESCE(last_autoanalyze, '1970-01-01Z') as last_autoanalyze,
236+
vacuum_count,
237+
autovacuum_count,
238+
analyze_count,
239+
autoanalyze_count,
240+
pg_total_relation_size(relid) as total_size,
241+
total_vacuum_time,
242+
total_autovacuum_time,
243+
total_analyze_time,
244+
total_autoanalyze_time
245+
FROM pg_stat_user_tables;`
219246
)
220247

221248
func (c *PGStatUserTablesCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
222249
db := instance.getDB()
223250

224251
v18plus := instance.version.GTE(semver.Version{Major: 18})
225252

253+
statUserTablesQuery := statUserTablesQueryPrePG18
254+
if v18plus {
255+
statUserTablesQuery = statUserTablesQueryPostPG18
256+
}
257+
226258
rows, err := db.QueryContext(ctx, statUserTablesQuery)
227259

228260
if err != nil {

collector/pg_stat_user_tables_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func TestPGStatUserTablesCollector(t *testing.T) {
107107
18,
108108
19,
109109
)
110-
mock.ExpectQuery(sanitizeQuery(statUserTablesQuery)).WillReturnRows(rows)
110+
mock.ExpectQuery(sanitizeQuery(statUserTablesQueryPostPG18)).WillReturnRows(rows)
111111
ch := make(chan prometheus.Metric)
112112
go func() {
113113
defer close(ch)
@@ -223,7 +223,7 @@ func TestPGStatUserTablesCollectorNullValues(t *testing.T) {
223223
nil,
224224
nil,
225225
)
226-
mock.ExpectQuery(sanitizeQuery(statUserTablesQuery)).WillReturnRows(rows)
226+
mock.ExpectQuery(sanitizeQuery(statUserTablesQueryPostPG18)).WillReturnRows(rows)
227227
ch := make(chan prometheus.Metric)
228228
go func() {
229229
defer close(ch)

0 commit comments

Comments
 (0)