Skip to content

Commit 4f1e8f5

Browse files
committed
do not panic when envs are set incorrectly
1 parent b12c8ab commit 4f1e8f5

File tree

1 file changed

+45
-38
lines changed

1 file changed

+45
-38
lines changed

cmd/postgres_exporter/postgres_exporter.go

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,50 +1561,51 @@ func (e *Exporter) scrapeDSN(ch chan<- prometheus.Metric, dsn string) error {
15611561
// DATA_SOURCE_NAME always wins so we do not break older versions
15621562
// reading secrets from files wins over secrets in environment variables
15631563
// DATA_SOURCE_NAME > DATA_SOURCE_{USER|PASS}_FILE > DATA_SOURCE_{USER|PASS}
1564-
func getDataSources() []string {
1564+
func getDataSources() ([]string, error) {
15651565
var dsn = os.Getenv("DATA_SOURCE_NAME")
1566-
if len(dsn) == 0 {
1567-
var user string
1568-
var pass string
1569-
var uri string
1566+
if len(dsn) != 0 {
1567+
return strings.Split(dsn, ","), nil
1568+
}
15701569

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-
}
1570+
var user, pass, uri string
15801571

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")
1572+
dataSourceUserFile := os.Getenv("DATA_SOURCE_USER_FILE")
1573+
if len(dataSourceUserFile) != 0 {
1574+
fileContents, err := ioutil.ReadFile(dataSourceUserFile)
1575+
if err != nil {
1576+
return nil, fmt.Errorf("failed loading data source user file %s: %s", dataSourceUserFile, err.Error())
15891577
}
1578+
user = strings.TrimSpace(string(fileContents))
1579+
} else {
1580+
user = os.Getenv("DATA_SOURCE_USER")
1581+
}
15901582

1591-
ui := url.UserPassword(user, pass).String()
1583+
dataSourcePassFile := os.Getenv("DATA_SOURCE_PASS_FILE")
1584+
if len(dataSourcePassFile) != 0 {
1585+
fileContents, err := ioutil.ReadFile(dataSourcePassFile)
1586+
if err != nil {
1587+
return nil, fmt.Errorf("failed loading data source pass file %s: %s", dataSourcePassFile, err.Error())
1588+
}
1589+
pass = strings.TrimSpace(string(fileContents))
1590+
} else {
1591+
pass = os.Getenv("DATA_SOURCE_PASS")
1592+
}
15921593

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")
1594+
ui := url.UserPassword(user, pass).String()
1595+
dataSrouceURIFile := os.Getenv("DATA_SOURCE_URI_FILE")
1596+
if len(dataSrouceURIFile) != 0 {
1597+
fileContents, err := ioutil.ReadFile(dataSrouceURIFile)
1598+
if err != nil {
1599+
return nil, fmt.Errorf("failed loading data source URI file %s: %s", dataSrouceURIFile, err.Error())
16011600
}
1601+
uri = strings.TrimSpace(string(fileContents))
1602+
} else {
1603+
uri = os.Getenv("DATA_SOURCE_URI")
1604+
}
16021605

1603-
dsn = "postgresql://" + ui + "@" + uri
1606+
dsn = "postgresql://" + ui + "@" + uri
16041607

1605-
return []string{dsn}
1606-
}
1607-
return strings.Split(dsn, ",")
1608+
return []string{dsn}, nil
16081609
}
16091610

16101611
func contains(a []string, x string) bool {
@@ -1637,19 +1638,25 @@ func main() {
16371638
return
16381639
}
16391640

1640-
dsn := getDataSources()
1641+
dsn, err := getDataSources()
1642+
if err != nil {
1643+
log.Fatalf("failed reading data sources: %s", err.Error())
1644+
}
1645+
16411646
if len(dsn) == 0 {
16421647
log.Fatal("couldn't find environment variables describing the datasource to use")
16431648
}
16441649

1645-
exporter := NewExporter(dsn,
1650+
opts := []ExporterOpt{
16461651
DisableDefaultMetrics(*disableDefaultMetrics),
16471652
DisableSettingsMetrics(*disableSettingsMetrics),
16481653
AutoDiscoverDatabases(*autoDiscoverDatabases),
16491654
WithUserQueriesPath(*queriesPath),
16501655
WithConstantLabels(*constantLabelsList),
16511656
ExcludeDatabases(*excludeDatabases),
1652-
)
1657+
}
1658+
1659+
exporter := NewExporter(dsn, opts...)
16531660
defer func() {
16541661
exporter.servers.Close()
16551662
}()

0 commit comments

Comments
 (0)