Skip to content

Commit 3d7514d

Browse files
authored
Merge pull request #13 from 1and1/pg17
Pg17
2 parents aa1c0a5 + dd1faa3 commit 3d7514d

File tree

10 files changed

+261
-17
lines changed

10 files changed

+261
-17
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ to use a connection string, it could be provided via the `DATA_SOURCE_NAME` vari
5858
| collect.pg_stat_replication | all | Collect from pg_stat_replication |
5959
| collect.pg_prepared_xacts | all | Collect from pg_prepared_xacts |
6060
| collect.pg_statio_user_tables | all | Collect from pg_statio_user_tables |
61+
| collect.pg_stat_checkpointer | >= 17 | Collect from pg_stat_checkpointer |
6162

6263

6364
### General Flags

collector/bg_writer.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,21 @@ func (ScrapeBgWriter) Type() ScrapeType {
3939

4040
// Scrape collects data from database connection and sends it over channel as prometheus metric.
4141
func (ScrapeBgWriter) Scrape(ctx context.Context, db *bun.DB, ch chan<- prometheus.Metric) error {
42-
statBgwriter := &models.PgStatBgWriter{}
43-
if err := db.NewSelect().Model(statBgwriter).Scan(ctx); err != nil {
44-
return err
45-
}
42+
if pgversion < 170000 {
43+
statBgwriter := &models.PgStatBgWriter{}
4644

47-
return statBgwriter.ToMetrics(namespace, bgwriter, ch)
45+
if err := db.NewSelect().Model(statBgwriter).Scan(ctx); err != nil {
46+
return err
47+
}
48+
49+
return statBgwriter.ToMetrics(namespace, bgwriter, ch)
50+
} else {
51+
52+
statBgwriter := &models.PgStatBgWriter17{}
53+
if err := db.NewSelect().Model(statBgwriter).Scan(ctx); err != nil {
54+
return err
55+
}
56+
57+
return statBgwriter.ToMetrics(namespace, bgwriter, ch)
58+
}
4859
}

collector/checkpointer.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package collector
2+
3+
import (
4+
"context"
5+
6+
"github.com/prometheus/client_golang/prometheus"
7+
"github.com/uptrace/bun"
8+
9+
"github.com/1and1/pg-exporter/collector/models"
10+
)
11+
12+
const (
13+
// subsystem
14+
checkpointer = "checkpointer"
15+
)
16+
17+
// ScrapeCheckpointer scrapes from pg_stat_checkpointer
18+
type ScrapeCheckpointer struct{}
19+
20+
// Name of the Scraper
21+
func (ScrapeCheckpointer) Name() string {
22+
return "pg_stat_checkpointer"
23+
}
24+
25+
// Help describes the role of the Scraper
26+
func (ScrapeCheckpointer) Help() string {
27+
return "Collect from pg_stat_checkpointer"
28+
}
29+
30+
// Version returns minimum PostgreSQL version
31+
func (ScrapeCheckpointer) Version() int {
32+
return 0
33+
}
34+
35+
// Type returns the scrape type
36+
func (ScrapeCheckpointer) Type() ScrapeType {
37+
return SCRAPEGLOBAL
38+
}
39+
40+
// Scrape collects data from database connection and sends it over channel as prometheus metric.
41+
func (ScrapeCheckpointer) Scrape(ctx context.Context, db *bun.DB, ch chan<- prometheus.Metric) error {
42+
if pgversion >= 170000 {
43+
statCheckpointer := &models.PgStatCheckpointer{}
44+
if err := db.NewSelect().Model(statCheckpointer).Scan(ctx); err != nil {
45+
return err
46+
}
47+
48+
return statCheckpointer.ToMetrics(namespace, checkpointer, ch)
49+
} else {
50+
return nil
51+
}
52+
}

collector/models/PgStatBgWriter.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,25 @@ import (
77
)
88

99
// +metric=row
10-
type PgStatBgWriter struct {
10+
type PgStatBgWriter17 struct {
1111
bun.BaseModel `bun:"pg_stat_bgwriter"`
12-
CheckpointsTimed int64 `bun:"checkpoints_timed" help:"Number of scheduled checkpoints that have been performed" metric:"checkpoints_timed_total"`
13-
CheckpointsReq int64 `bun:"checkpoints_req" help:"Number of requested checkpoints that have been performed" metric:"checkpoints_req_total"`
14-
CheckpointWriteTime float64 `bun:"checkpoint_write_time" help:"Total amount of time that has been spent in the portion of checkpoint processing where files are written to disk, in milliseconds" metric:"checkpoint_write_seconds_total"`
15-
CheckpointSyncTime float64 `bun:"checkpoint_sync_time" help:"Total amount of time that has been spent in the portion of checkpoint processing where files are synchronized to disk, in milliseconds" metric:"checkpoint_sync_seconds_total"`
16-
BuffersCheckpoint int64 `bun:"buffers_checkpoint" help:"Number of buffers written during checkpoints" metric:"buffers_checkpoint_total"`
1712
BuffersClean int64 `bun:"buffers_clean" help:"Number of buffers written by the background writer" metric:"buffers_clean_total"`
1813
MaxwrittenClean int64 `bun:"maxwritten_clean" help:"Number of times the background writer stopped a cleaning scan because it had written too many buffers" metric:"maxwritten_clean_total"`
19-
BuffersBackend int64 `bun:"buffers_backend" help:"Number of buffers written directly by a backend" metric:"buffers_backend_total"`
20-
BuffersBackendFsync int64 `bun:"buffers_backend_fsync" help:"Number of times a backend had to execute its own fsync call" metric:"buffers_backend_fsync_total"`
2114
BuffersAlloc int64 `bun:"buffers_alloc" help:"Number of buffers allocated" metric:"buffers_alloc_total"`
2215
StatsReset time.Time `bun:"stats_reset" help:"Time at which these statistics were last reset"`
2316
}
17+
18+
type PgStatBgWriter struct {
19+
bun.BaseModel `bun:"pg_stat_bgwriter"`
20+
CheckpointsTimed int64 `bun:"checkpoints_timed" help:"Number of scheduled checkpoints that have been performed" metric:"checkpoints_timed_total"`
21+
CheckpointsReq int64 `bun:"checkpoints_req" help:"Number of requested checkpoints that have been performed" metric:"checkpoints_req_total"`
22+
CheckpointWriteTime float64 `bun:"checkpoint_write_time" help:"Total amount of time that has been spent in the portion of checkpoint processing where files are written to disk, in milliseconds" metric:"checkpoint_write_seconds_total"`
23+
CheckpointSyncTime float64 `bun:"checkpoint_sync_time" help:"Total amount of time that has been spent in the portion of checkpoint processing where files are synchronized to disk, in milliseconds" metric:"checkpoint_sync_seconds_total"`
24+
BuffersCheckpoint int64 `bun:"buffers_checkpoint" help:"Number of buffers written during checkpoints" metric:"buffers_checkpoint_total"`
25+
BuffersClean int64 `bun:"buffers_clean" help:"Number of buffers written by the background writer" metric:"buffers_clean_total"`
26+
MaxwrittenClean int64 `bun:"maxwritten_clean" help:"Number of times the background writer stopped a cleaning scan because it had written too many buffers" metric:"maxwritten_clean_total"`
27+
BuffersBackend int64 `bun:"buffers_backend" help:"Number of buffers written directly by a backend" metric:"buffers_backend_total"`
28+
BuffersBackendFsync int64 `bun:"buffers_backend_fsync" help:"Number of times a backend had to execute its own fsync call" metric:"buffers_backend_fsync_total"`
29+
BuffersAlloc int64 `bun:"buffers_alloc" help:"Number of buffers allocated" metric:"buffers_alloc_total"`
30+
StatsReset time.Time `bun:"stats_reset" help:"Time at which these statistics were last reset"`
31+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package models
2+
3+
import (
4+
"time"
5+
6+
"github.com/uptrace/bun"
7+
)
8+
9+
// +metric=row
10+
type PgStatCheckpointer struct {
11+
bun.BaseModel `bun:"pg_stat_checkpointer"`
12+
NumTimed int64 `bun:"num_timed" help:"Number of Checkpoints timed" metric:"num_timed_total"`
13+
NumRequested int64 `bun:"num_requested" help:"Number of Checkpoints requested" metric:"num_requested_total"`
14+
RestartpointsTimed int64 `bun:"restartpoints_timed" help:"Number of Restart Points timed" metric:"restartpoints_timed_total"`
15+
RestartpointsReq int64 `bun:"restartpoints_req" help:"Number of Restart Points requested" metric:"restartpoints_req_total"`
16+
RestartpointsDone int64 `bun:"restartpoints_done" help:"Number of Restart Points done" metric:"restartpoints_done_total"`
17+
CkpWriteTime float64 `bun:"write_time" help:"Checkpoint write Time" metric:"ckp_write_time_total"`
18+
CkpSyncTime float64 `bun:"sync_time" help:"Checkpoint sync Time" metric:"ckp_sync_time_total"`
19+
BuffersWritten int64 `bun:"buffers_written" help:"Checkpoint Buffers written" metric:"ckp_buffers_written_total"`
20+
StatsReset time.Time `bun:"stats_reset" help:"Time at which these statistics were last reset"`
21+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*generated by binding gen*/
2+
package models
3+
4+
import (
5+
"github.com/prometheus/client_golang/prometheus"
6+
)
7+
8+
func (r *PgStatBgWriter17) ToMetrics(namespace string, subsystem string, ch chan<- prometheus.Metric, labelsKV ...string) error {
9+
labels := newLabels(labelsKV...)
10+
// labels
11+
12+
// optional labels
13+
14+
// metrics
15+
// buffers_clean_total (CounterValue)
16+
buffersCleanTotal := float64(r.BuffersClean)
17+
ch <- prometheus.MustNewConstMetric(
18+
prometheus.NewDesc(
19+
prometheus.BuildFQName(namespace, subsystem, `buffers_clean_total`), `Number of buffers written by the background writer`, nil, labels,
20+
), prometheus.CounterValue, buffersCleanTotal,
21+
)
22+
23+
// maxwritten_clean_total (CounterValue)
24+
maxwrittenCleanTotal := float64(r.MaxwrittenClean)
25+
ch <- prometheus.MustNewConstMetric(
26+
prometheus.NewDesc(
27+
prometheus.BuildFQName(namespace, subsystem, `maxwritten_clean_total`), `Number of times the background writer stopped a cleaning scan because it had written too many buffers`, nil, labels,
28+
), prometheus.CounterValue, maxwrittenCleanTotal,
29+
)
30+
31+
// buffers_alloc_total (CounterValue)
32+
buffersAllocTotal := float64(r.BuffersAlloc)
33+
ch <- prometheus.MustNewConstMetric(
34+
prometheus.NewDesc(
35+
prometheus.BuildFQName(namespace, subsystem, `buffers_alloc_total`), `Number of buffers allocated`, nil, labels,
36+
), prometheus.CounterValue, buffersAllocTotal,
37+
)
38+
39+
// stats_reset (CounterValue)
40+
var statsReset float64
41+
if r.StatsReset.IsZero() {
42+
statsReset = float64(0)
43+
} else {
44+
statsReset = float64(r.StatsReset.Unix())
45+
}
46+
ch <- prometheus.MustNewConstMetric(
47+
prometheus.NewDesc(
48+
prometheus.BuildFQName(namespace, subsystem, `stats_reset`), `Time at which these statistics were last reset`, nil, labels,
49+
), prometheus.CounterValue, statsReset,
50+
)
51+
52+
// optional metrics
53+
54+
return nil
55+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*generated by binding gen*/
2+
package models
3+
4+
import (
5+
"github.com/prometheus/client_golang/prometheus"
6+
)
7+
8+
func (r *PgStatCheckpointer) ToMetrics(namespace string, subsystem string, ch chan<- prometheus.Metric, labelsKV ...string) error {
9+
labels := newLabels(labelsKV...)
10+
// labels
11+
12+
// optional labels
13+
14+
// metrics
15+
// num_timed_total (CounterValue)
16+
numTimedTotal := float64(r.NumTimed)
17+
ch <- prometheus.MustNewConstMetric(
18+
prometheus.NewDesc(
19+
prometheus.BuildFQName(namespace, subsystem, `num_timed_total`), `Number of Checkpoints timed`, nil, labels,
20+
), prometheus.CounterValue, numTimedTotal,
21+
)
22+
23+
// num_requested_total (CounterValue)
24+
numRequestedTotal := float64(r.NumRequested)
25+
ch <- prometheus.MustNewConstMetric(
26+
prometheus.NewDesc(
27+
prometheus.BuildFQName(namespace, subsystem, `num_requested_total`), `Number of Checkpoints requested`, nil, labels,
28+
), prometheus.CounterValue, numRequestedTotal,
29+
)
30+
31+
// restartpoints_timed_total (CounterValue)
32+
restartpointsTimedTotal := float64(r.RestartpointsTimed)
33+
ch <- prometheus.MustNewConstMetric(
34+
prometheus.NewDesc(
35+
prometheus.BuildFQName(namespace, subsystem, `restartpoints_timed_total`), `Number of Restart Points timed`, nil, labels,
36+
), prometheus.CounterValue, restartpointsTimedTotal,
37+
)
38+
39+
// restartpoints_req_total (CounterValue)
40+
restartpointsReqTotal := float64(r.RestartpointsReq)
41+
ch <- prometheus.MustNewConstMetric(
42+
prometheus.NewDesc(
43+
prometheus.BuildFQName(namespace, subsystem, `restartpoints_req_total`), `Number of Restart Points requested`, nil, labels,
44+
), prometheus.CounterValue, restartpointsReqTotal,
45+
)
46+
47+
// restartpoints_done_total (CounterValue)
48+
restartpointsDoneTotal := float64(r.RestartpointsDone)
49+
ch <- prometheus.MustNewConstMetric(
50+
prometheus.NewDesc(
51+
prometheus.BuildFQName(namespace, subsystem, `restartpoints_done_total`), `Number of Restart Points done`, nil, labels,
52+
), prometheus.CounterValue, restartpointsDoneTotal,
53+
)
54+
55+
// ckp_write_time_total (CounterValue)
56+
57+
ch <- prometheus.MustNewConstMetric(
58+
prometheus.NewDesc(
59+
prometheus.BuildFQName(namespace, subsystem, `ckp_write_time_total`), `Checkpoint write Time`, nil, labels,
60+
), prometheus.CounterValue, r.CkpWriteTime,
61+
)
62+
63+
// ckp_sync_time_total (CounterValue)
64+
65+
ch <- prometheus.MustNewConstMetric(
66+
prometheus.NewDesc(
67+
prometheus.BuildFQName(namespace, subsystem, `ckp_sync_time_total`), `Checkpoint sync Time`, nil, labels,
68+
), prometheus.CounterValue, r.CkpSyncTime,
69+
)
70+
71+
// ckp_buffers_written_total (CounterValue)
72+
ckpBuffersWrittenTotal := float64(r.BuffersWritten)
73+
ch <- prometheus.MustNewConstMetric(
74+
prometheus.NewDesc(
75+
prometheus.BuildFQName(namespace, subsystem, `ckp_buffers_written_total`), `Checkpoint Buffers written`, nil, labels,
76+
), prometheus.CounterValue, ckpBuffersWrittenTotal,
77+
)
78+
79+
// stats_reset (CounterValue)
80+
var statsReset float64
81+
if r.StatsReset.IsZero() {
82+
statsReset = float64(0)
83+
} else {
84+
statsReset = float64(r.StatsReset.Unix())
85+
}
86+
ch <- prometheus.MustNewConstMetric(
87+
prometheus.NewDesc(
88+
prometheus.BuildFQName(namespace, subsystem, `stats_reset`), `Time at which these statistics were last reset`, nil, labels,
89+
), prometheus.CounterValue, statsReset,
90+
)
91+
92+
// optional metrics
93+
94+
return nil
95+
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ require (
3535
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
3636
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
3737
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
38-
golang.org/x/crypto v0.6.0 // indirect
38+
golang.org/x/crypto v0.31.0 // indirect
3939
golang.org/x/mod v0.3.0 // indirect
4040
golang.org/x/sys v0.5.0 // indirect
4141
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d // indirect
4242
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect
43-
google.golang.org/protobuf v1.28.1 // indirect
43+
google.golang.org/protobuf v1.33.0 // indirect
4444
mellium.im/sasl v0.3.1 // indirect
4545
)

pg_exporter.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ var scrapers = map[collector.Scraper]bool{
5757
collector.ScrapeIOTables{}: true,
5858
collector.ScrapeWal{}: true,
5959
collector.ScrapeFrozenXid{}: true,
60+
collector.ScrapeCheckpointer{}: true,
6061
collector.ScrapeStatements{}: false,
6162
}
6263

vendor/modules.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ github.com/vmihailenco/tagparser/internal/parser
100100
github.com/vmihailenco/tagparser/v2
101101
github.com/vmihailenco/tagparser/v2/internal
102102
github.com/vmihailenco/tagparser/v2/internal/parser
103-
# golang.org/x/crypto v0.6.0
103+
# golang.org/x/crypto v0.31.0
104104
## explicit; go 1.17
105105
golang.org/x/crypto/pbkdf2
106106
# golang.org/x/mod v0.3.0
@@ -129,7 +129,7 @@ golang.org/x/tools/internal/imports
129129
## explicit; go 1.11
130130
golang.org/x/xerrors
131131
golang.org/x/xerrors/internal
132-
# google.golang.org/protobuf v1.28.1
132+
# google.golang.org/protobuf v1.33.0
133133
## explicit; go 1.11
134134
google.golang.org/protobuf/encoding/prototext
135135
google.golang.org/protobuf/encoding/protowire

0 commit comments

Comments
 (0)