@@ -16,7 +16,7 @@ package collector
16
16
import (
17
17
"context"
18
18
"database/sql"
19
-
19
+ "github.com/blang/semver/v4"
20
20
"github.com/prometheus/client_golang/prometheus"
21
21
)
22
22
@@ -170,7 +170,7 @@ var statBGWriter = map[string]*prometheus.Desc{
170
170
),
171
171
}
172
172
173
- const statBGWriterQuery = `SELECT
173
+ const statBGWriterQueryPrePG17 = `SELECT
174
174
checkpoints_timed
175
175
,checkpoints_req
176
176
,checkpoint_write_time
@@ -184,19 +184,55 @@ const statBGWriterQuery = `SELECT
184
184
,stats_reset
185
185
FROM pg_stat_bgwriter;`
186
186
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;`
188
205
206
+ func (p PGStatBGWriterCollector ) Update (ctx context.Context , instance * instance , ch chan <- prometheus.Metric ) error {
189
207
db := instance .getDB ()
190
- row := db .QueryRowContext (ctx ,
191
- statBGWriterQuery )
192
208
193
209
var cpt , cpr , bcp , bc , mwc , bb , bbf , ba sql.NullInt64
194
210
var cpwt , cpst sql.NullFloat64
195
211
var sr sql.NullTime
196
212
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
+ }
200
236
}
201
237
202
238
cptMetric := 0.0
@@ -400,6 +436,5 @@ func (PGStatBGWriterCollector) Update(ctx context.Context, instance *instance, c
400
436
"exporter" ,
401
437
instance .name ,
402
438
)
403
-
404
439
return nil
405
440
}
0 commit comments