PMM-13448 Support PG17 to provide pre PG17 metrics support. (#281)

This commit is contained in:
Nurlan Moldomurov 2024-11-27 13:46:52 +03:00 committed by GitHub
parent e33ef976ee
commit 5f34fc4b6b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 11 deletions

View File

@ -16,7 +16,7 @@ package collector
import (
"context"
"database/sql"
"github.com/blang/semver/v4"
"github.com/prometheus/client_golang/prometheus"
)
@ -170,7 +170,7 @@ var statBGWriter = map[string]*prometheus.Desc{
),
}
const statBGWriterQuery = `SELECT
const statBGWriterQueryPrePG17 = `SELECT
checkpoints_timed
,checkpoints_req
,checkpoint_write_time
@ -184,20 +184,56 @@ const statBGWriterQuery = `SELECT
,stats_reset
FROM pg_stat_bgwriter;`
func (PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
const statBGWriterQueryPost17 = `SELECT
buffers_clean
,maxwritten_clean
,buffers_alloc
,stats_reset
FROM pg_stat_bgwriter;`
const statCheckpointerQuery = `SELECT
num_timed
,num_requested
,restartpoints_timed
,restartpoints_req
,restartpoints_done
,write_time
,sync_time
,buffers_written
,stats_reset
FROM pg_stat_checkpointer;`
func (p PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
db := instance.getDB()
row := db.QueryRowContext(ctx,
statBGWriterQuery)
var cpt, cpr, bcp, bc, mwc, bb, bbf, ba sql.NullInt64
var cpwt, cpst sql.NullFloat64
var sr sql.NullTime
if instance.version.GE(semver.MustParse("17.0.0")) {
row := db.QueryRowContext(ctx,
statBGWriterQueryPost17)
err := row.Scan(&bc, &mwc, &ba, &sr)
if err != nil {
return err
}
var rpt, rpr, rpd sql.NullInt64
var csr sql.NullTime
// these variables are not used, but I left them here for reference
row = db.QueryRowContext(ctx,
statCheckpointerQuery)
err = row.Scan(&cpt, &cpr, &rpt, &rpr, &rpd, &cpwt, &cpst, &bcp, &csr)
if err != nil {
return err
}
} else {
row := db.QueryRowContext(ctx,
statBGWriterQueryPrePG17)
err := row.Scan(&cpt, &cpr, &cpwt, &cpst, &bcp, &bc, &mwc, &bb, &bbf, &ba, &sr)
if err != nil {
return err
}
}
cptMetric := 0.0
if cpt.Valid {
@ -400,6 +436,5 @@ func (PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, c
"exporter",
instance.name,
)
return nil
}

View File

@ -52,7 +52,7 @@ func TestPGStatBGWriterCollector(t *testing.T) {
rows := sqlmock.NewRows(columns).
AddRow(354, 4945, 289097744, 1242257, int64(3275602074), 89320867, 450139, 2034563757, 0, int64(2725688749), srT)
mock.ExpectQuery(sanitizeQuery(statBGWriterQuery)).WillReturnRows(rows)
mock.ExpectQuery(sanitizeQuery(statBGWriterQueryPrePG17)).WillReturnRows(rows)
ch := make(chan prometheus.Metric)
go func() {
@ -114,7 +114,7 @@ func TestPGStatBGWriterCollectorNullValues(t *testing.T) {
rows := sqlmock.NewRows(columns).
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
mock.ExpectQuery(sanitizeQuery(statBGWriterQuery)).WillReturnRows(rows)
mock.ExpectQuery(sanitizeQuery(statBGWriterQueryPrePG17)).WillReturnRows(rows)
ch := make(chan prometheus.Metric)
go func() {