Skip to content

Commit cec6e00

Browse files
committed
server-labels server labels are defined as const labels
1 parent 03f31a4 commit cec6e00

File tree

5 files changed

+46
-42
lines changed

5 files changed

+46
-42
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ For running it locally on a default Debian/Ubuntu install, this will work (trans
121121

122122
sudo -u postgres DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" postgres_exporter
123123

124-
Also, you can set a list of sources to scrape different instances from the one exporter setup. Just define a string separated by comma.
124+
Also, you can set a list of sources to scrape different instances from the one exporter setup. Just define a comma separated string.
125125

126-
sudo -u postgres DATA_SOURCE_NAME="port=5432, port=6432" postgres_exporter
126+
sudo -u postgres DATA_SOURCE_NAME="port=5432,port=6432" postgres_exporter
127127

128128
See the [github.com/lib/pq](http://github.com/lib/pq) module for other ways to format the connection string.
129129

@@ -155,7 +155,8 @@ flag. This removes all built-in metrics, and uses only metrics defined by querie
155155

156156
### Running as non-superuser
157157

158-
To be able to collect metrics from pg_stat_activity and pg_stat_replication as non-superuser you have to create views as a superuser, and assign permissions separately to those. In PostgreSQL, views run with the permissions of the user that created them so they can act as security barriers.
158+
To be able to collect metrics from `pg_stat_activity` and `pg_stat_replication` as non-superuser you have to create views as a superuser, and assign permissions separately to those.
159+
In PostgreSQL, views run with the permissions of the user that created them so they can act as security barriers.
159160

160161
```sql
161162
CREATE USER postgres_exporter PASSWORD 'password';

cmd/postgres_exporter/pg_setting.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func querySettings(ch chan<- prometheus.Metric, server *Server) error {
3333
return fmt.Errorf("Error retrieving rows on %q: %s %v", server, namespace, err)
3434
}
3535

36-
ch <- s.metric(server.String())
36+
ch <- s.metric(server.labels)
3737
}
3838

3939
return nil
@@ -45,7 +45,7 @@ type pgSetting struct {
4545
name, setting, unit, shortDesc, vartype string
4646
}
4747

48-
func (s *pgSetting) metric(server string) prometheus.Metric {
48+
func (s *pgSetting) metric(labels prometheus.Labels) prometheus.Metric {
4949
var (
5050
err error
5151
name = strings.Replace(s.name, ".", "_", -1)
@@ -76,8 +76,8 @@ func (s *pgSetting) metric(server string) prometheus.Metric {
7676
panic(fmt.Sprintf("Unsupported vartype %q", s.vartype))
7777
}
7878

79-
desc := newDesc(subsystem, name, shortDesc)
80-
return prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, val, server)
79+
desc := newDesc(subsystem, name, shortDesc, labels)
80+
return prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, val)
8181
}
8282

8383
// TODO: fix linter override

cmd/postgres_exporter/pg_setting_test.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package main
44

55
import (
6+
"github.com/prometheus/client_golang/prometheus"
67
dto "github.com/prometheus/client_model/go"
78
. "gopkg.in/check.v1"
89
)
@@ -25,7 +26,7 @@ var fixtures = []fixture{
2526
unit: "seconds",
2627
err: "",
2728
},
28-
d: `Desc{fqName: "pg_settings_seconds_fixture_metric_seconds", help: "Foo foo foo [Units converted to seconds.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
29+
d: `Desc{fqName: "pg_settings_seconds_fixture_metric_seconds", help: "Foo foo foo [Units converted to seconds.]", constLabels: {}, variableLabels: []}`,
2930
v: 5,
3031
},
3132
{
@@ -41,7 +42,7 @@ var fixtures = []fixture{
4142
unit: "seconds",
4243
err: "",
4344
},
44-
d: `Desc{fqName: "pg_settings_milliseconds_fixture_metric_seconds", help: "Foo foo foo [Units converted to seconds.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
45+
d: `Desc{fqName: "pg_settings_milliseconds_fixture_metric_seconds", help: "Foo foo foo [Units converted to seconds.]", constLabels: {}, variableLabels: []}`,
4546
v: 5,
4647
},
4748
{
@@ -57,7 +58,7 @@ var fixtures = []fixture{
5758
unit: "bytes",
5859
err: "",
5960
},
60-
d: `Desc{fqName: "pg_settings_eight_kb_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
61+
d: `Desc{fqName: "pg_settings_eight_kb_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: []}`,
6162
v: 139264,
6263
},
6364
{
@@ -73,7 +74,7 @@ var fixtures = []fixture{
7374
unit: "bytes",
7475
err: "",
7576
},
76-
d: `Desc{fqName: "pg_settings_16_kb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
77+
d: `Desc{fqName: "pg_settings_16_kb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: []}`,
7778
v: 49152,
7879
},
7980
{
@@ -89,7 +90,7 @@ var fixtures = []fixture{
8990
unit: "bytes",
9091
err: "",
9192
},
92-
d: `Desc{fqName: "pg_settings_16_mb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
93+
d: `Desc{fqName: "pg_settings_16_mb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: []}`,
9394
v: 5.0331648e+07,
9495
},
9596
{
@@ -105,7 +106,7 @@ var fixtures = []fixture{
105106
unit: "bytes",
106107
err: "",
107108
},
108-
d: `Desc{fqName: "pg_settings_32_mb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
109+
d: `Desc{fqName: "pg_settings_32_mb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: []}`,
109110
v: 1.00663296e+08,
110111
},
111112
{
@@ -121,7 +122,7 @@ var fixtures = []fixture{
121122
unit: "bytes",
122123
err: "",
123124
},
124-
d: `Desc{fqName: "pg_settings_64_mb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
125+
d: `Desc{fqName: "pg_settings_64_mb_real_fixture_metric_bytes", help: "Foo foo foo [Units converted to bytes.]", constLabels: {}, variableLabels: []}`,
125126
v: 2.01326592e+08,
126127
},
127128
{
@@ -137,7 +138,7 @@ var fixtures = []fixture{
137138
unit: "",
138139
err: "",
139140
},
140-
d: `Desc{fqName: "pg_settings_bool_on_fixture_metric", help: "Foo foo foo", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
141+
d: `Desc{fqName: "pg_settings_bool_on_fixture_metric", help: "Foo foo foo", constLabels: {}, variableLabels: []}`,
141142
v: 1,
142143
},
143144
{
@@ -153,7 +154,7 @@ var fixtures = []fixture{
153154
unit: "",
154155
err: "",
155156
},
156-
d: `Desc{fqName: "pg_settings_bool_off_fixture_metric", help: "Foo foo foo", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
157+
d: `Desc{fqName: "pg_settings_bool_off_fixture_metric", help: "Foo foo foo", constLabels: {}, variableLabels: []}`,
157158
v: 0,
158159
},
159160
{
@@ -169,7 +170,7 @@ var fixtures = []fixture{
169170
unit: "seconds",
170171
err: "",
171172
},
172-
d: `Desc{fqName: "pg_settings_special_minus_one_value_seconds", help: "foo foo foo [Units converted to seconds.]", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
173+
d: `Desc{fqName: "pg_settings_special_minus_one_value_seconds", help: "foo foo foo [Units converted to seconds.]", constLabels: {}, variableLabels: []}`,
173174
v: -1,
174175
},
175176
{
@@ -185,7 +186,7 @@ var fixtures = []fixture{
185186
unit: "",
186187
err: "",
187188
},
188-
d: `Desc{fqName: "pg_settings_rds_rds_superuser_reserved_connections", help: "Sets the number of connection slots reserved for rds_superusers.", constLabels: {}, variableLabels: [` + serverLabelName + `]}`,
189+
d: `Desc{fqName: "pg_settings_rds_rds_superuser_reserved_connections", help: "Sets the number of connection slots reserved for rds_superusers.", constLabels: {}, variableLabels: []}`,
189190
v: 2,
190191
},
191192
{
@@ -233,7 +234,7 @@ func (s *PgSettingSuite) TestMetric(c *C) {
233234

234235
for _, f := range fixtures {
235236
d := &dto.Metric{}
236-
m := f.p.metric("")
237+
m := f.p.metric(prometheus.Labels{})
237238
m.Write(d) // nolint: errcheck
238239

239240
c.Check(m.Desc().String(), Equals, f.d)

cmd/postgres_exporter/postgres_exporter.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ func addQueries(content []byte, pgVersion semver.Version, server *Server) error
452452
}
453453

454454
// Convert the loaded metric map into exporter representation
455-
partialExporterMap := makeDescMap(pgVersion, metricMaps)
455+
partialExporterMap := makeDescMap(pgVersion, server.labels, metricMaps)
456456

457457
// Merge the two maps (which are now quite flatteend)
458458
for k, v := range partialExporterMap {
@@ -480,15 +480,15 @@ func addQueries(content []byte, pgVersion semver.Version, server *Server) error
480480
}
481481

482482
// Turn the MetricMap column mapping into a prometheus descriptor mapping.
483-
func makeDescMap(pgVersion semver.Version, metricMaps map[string]map[string]ColumnMapping) map[string]MetricMapNamespace {
483+
func makeDescMap(pgVersion semver.Version, serverLabels prometheus.Labels, metricMaps map[string]map[string]ColumnMapping) map[string]MetricMapNamespace {
484484
var metricMap = make(map[string]MetricMapNamespace)
485485

486486
for namespace, mappings := range metricMaps {
487487
thisMap := make(map[string]MetricMap)
488488

489489
// Get the constant labels.
490490
// Server label must be added to each metric.
491-
constLabels := []string{serverLabelName}
491+
var constLabels []string
492492
for columnName, columnMapping := range mappings {
493493
if columnMapping.usage == LABEL {
494494
constLabels = append(constLabels, columnName)
@@ -526,23 +526,23 @@ func makeDescMap(pgVersion semver.Version, metricMaps map[string]map[string]Colu
526526
case COUNTER:
527527
thisMap[columnName] = MetricMap{
528528
vtype: prometheus.CounterValue,
529-
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, columnName), columnMapping.description, constLabels, nil),
529+
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, columnName), columnMapping.description, constLabels, serverLabels),
530530
conversion: func(in interface{}) (float64, bool) {
531531
return dbToFloat64(in)
532532
},
533533
}
534534
case GAUGE:
535535
thisMap[columnName] = MetricMap{
536536
vtype: prometheus.GaugeValue,
537-
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, columnName), columnMapping.description, constLabels, nil),
537+
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, columnName), columnMapping.description, constLabels, serverLabels),
538538
conversion: func(in interface{}) (float64, bool) {
539539
return dbToFloat64(in)
540540
},
541541
}
542542
case MAPPEDMETRIC:
543543
thisMap[columnName] = MetricMap{
544544
vtype: prometheus.GaugeValue,
545-
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, columnName), columnMapping.description, constLabels, nil),
545+
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, columnName), columnMapping.description, constLabels, serverLabels),
546546
conversion: func(in interface{}) (float64, bool) {
547547
text, ok := in.(string)
548548
if !ok {
@@ -559,7 +559,7 @@ func makeDescMap(pgVersion semver.Version, metricMaps map[string]map[string]Colu
559559
case DURATION:
560560
thisMap[columnName] = MetricMap{
561561
vtype: prometheus.GaugeValue,
562-
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s_milliseconds", namespace, columnName), columnMapping.description, constLabels, nil),
562+
desc: prometheus.NewDesc(fmt.Sprintf("%s_%s_milliseconds", namespace, columnName), columnMapping.description, constLabels, serverLabels),
563563
conversion: func(in interface{}) (float64, bool) {
564564
var durationString string
565565
switch t := in.(type) {
@@ -725,8 +725,8 @@ func parseDSN(dsn string) (*url.URL, error) {
725725
// Server describes a connection to Postgres.
726726
// Also it contains metrics map and query overrides.
727727
type Server struct {
728-
db *sql.DB
729-
fingerprint string
728+
db *sql.DB
729+
labels prometheus.Labels
730730

731731
// Last version used to calculate metric map. If mismatch on scrape,
732732
// then maps are recalculated.
@@ -755,8 +755,10 @@ func NewServer(dsn string) (*Server, error) {
755755
log.Infof("Established new database connection to %q.", fingerprint)
756756

757757
return &Server{
758-
db: db,
759-
fingerprint: fingerprint,
758+
db: db,
759+
labels: prometheus.Labels{
760+
serverLabelName: fingerprint,
761+
},
760762
}, nil
761763
}
762764

@@ -784,7 +786,7 @@ func (s *Server) Ping() error {
784786

785787
// String returns server's fingerprint.
786788
func (s *Server) String() string {
787-
return s.fingerprint
789+
return s.labels[serverLabelName]
788790
}
789791

790792
// Scrape loads metrics.
@@ -976,10 +978,10 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
976978
e.userQueriesError.Collect(ch)
977979
}
978980

979-
func newDesc(subsystem, name, help string) *prometheus.Desc {
981+
func newDesc(subsystem, name, help string, labels prometheus.Labels) *prometheus.Desc {
980982
return prometheus.NewDesc(
981983
prometheus.BuildFQName(namespace, subsystem, name),
982-
help, []string{serverLabelName}, nil,
984+
help, nil, labels,
983985
)
984986
}
985987

@@ -1040,9 +1042,8 @@ func queryNamespaceMapping(ch chan<- prometheus.Metric, server *Server, namespac
10401042

10411043
// Get the label values for this row.
10421044
labels := make([]string, len(mapping.labels))
1043-
labels[0] = server.String() // Server label must be added to each metric.
1044-
for idx := 1; idx < len(mapping.labels); idx++ {
1045-
labels[idx], _ = dbToString(columnData[columnIdx[mapping.labels[idx]]])
1045+
for idx, label := range mapping.labels {
1046+
labels[idx], _ = dbToString(columnData[columnIdx[label]])
10461047
}
10471048

10481049
// Loop over column names, and match to scan data. Unknown columns
@@ -1133,7 +1134,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server)
11331134
server.metricMap = make(map[string]MetricMapNamespace)
11341135
server.queryOverrides = make(map[string]string)
11351136
} else {
1136-
server.metricMap = makeDescMap(semanticVersion, e.builtinMetricMaps)
1137+
server.metricMap = makeDescMap(semanticVersion, server.labels, e.builtinMetricMaps)
11371138
server.queryOverrides = makeQueryOverrideMap(semanticVersion, queryOverrides)
11381139
}
11391140

@@ -1166,10 +1167,10 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server)
11661167

11671168
// Output the version as a special metric
11681169
versionDesc := prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, staticLabelName),
1169-
"Version string as reported by postgres", []string{serverLabelName, "version", "short_version"}, nil)
1170+
"Version string as reported by postgres", []string{"version", "short_version"}, server.labels)
11701171

11711172
ch <- prometheus.MustNewConstMetric(versionDesc,
1172-
prometheus.UntypedValue, 1, server.String(), versionString, semanticVersion.String())
1173+
prometheus.UntypedValue, 1, versionString, semanticVersion.String())
11731174
return nil
11741175
}
11751176

cmd/postgres_exporter/postgres_exporter_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"os"
1111

1212
"github.com/blang/semver"
13+
"github.com/prometheus/client_golang/prometheus"
1314
)
1415

1516
// Hook up gocheck into the "go test" runner.
@@ -34,7 +35,7 @@ func (s *FunctionalSuite) TestSemanticVersionColumnDiscard(c *C) {
3435

3536
{
3637
// No metrics should be eliminated
37-
resultMap := makeDescMap(semver.MustParse("0.0.1"), testMetricMap)
38+
resultMap := makeDescMap(semver.MustParse("0.0.1"), prometheus.Labels{}, testMetricMap)
3839
c.Check(
3940
resultMap["test_namespace"].columnMappings["metric_which_stays"].discard,
4041
Equals,
@@ -55,7 +56,7 @@ func (s *FunctionalSuite) TestSemanticVersionColumnDiscard(c *C) {
5556
testMetricMap["test_namespace"]["metric_which_discards"] = discardableMetric
5657

5758
// Discard metric should be discarded
58-
resultMap := makeDescMap(semver.MustParse("0.0.1"), testMetricMap)
59+
resultMap := makeDescMap(semver.MustParse("0.0.1"), prometheus.Labels{}, testMetricMap)
5960
c.Check(
6061
resultMap["test_namespace"].columnMappings["metric_which_stays"].discard,
6162
Equals,
@@ -76,7 +77,7 @@ func (s *FunctionalSuite) TestSemanticVersionColumnDiscard(c *C) {
7677
testMetricMap["test_namespace"]["metric_which_discards"] = discardableMetric
7778

7879
// Discard metric should be discarded
79-
resultMap := makeDescMap(semver.MustParse("0.0.2"), testMetricMap)
80+
resultMap := makeDescMap(semver.MustParse("0.0.2"), prometheus.Labels{}, testMetricMap)
8081
c.Check(
8182
resultMap["test_namespace"].columnMappings["metric_which_stays"].discard,
8283
Equals,

0 commit comments

Comments
 (0)