Skip to content

Commit b32e34a

Browse files
yannhwrouesnel
andauthored
Do not panic on incorrect env (prometheus-community#457)
* do not panic when envs are set incorrectly * do not panic when envs are set incorrectly - fix tests Co-authored-by: Will Rouesnel <[email protected]>
1 parent 6354b0c commit b32e34a

File tree

2 files changed

+60
-41
lines changed

2 files changed

+60
-41
lines changed

cmd/postgres_exporter/postgres_exporter.go

+45-38
Original file line numberDiff line numberDiff line change
@@ -1581,50 +1581,51 @@ func (e *Exporter) scrapeDSN(ch chan<- prometheus.Metric, dsn string) error {
15811581
// DATA_SOURCE_NAME always wins so we do not break older versions
15821582
// reading secrets from files wins over secrets in environment variables
15831583
// DATA_SOURCE_NAME > DATA_SOURCE_{USER|PASS}_FILE > DATA_SOURCE_{USER|PASS}
1584-
func getDataSources() []string {
1584+
func getDataSources() ([]string, error) {
15851585
var dsn = os.Getenv("DATA_SOURCE_NAME")
1586-
if len(dsn) == 0 {
1587-
var user string
1588-
var pass string
1589-
var uri string
1586+
if len(dsn) != 0 {
1587+
return strings.Split(dsn, ","), nil
1588+
}
15901589

1591-
if len(os.Getenv("DATA_SOURCE_USER_FILE")) != 0 {
1592-
fileContents, err := ioutil.ReadFile(os.Getenv("DATA_SOURCE_USER_FILE"))
1593-
if err != nil {
1594-
panic(err)
1595-
}
1596-
user = strings.TrimSpace(string(fileContents))
1597-
} else {
1598-
user = os.Getenv("DATA_SOURCE_USER")
1599-
}
1590+
var user, pass, uri string
16001591

1601-
if len(os.Getenv("DATA_SOURCE_PASS_FILE")) != 0 {
1602-
fileContents, err := ioutil.ReadFile(os.Getenv("DATA_SOURCE_PASS_FILE"))
1603-
if err != nil {
1604-
panic(err)
1605-
}
1606-
pass = strings.TrimSpace(string(fileContents))
1607-
} else {
1608-
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())
16091597
}
1598+
user = strings.TrimSpace(string(fileContents))
1599+
} else {
1600+
user = os.Getenv("DATA_SOURCE_USER")
1601+
}
16101602

1611-
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+
}
16121613

1613-
if len(os.Getenv("DATA_SOURCE_URI_FILE")) != 0 {
1614-
fileContents, err := ioutil.ReadFile(os.Getenv("DATA_SOURCE_URI_FILE"))
1615-
if err != nil {
1616-
panic(err)
1617-
}
1618-
uri = strings.TrimSpace(string(fileContents))
1619-
} else {
1620-
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())
16211620
}
1621+
uri = strings.TrimSpace(string(fileContents))
1622+
} else {
1623+
uri = os.Getenv("DATA_SOURCE_URI")
1624+
}
16221625

1623-
dsn = "postgresql://" + ui + "@" + uri
1626+
dsn = "postgresql://" + ui + "@" + uri
16241627

1625-
return []string{dsn}
1626-
}
1627-
return strings.Split(dsn, ",")
1628+
return []string{dsn}, nil
16281629
}
16291630

16301631
func contains(a []string, x string) bool {
@@ -1657,19 +1658,25 @@ func main() {
16571658
return
16581659
}
16591660

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

1665-
exporter := NewExporter(dsn,
1670+
opts := []ExporterOpt{
16661671
DisableDefaultMetrics(*disableDefaultMetrics),
16671672
DisableSettingsMetrics(*disableSettingsMetrics),
16681673
AutoDiscoverDatabases(*autoDiscoverDatabases),
16691674
WithUserQueriesPath(*queriesPath),
16701675
WithConstantLabels(*constantLabelsList),
16711676
ExcludeDatabases(*excludeDatabases),
1672-
)
1677+
}
1678+
1679+
exporter := NewExporter(dsn, opts...)
16731680
defer func() {
16741681
exporter.servers.Close()
16751682
}()

cmd/postgres_exporter/postgres_exporter_test.go

+15-3
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
}

0 commit comments

Comments
 (0)