mirror of
https://github.com/prometheus-community/postgres_exporter
synced 2025-04-30 15:08:03 +00:00
PMM-13448 Support PG17 to provide pre PG17 metrics support. (#281)
This commit is contained in:
parent
e33ef976ee
commit
5f34fc4b6b
@ -16,7 +16,7 @@ package collector
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"github.com/blang/semver/v4"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"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_timed
|
||||||
,checkpoints_req
|
,checkpoints_req
|
||||||
,checkpoint_write_time
|
,checkpoint_write_time
|
||||||
@ -184,19 +184,55 @@ const statBGWriterQuery = `SELECT
|
|||||||
,stats_reset
|
,stats_reset
|
||||||
FROM pg_stat_bgwriter;`
|
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()
|
db := instance.getDB()
|
||||||
row := db.QueryRowContext(ctx,
|
|
||||||
statBGWriterQuery)
|
|
||||||
|
|
||||||
var cpt, cpr, bcp, bc, mwc, bb, bbf, ba sql.NullInt64
|
var cpt, cpr, bcp, bc, mwc, bb, bbf, ba sql.NullInt64
|
||||||
var cpwt, cpst sql.NullFloat64
|
var cpwt, cpst sql.NullFloat64
|
||||||
var sr sql.NullTime
|
var sr sql.NullTime
|
||||||
|
|
||||||
err := row.Scan(&cpt, &cpr, &cpwt, &cpst, &bcp, &bc, &mwc, &bb, &bbf, &ba, &sr)
|
if instance.version.GE(semver.MustParse("17.0.0")) {
|
||||||
if err != nil {
|
row := db.QueryRowContext(ctx,
|
||||||
return err
|
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
|
cptMetric := 0.0
|
||||||
@ -400,6 +436,5 @@ func (PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, c
|
|||||||
"exporter",
|
"exporter",
|
||||||
instance.name,
|
instance.name,
|
||||||
)
|
)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ func TestPGStatBGWriterCollector(t *testing.T) {
|
|||||||
|
|
||||||
rows := sqlmock.NewRows(columns).
|
rows := sqlmock.NewRows(columns).
|
||||||
AddRow(354, 4945, 289097744, 1242257, int64(3275602074), 89320867, 450139, 2034563757, 0, int64(2725688749), srT)
|
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)
|
ch := make(chan prometheus.Metric)
|
||||||
go func() {
|
go func() {
|
||||||
@ -114,7 +114,7 @@ func TestPGStatBGWriterCollectorNullValues(t *testing.T) {
|
|||||||
|
|
||||||
rows := sqlmock.NewRows(columns).
|
rows := sqlmock.NewRows(columns).
|
||||||
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
|
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)
|
ch := make(chan prometheus.Metric)
|
||||||
go func() {
|
go func() {
|
||||||
|
Loading…
Reference in New Issue
Block a user