Skip to content

Commit 5f34fc4

Browse files
authored
PMM-13448 Support PG17 to provide pre PG17 metrics support. (#281)
1 parent e33ef97 commit 5f34fc4

File tree

2 files changed

+46
-11
lines changed

2 files changed

+46
-11
lines changed

collector/pg_stat_bgwriter.go

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ package collector
1616
import (
1717
"context"
1818
"database/sql"
19-
19+
"github.com/blang/semver/v4"
2020
"github.com/prometheus/client_golang/prometheus"
2121
)
2222

@@ -170,7 +170,7 @@ var statBGWriter = map[string]*prometheus.Desc{
170170
),
171171
}
172172

173-
const statBGWriterQuery = `SELECT
173+
const statBGWriterQueryPrePG17 = `SELECT
174174
checkpoints_timed
175175
,checkpoints_req
176176
,checkpoint_write_time
@@ -184,19 +184,55 @@ const statBGWriterQuery = `SELECT
184184
,stats_reset
185185
FROM pg_stat_bgwriter;`
186186

187-
func (PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
187+
const statBGWriterQueryPost17 = `SELECT
188+
buffers_clean
189+
,maxwritten_clean
190+
,buffers_alloc
191+
,stats_reset
192+
FROM pg_stat_bgwriter;`
193+
194+
const statCheckpointerQuery = `SELECT
195+
num_timed
196+
,num_requested
197+
,restartpoints_timed
198+
,restartpoints_req
199+
,restartpoints_done
200+
,write_time
201+
,sync_time
202+
,buffers_written
203+
,stats_reset
204+
FROM pg_stat_checkpointer;`
188205

206+
func (p PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
189207
db := instance.getDB()
190-
row := db.QueryRowContext(ctx,
191-
statBGWriterQuery)
192208

193209
var cpt, cpr, bcp, bc, mwc, bb, bbf, ba sql.NullInt64
194210
var cpwt, cpst sql.NullFloat64
195211
var sr sql.NullTime
196212

197-
err := row.Scan(&cpt, &cpr, &cpwt, &cpst, &bcp, &bc, &mwc, &bb, &bbf, &ba, &sr)
198-
if err != nil {
199-
return err
213+
if instance.version.GE(semver.MustParse("17.0.0")) {
214+
row := db.QueryRowContext(ctx,
215+
statBGWriterQueryPost17)
216+
err := row.Scan(&bc, &mwc, &ba, &sr)
217+
if err != nil {
218+
return err
219+
}
220+
var rpt, rpr, rpd sql.NullInt64
221+
var csr sql.NullTime
222+
// these variables are not used, but I left them here for reference
223+
row = db.QueryRowContext(ctx,
224+
statCheckpointerQuery)
225+
err = row.Scan(&cpt, &cpr, &rpt, &rpr, &rpd, &cpwt, &cpst, &bcp, &csr)
226+
if err != nil {
227+
return err
228+
}
229+
} else {
230+
row := db.QueryRowContext(ctx,
231+
statBGWriterQueryPrePG17)
232+
err := row.Scan(&cpt, &cpr, &cpwt, &cpst, &bcp, &bc, &mwc, &bb, &bbf, &ba, &sr)
233+
if err != nil {
234+
return err
235+
}
200236
}
201237

202238
cptMetric := 0.0
@@ -400,6 +436,5 @@ func (PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, c
400436
"exporter",
401437
instance.name,
402438
)
403-
404439
return nil
405440
}

collector/pg_stat_bgwriter_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestPGStatBGWriterCollector(t *testing.T) {
5252

5353
rows := sqlmock.NewRows(columns).
5454
AddRow(354, 4945, 289097744, 1242257, int64(3275602074), 89320867, 450139, 2034563757, 0, int64(2725688749), srT)
55-
mock.ExpectQuery(sanitizeQuery(statBGWriterQuery)).WillReturnRows(rows)
55+
mock.ExpectQuery(sanitizeQuery(statBGWriterQueryPrePG17)).WillReturnRows(rows)
5656

5757
ch := make(chan prometheus.Metric)
5858
go func() {
@@ -114,7 +114,7 @@ func TestPGStatBGWriterCollectorNullValues(t *testing.T) {
114114

115115
rows := sqlmock.NewRows(columns).
116116
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
117-
mock.ExpectQuery(sanitizeQuery(statBGWriterQuery)).WillReturnRows(rows)
117+
mock.ExpectQuery(sanitizeQuery(statBGWriterQueryPrePG17)).WillReturnRows(rows)
118118

119119
ch := make(chan prometheus.Metric)
120120
go func() {

0 commit comments

Comments
 (0)