Skip to content

Commit c4b4010

Browse files
committed
chore: (pre-release) add constant labels to custom collectors
1 parent f72272f commit c4b4010

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1116
-882
lines changed

.github/workflows/calculate-tag.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
if [[ "${{ github.ref_type }}" = "tag" ]]; then
3535
latest_tag="${GITHUB_REF#refs/tags/}"
3636
else
37-
latest_tag=$(git describe --tags --abbrev=0)
37+
latest_tag=$(git describe --tags --abbrev=1)
3838
fi
3939
echo "latest_tag=$latest_tag" >> $GITHUB_OUTPUT
4040
- name: Calculate pre-release suffix

cmd/postgres_exporter/main.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ package main
1616
import (
1717
"errors"
1818
"fmt"
19-
"net/http"
2019
"net"
20+
"net/http"
2121
"os"
2222
"strings"
2323

@@ -137,29 +137,38 @@ func main() {
137137
exporter.servers.Close()
138138
}()
139139

140-
prometheus.MustRegister(version.NewCollector(exporterName))
140+
reg := prometheus.NewRegistry()
141141

142-
prometheus.MustRegister(exporter)
142+
reg.MustRegister(
143+
version.NewCollector(exporterName),
144+
exporter,
145+
)
143146

144147
// TODO(@sysadmind): Remove this with multi-target support. We are removing multiple DSN support
145148
dsn := ""
146149
if len(dsns) > 0 {
147150
dsn = dsns[0]
148151
}
152+
153+
collOpts := []collector.Option{
154+
collector.WithConstantLabels(parseConstLabels(*constantLabelsList)),
155+
}
149156

150-
pe, err := collector.NewPostgresCollector(
157+
pgColl, err := collector.NewPostgresCollector(
151158
logger,
152159
excludedDatabases,
153160
dsn,
154161
[]string{},
162+
collOpts...
155163
)
156164
if err != nil {
157165
level.Warn(logger).Log("msg", "Failed to create PostgresCollector", "err", err.Error())
158166
} else {
159-
prometheus.MustRegister(pe)
167+
168+
reg.MustRegister(pgColl)
160169
}
161170

162-
http.Handle(*metricsPath, promhttp.Handler())
171+
http.Handle(*metricsPath, promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))
163172

164173
if *metricsPath != "/" && *metricsPath != "" {
165174
landingConfig := web.LandingConfig{

cmd/postgres_exporter/postgres_exporter.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ type Exporter struct {
415415
userQueriesPath string
416416
constantLabels prometheus.Labels
417417
duration prometheus.Gauge
418-
error prometheus.Gauge
418+
errors prometheus.Gauge
419419
psqlUp prometheus.Gauge
420420
userQueriesError *prometheus.GaugeVec
421421
totalScrapes prometheus.Counter
@@ -537,7 +537,7 @@ func (e *Exporter) setupInternalMetrics() {
537537
Help: "Total number of times PostgreSQL was scraped for metrics.",
538538
ConstLabels: e.constantLabels,
539539
})
540-
e.error = prometheus.NewGauge(prometheus.GaugeOpts{
540+
e.errors = prometheus.NewGauge(prometheus.GaugeOpts{
541541
Namespace: namespace,
542542
Subsystem: exporter,
543543
Name: "last_scrape_error",
@@ -569,7 +569,7 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
569569

570570
ch <- e.duration
571571
ch <- e.totalScrapes
572-
ch <- e.error
572+
ch <- e.errors
573573
ch <- e.psqlUp
574574
e.userQueriesError.Collect(ch)
575575
}
@@ -676,6 +676,7 @@ func (e *Exporter) scrape(ch chan<- prometheus.Metric) {
676676
var connectionErrorsCount int
677677

678678
for _, dsn := range dsns {
679+
level.Debug(logger).Log("msg", "start scrape", "dsn", dsn)
679680
if err := e.scrapeDSN(ch, dsn); err != nil {
680681
errorsCount++
681682

@@ -696,8 +697,8 @@ func (e *Exporter) scrape(ch chan<- prometheus.Metric) {
696697

697698
switch errorsCount {
698699
case 0:
699-
e.error.Set(0)
700+
e.errors.Set(0)
700701
default:
701-
e.error.Set(1)
702+
e.errors.Set(1)
702703
}
703704
}

collector/collector.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ type Collector interface {
6464
type collectorConfig struct {
6565
logger log.Logger
6666
excludeDatabases []string
67+
constantLabels prometheus.Labels
6768
}
6869

6970
func registerCollector(name string, isDefaultEnabled bool, createFunc func(collectorConfig) (Collector, error)) {
@@ -92,10 +93,19 @@ type PostgresCollector struct {
9293
logger log.Logger
9394

9495
instance *instance
96+
constantLabels prometheus.Labels
9597
}
9698

9799
type Option func(*PostgresCollector) error
98100

101+
// WithConstantLabels configures constant labels.
102+
func WithConstantLabels(l prometheus.Labels) Option {
103+
return func(c *PostgresCollector) error {
104+
c.constantLabels = l
105+
return nil
106+
}
107+
}
108+
99109
// NewPostgresCollector creates a new PostgresCollector.
100110
func NewPostgresCollector(logger log.Logger, excludeDatabases []string, dsn string, filters []string, options ...Option) (*PostgresCollector, error) {
101111
p := &PostgresCollector{
@@ -134,6 +144,7 @@ func NewPostgresCollector(logger log.Logger, excludeDatabases []string, dsn stri
134144
collector, err := factories[key](collectorConfig{
135145
logger: log.With(logger, "collector", key),
136146
excludeDatabases: excludeDatabases,
147+
constantLabels: p.constantLabels,
137148
})
138149
if err != nil {
139150
return nil, err

collector/pg_database.go

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ func init() {
3030
type PGDatabaseCollector struct {
3131
log log.Logger
3232
excludedDatabases []string
33+
pgDatabaseSizeDesc *prometheus.Desc
34+
pgDatabaseConnectionLimitsDesc *prometheus.Desc
3335
}
3436

3537
func NewPGDatabaseCollector(config collectorConfig) (Collector, error) {
@@ -40,29 +42,28 @@ func NewPGDatabaseCollector(config collectorConfig) (Collector, error) {
4042
return &PGDatabaseCollector{
4143
log: config.logger,
4244
excludedDatabases: exclude,
45+
pgDatabaseSizeDesc: prometheus.NewDesc(
46+
prometheus.BuildFQName(
47+
namespace,
48+
databaseSubsystem,
49+
"size_bytes",
50+
),
51+
"Disk space used by the database",
52+
[]string{"datname"}, config.constantLabels,
53+
),
54+
pgDatabaseConnectionLimitsDesc: prometheus.NewDesc(
55+
prometheus.BuildFQName(
56+
namespace,
57+
databaseSubsystem,
58+
"connection_limit",
59+
),
60+
"Connection limit set for the database",
61+
[]string{"datname"}, config.constantLabels,
62+
),
4363
}, nil
4464
}
4565

4666
var (
47-
pgDatabaseSizeDesc = prometheus.NewDesc(
48-
prometheus.BuildFQName(
49-
namespace,
50-
databaseSubsystem,
51-
"size_bytes",
52-
),
53-
"Disk space used by the database",
54-
[]string{"datname"}, nil,
55-
)
56-
pgDatabaseConnectionLimitsDesc = prometheus.NewDesc(
57-
prometheus.BuildFQName(
58-
namespace,
59-
databaseSubsystem,
60-
"connection_limit",
61-
),
62-
"Connection limit set for the database",
63-
[]string{"datname"}, nil,
64-
)
65-
6667
pgDatabaseQuery = "SELECT pg_database.datname, pg_database.datconnlimit FROM pg_database;"
6768
pgDatabaseSizeQuery = "SELECT pg_database_size($1)"
6869
)
@@ -113,7 +114,7 @@ func (c PGDatabaseCollector) Update(ctx context.Context, instance *instance, ch
113114
connLimitMetric = float64(connLimit.Int64)
114115
}
115116
ch <- prometheus.MustNewConstMetric(
116-
pgDatabaseConnectionLimitsDesc,
117+
c.pgDatabaseConnectionLimitsDesc,
117118
prometheus.GaugeValue, connLimitMetric, database,
118119
)
119120
}
@@ -131,7 +132,7 @@ func (c PGDatabaseCollector) Update(ctx context.Context, instance *instance, ch
131132
sizeMetric = size.Float64
132133
}
133134
ch <- prometheus.MustNewConstMetric(
134-
pgDatabaseSizeDesc,
135+
c.pgDatabaseSizeDesc,
135136
prometheus.GaugeValue, sizeMetric, datname,
136137
)
137138

collector/pg_database_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"testing"
1818

1919
"github.com/DATA-DOG/go-sqlmock"
20+
"github.com/go-kit/log"
2021
"github.com/prometheus/client_golang/prometheus"
2122
dto "github.com/prometheus/client_model/go"
2223
"github.com/smartystreets/goconvey/convey"
@@ -40,7 +41,10 @@ func TestPGDatabaseCollector(t *testing.T) {
4041
ch := make(chan prometheus.Metric)
4142
go func() {
4243
defer close(ch)
43-
c := PGDatabaseCollector{}
44+
c, _ := NewPGDatabaseCollector(collectorConfig{
45+
logger: log.NewNopLogger(),
46+
constantLabels: prometheus.Labels{},
47+
})
4448
if err := c.Update(context.Background(), inst, ch); err != nil {
4549
t.Errorf("Error calling PGDatabaseCollector.Update: %s", err)
4650
}
@@ -81,7 +85,10 @@ func TestPGDatabaseCollectorNullMetric(t *testing.T) {
8185
ch := make(chan prometheus.Metric)
8286
go func() {
8387
defer close(ch)
84-
c := PGDatabaseCollector{}
88+
c, _ := NewPGDatabaseCollector(collectorConfig{
89+
logger: log.NewNopLogger(),
90+
constantLabels: prometheus.Labels{},
91+
})
8592
if err := c.Update(context.Background(), inst, ch); err != nil {
8693
t.Errorf("Error calling PGDatabaseCollector.Update: %s", err)
8794
}

collector/pg_database_wraparound.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,30 @@ func init() {
2929
}
3030

3131
type PGDatabaseWraparoundCollector struct {
32-
log log.Logger
32+
log log.Logger
33+
databaseWraparoundAgeDatfrozenxid *prometheus.Desc
34+
databaseWraparoundAgeDatminmxid *prometheus.Desc
3335
}
3436

3537
func NewPGDatabaseWraparoundCollector(config collectorConfig) (Collector, error) {
36-
return &PGDatabaseWraparoundCollector{log: config.logger}, nil
38+
return &PGDatabaseWraparoundCollector{
39+
log: config.logger,
40+
databaseWraparoundAgeDatfrozenxid: prometheus.NewDesc(
41+
prometheus.BuildFQName(namespace, databaseWraparoundSubsystem, "age_datfrozenxid_seconds"),
42+
"Age of the oldest transaction ID that has not been frozen.",
43+
[]string{"datname"},
44+
config.constantLabels,
45+
),
46+
databaseWraparoundAgeDatminmxid: prometheus.NewDesc(
47+
prometheus.BuildFQName(namespace, databaseWraparoundSubsystem, "age_datminmxid_seconds"),
48+
"Age of the oldest multi-transaction ID that has been replaced with a transaction ID.",
49+
[]string{"datname"},
50+
config.constantLabels,
51+
),
52+
}, nil
3753
}
3854

3955
var (
40-
databaseWraparoundAgeDatfrozenxid = prometheus.NewDesc(
41-
prometheus.BuildFQName(namespace, databaseWraparoundSubsystem, "age_datfrozenxid_seconds"),
42-
"Age of the oldest transaction ID that has not been frozen.",
43-
[]string{"datname"},
44-
prometheus.Labels{},
45-
)
46-
databaseWraparoundAgeDatminmxid = prometheus.NewDesc(
47-
prometheus.BuildFQName(namespace, databaseWraparoundSubsystem, "age_datminmxid_seconds"),
48-
"Age of the oldest multi-transaction ID that has been replaced with a transaction ID.",
49-
[]string{"datname"},
50-
prometheus.Labels{},
51-
)
52-
5356
databaseWraparoundQuery = `
5457
SELECT
5558
datname,
@@ -96,14 +99,14 @@ func (c *PGDatabaseWraparoundCollector) Update(ctx context.Context, instance *in
9699
ageDatfrozenxidMetric := ageDatfrozenxid.Float64
97100

98101
ch <- prometheus.MustNewConstMetric(
99-
databaseWraparoundAgeDatfrozenxid,
102+
c.databaseWraparoundAgeDatfrozenxid,
100103
prometheus.GaugeValue,
101104
ageDatfrozenxidMetric, datname.String,
102105
)
103106

104107
ageDatminmxidMetric := ageDatminmxid.Float64
105108
ch <- prometheus.MustNewConstMetric(
106-
databaseWraparoundAgeDatminmxid,
109+
c.databaseWraparoundAgeDatminmxid,
107110
prometheus.GaugeValue,
108111
ageDatminmxidMetric, datname.String,
109112
)

collector/pg_database_wraparound_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"testing"
1818

1919
"github.com/DATA-DOG/go-sqlmock"
20+
"github.com/go-kit/log"
2021
"github.com/prometheus/client_golang/prometheus"
2122
dto "github.com/prometheus/client_model/go"
2223
"github.com/smartystreets/goconvey/convey"
@@ -42,7 +43,10 @@ func TestPGDatabaseWraparoundCollector(t *testing.T) {
4243
ch := make(chan prometheus.Metric)
4344
go func() {
4445
defer close(ch)
45-
c := PGDatabaseWraparoundCollector{}
46+
c, _ := NewPGDatabaseWraparoundCollector(collectorConfig{
47+
logger: log.NewNopLogger(),
48+
constantLabels: prometheus.Labels{},
49+
})
4650

4751
if err := c.Update(context.Background(), inst, ch); err != nil {
4852
t.Errorf("Error calling PGDatabaseWraparoundCollector.Update: %s", err)

collector/pg_locks.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,27 @@ func init() {
2929

3030
type PGLocksCollector struct {
3131
log log.Logger
32+
pgLocksDesc *prometheus.Desc
3233
}
3334

3435
func NewPGLocksCollector(config collectorConfig) (Collector, error) {
3536
return &PGLocksCollector{
3637
log: config.logger,
38+
pgLocksDesc : prometheus.NewDesc(
39+
prometheus.BuildFQName(
40+
namespace,
41+
locksSubsystem,
42+
"count",
43+
),
44+
"Number of locks",
45+
[]string{"datname", "mode"},
46+
config.constantLabels,
47+
),
3748
}, nil
3849
}
3950

4051
var (
41-
pgLocksDesc = prometheus.NewDesc(
42-
prometheus.BuildFQName(
43-
namespace,
44-
locksSubsystem,
45-
"count",
46-
),
47-
"Number of locks",
48-
[]string{"datname", "mode"}, nil,
49-
)
52+
5053

5154
pgLocksQuery = `
5255
SELECT
@@ -117,7 +120,7 @@ func (c PGLocksCollector) Update(ctx context.Context, instance *instance, ch cha
117120
}
118121

119122
ch <- prometheus.MustNewConstMetric(
120-
pgLocksDesc,
123+
c.pgLocksDesc,
121124
prometheus.GaugeValue, countMetric,
122125
datname.String, mode.String,
123126
)

0 commit comments

Comments
 (0)