Skip to content

Commit 69e1ec9

Browse files
authored
Merge branch 'master' into feature/test_postgres_12
2 parents 28ba87d + b32e34a commit 69e1ec9

File tree

4 files changed

+93
-41
lines changed

4 files changed

+93
-41
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,18 @@ AS
255255
SELECT * FROM get_pg_stat_replication();
256256

257257
GRANT SELECT ON postgres_exporter.pg_stat_replication TO postgres_exporter;
258+
259+
CREATE OR REPLACE FUNCTION get_pg_stat_statements() RETURNS SETOF pg_stat_statements AS
260+
$$ SELECT * FROM public.pg_stat_statements; $$
261+
LANGUAGE sql
262+
VOLATILE
263+
SECURITY DEFINER;
264+
265+
CREATE OR REPLACE VIEW postgres_exporter.pg_stat_statements
266+
AS
267+
SELECT * FROM get_pg_stat_statements();
268+
269+
GRANT SELECT ON postgres_exporter.pg_stat_statements TO postgres_exporter;
258270
```
259271

260272
> **NOTE**

cmd/postgres_exporter/postgres_exporter.go

Lines changed: 65 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,16 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
315315
true,
316316
0,
317317
},
318+
"pg_replication_slots": {
319+
map[string]ColumnMapping{
320+
"slot_name": {LABEL, "Name of the replication slot", nil, nil},
321+
"database": {LABEL, "Name of the database", nil, nil},
322+
"active": {GAUGE, "Flag indicating if the slot is active", nil, nil},
323+
"pg_wal_lsn_diff": {GAUGE, "Replication lag in bytes", nil, nil},
324+
},
325+
true,
326+
0,
327+
},
318328
"pg_stat_archiver": {
319329
map[string]ColumnMapping{
320330
"archived_count": {COUNTER, "Number of WAL files that have been successfully archived", nil, nil},
@@ -407,6 +417,16 @@ var queryOverrides = map[string][]OverrideQuery{
407417
},
408418
},
409419

420+
"pg_replication_slots": {
421+
{
422+
semver.MustParseRange(">=9.4.0"),
423+
`
424+
SELECT slot_name, database, active, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)
425+
FROM pg_replication_slots
426+
`,
427+
},
428+
},
429+
410430
"pg_stat_archiver": {
411431
{
412432
semver.MustParseRange(">=0.0.0"),
@@ -1561,50 +1581,51 @@ func (e *Exporter) scrapeDSN(ch chan<- prometheus.Metric, dsn string) error {
15611581
// DATA_SOURCE_NAME always wins so we do not break older versions
15621582
// reading secrets from files wins over secrets in environment variables
15631583
// DATA_SOURCE_NAME > DATA_SOURCE_{USER|PASS}_FILE > DATA_SOURCE_{USER|PASS}
1564-
func getDataSources() []string {
1584+
func getDataSources() ([]string, error) {
15651585
var dsn = os.Getenv("DATA_SOURCE_NAME")
1566-
if len(dsn) == 0 {
1567-
var user string
1568-
var pass string
1569-
var uri string
1586+
if len(dsn) != 0 {
1587+
return strings.Split(dsn, ","), nil
1588+
}
15701589

1571-
if len(os.Getenv("DATA_SOURCE_USER_FILE")) != 0 {
1572-
fileContents, err := ioutil.ReadFile(os.Getenv("DATA_SOURCE_USER_FILE"))
1573-
if err != nil {
1574-
panic(err)
1575-
}
1576-
user = strings.TrimSpace(string(fileContents))
1577-
} else {
1578-
user = os.Getenv("DATA_SOURCE_USER")
1579-
}
1590+
var user, pass, uri string
15801591

1581-
if len(os.Getenv("DATA_SOURCE_PASS_FILE")) != 0 {
1582-
fileContents, err := ioutil.ReadFile(os.Getenv("DATA_SOURCE_PASS_FILE"))
1583-
if err != nil {
1584-
panic(err)
1585-
}
1586-
pass = strings.TrimSpace(string(fileContents))
1587-
} else {
1588-
pass = os.Getenv("DATA_SOURCE_PASS")
1592+
dataSourceUserFile := os.Getenv("DATA_SOURCE_USER_FILE")
1593+
if len(dataSourceUserFile) != 0 {
1594+
fileContents, err := ioutil.ReadFile(dataSourceUserFile)
1595+
if err != nil {
1596+
return nil, fmt.Errorf("failed loading data source user file %s: %s", dataSourceUserFile, err.Error())
15891597
}
1598+
user = strings.TrimSpace(string(fileContents))
1599+
} else {
1600+
user = os.Getenv("DATA_SOURCE_USER")
1601+
}
15901602

1591-
ui := url.UserPassword(user, pass).String()
1603+
dataSourcePassFile := os.Getenv("DATA_SOURCE_PASS_FILE")
1604+
if len(dataSourcePassFile) != 0 {
1605+
fileContents, err := ioutil.ReadFile(dataSourcePassFile)
1606+
if err != nil {
1607+
return nil, fmt.Errorf("failed loading data source pass file %s: %s", dataSourcePassFile, err.Error())
1608+
}
1609+
pass = strings.TrimSpace(string(fileContents))
1610+
} else {
1611+
pass = os.Getenv("DATA_SOURCE_PASS")
1612+
}
15921613

1593-
if len(os.Getenv("DATA_SOURCE_URI_FILE")) != 0 {
1594-
fileContents, err := ioutil.ReadFile(os.Getenv("DATA_SOURCE_URI_FILE"))
1595-
if err != nil {
1596-
panic(err)
1597-
}
1598-
uri = strings.TrimSpace(string(fileContents))
1599-
} else {
1600-
uri = os.Getenv("DATA_SOURCE_URI")
1614+
ui := url.UserPassword(user, pass).String()
1615+
dataSrouceURIFile := os.Getenv("DATA_SOURCE_URI_FILE")
1616+
if len(dataSrouceURIFile) != 0 {
1617+
fileContents, err := ioutil.ReadFile(dataSrouceURIFile)
1618+
if err != nil {
1619+
return nil, fmt.Errorf("failed loading data source URI file %s: %s", dataSrouceURIFile, err.Error())
16011620
}
1621+
uri = strings.TrimSpace(string(fileContents))
1622+
} else {
1623+
uri = os.Getenv("DATA_SOURCE_URI")
1624+
}
16021625

1603-
dsn = "postgresql://" + ui + "@" + uri
1626+
dsn = "postgresql://" + ui + "@" + uri
16041627

1605-
return []string{dsn}
1606-
}
1607-
return strings.Split(dsn, ",")
1628+
return []string{dsn}, nil
16081629
}
16091630

16101631
func contains(a []string, x string) bool {
@@ -1637,19 +1658,25 @@ func main() {
16371658
return
16381659
}
16391660

1640-
dsn := getDataSources()
1661+
dsn, err := getDataSources()
1662+
if err != nil {
1663+
log.Fatalf("failed reading data sources: %s", err.Error())
1664+
}
1665+
16411666
if len(dsn) == 0 {
16421667
log.Fatal("couldn't find environment variables describing the datasource to use")
16431668
}
16441669

1645-
exporter := NewExporter(dsn,
1670+
opts := []ExporterOpt{
16461671
DisableDefaultMetrics(*disableDefaultMetrics),
16471672
DisableSettingsMetrics(*disableSettingsMetrics),
16481673
AutoDiscoverDatabases(*autoDiscoverDatabases),
16491674
WithUserQueriesPath(*queriesPath),
16501675
WithConstantLabels(*constantLabelsList),
16511676
ExcludeDatabases(*excludeDatabases),
1652-
)
1677+
}
1678+
1679+
exporter := NewExporter(dsn, opts...)
16531680
defer func() {
16541681
exporter.servers.Close()
16551682
}()

cmd/postgres_exporter/postgres_exporter_test.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ func (s *FunctionalSuite) TestEnvironmentSettingWithSecretsFiles(c *C) {
111111

112112
var expected = "postgresql://custom_username$&+,%2F%3A;=%3F%40:custom_password$&+,%2F%3A;=%3F%40@localhost:5432/?sslmode=disable"
113113

114-
dsn := getDataSources()
114+
dsn, err := getDataSources()
115+
if err != nil {
116+
c.Errorf("Unexpected error reading datasources")
117+
}
118+
115119
if len(dsn) == 0 {
116120
c.Errorf("Expected one data source, zero found")
117121
}
@@ -127,7 +131,11 @@ func (s *FunctionalSuite) TestEnvironmentSettingWithDns(c *C) {
127131
c.Assert(err, IsNil)
128132
defer UnsetEnvironment(c, "DATA_SOURCE_NAME")
129133

130-
dsn := getDataSources()
134+
dsn, err := getDataSources()
135+
if err != nil {
136+
c.Errorf("Unexpected error reading datasources")
137+
}
138+
131139
if len(dsn) == 0 {
132140
c.Errorf("Expected one data source, zero found")
133141
}
@@ -151,7 +159,11 @@ func (s *FunctionalSuite) TestEnvironmentSettingWithDnsAndSecrets(c *C) {
151159
c.Assert(err, IsNil)
152160
defer UnsetEnvironment(c, "DATA_SOURCE_PASS")
153161

154-
dsn := getDataSources()
162+
dsn, err := getDataSources()
163+
if err != nil {
164+
c.Errorf("Unexpected error reading datasources")
165+
}
166+
155167
if len(dsn) == 0 {
156168
c.Errorf("Expected one data source, zero found")
157169
}

magefile.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ var platforms []Platform = []Platform{
9898
{"linux", "amd64", ""},
9999
{"linux", "386", ""},
100100
{"linux", "arm64", ""},
101+
{"linux", "mips64le", ""},
101102
{"darwin", "amd64", ""},
102103
{"darwin", "386", ""},
103104
{"windows", "amd64", ".exe"},

0 commit comments

Comments
 (0)