@@ -16,7 +16,7 @@ package collector
1616import (
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}
0 commit comments