Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 18 additions & 27 deletions cmd/postgres_exporter/main.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2021 The Prometheus Authors
// Copyright The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
Expand All @@ -23,6 +23,7 @@ import (
"github.com/alecthomas/kingpin/v2"
"github.com/prometheus-community/postgres_exporter/collector"
"github.com/prometheus-community/postgres_exporter/config"
"github.com/prometheus-community/postgres_exporter/exporter"
"github.com/prometheus/client_golang/prometheus"
versioncollector "github.com/prometheus/client_golang/prometheus/collectors/version"
"github.com/prometheus/client_golang/prometheus/promhttp"
Expand Down Expand Up @@ -54,20 +55,8 @@ var (
logger = promslog.NewNopLogger()
)

// Metric name parts.
const (
// Namespace for all metrics.
namespace = "pg"
// Subsystems.
exporter = "exporter"
// The name of the exporter.
exporterName = "postgres_exporter"
// Metric label used for static string data thats handy to send to Prometheus
// e.g. version
staticLabelName = "static"
// Metric label used for server identification.
serverLabelName = "server"
)
// The name of the exporter.
const exporterName = "postgres_exporter"

func main() {
kingpin.Version(version.Print(exporterName))
Expand All @@ -78,7 +67,7 @@ func main() {
logger = promslog.New(promslogConfig)

if *onlyDumpMaps {
dumpMaps()
exporter.DumpMaps()
return
}

Expand All @@ -87,7 +76,7 @@ func main() {
logger.Warn("Error loading config", "err", err)
}

dsns, err := getDataSources()
dsns, err := exporter.GetDataSources()
if err != nil {
logger.Error("Failed reading data sources", "err", err.Error())
os.Exit(1)
Expand All @@ -108,19 +97,21 @@ func main() {
logger.Warn("Constant labels on all metrics is DEPRECATED")
}

opts := []ExporterOpt{
DisableDefaultMetrics(*disableDefaultMetrics),
DisableSettingsMetrics(*disableSettingsMetrics),
AutoDiscoverDatabases(*autoDiscoverDatabases),
WithUserQueriesPath(*queriesPath),
WithConstantLabels(*constantLabelsList),
ExcludeDatabases(excludedDatabases),
IncludeDatabases(*includeDatabases),
opts := []exporter.ExporterOpt{
exporter.DisableDefaultMetrics(*disableDefaultMetrics),
exporter.DisableSettingsMetrics(*disableSettingsMetrics),
exporter.AutoDiscoverDatabases(*autoDiscoverDatabases),
exporter.WithUserQueriesPath(*queriesPath),
exporter.WithConstantLabels(*constantLabelsList),
exporter.ExcludeDatabases(excludedDatabases),
exporter.IncludeDatabases(*includeDatabases),
exporter.WithMetricPrefix(*metricPrefix),
exporter.WithLogger(logger),
}

exporter := NewExporter(dsns, opts...)
exporter := exporter.NewExporter(dsns, opts...)
defer func() {
exporter.servers.Close()
exporter.CloseServers()
}()

prometheus.MustRegister(versioncollector.NewCollector(exporterName))
Expand Down
23 changes: 13 additions & 10 deletions cmd/postgres_exporter/probe.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (

"github.com/prometheus-community/postgres_exporter/collector"
"github.com/prometheus-community/postgres_exporter/config"
"github.com/prometheus-community/postgres_exporter/exporter"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
Expand Down Expand Up @@ -64,20 +65,22 @@ func handleProbe(logger *slog.Logger, excludeDatabases []string) http.HandlerFun

registry := prometheus.NewRegistry()

opts := []ExporterOpt{
DisableDefaultMetrics(*disableDefaultMetrics),
DisableSettingsMetrics(*disableSettingsMetrics),
AutoDiscoverDatabases(*autoDiscoverDatabases),
WithUserQueriesPath(*queriesPath),
WithConstantLabels(*constantLabelsList),
ExcludeDatabases(excludeDatabases),
IncludeDatabases(*includeDatabases),
opts := []exporter.ExporterOpt{
exporter.DisableDefaultMetrics(*disableDefaultMetrics),
exporter.DisableSettingsMetrics(*disableSettingsMetrics),
exporter.AutoDiscoverDatabases(*autoDiscoverDatabases),
exporter.WithUserQueriesPath(*queriesPath),
exporter.WithConstantLabels(*constantLabelsList),
exporter.ExcludeDatabases(excludeDatabases),
exporter.IncludeDatabases(*includeDatabases),
exporter.WithLogger(logger),
exporter.WithMetricPrefix(*metricPrefix),
}

dsns := []string{dsn.GetConnectionString()}
exporter := NewExporter(dsns, opts...)
exporter := exporter.NewExporter(dsns, opts...)
defer func() {
exporter.servers.Close()
exporter.CloseServers()
}()
registry.MustRegister(exporter)

Expand Down
14 changes: 7 additions & 7 deletions cmd/postgres_exporter/datasource.go → exporter/datasource.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package main
package exporter

import (
"fmt"
Expand Down Expand Up @@ -39,19 +39,19 @@ func (e *Exporter) discoverDatabaseDSNs() []string {
var err error
dsnURI, err = url.Parse(dsn)
if err != nil {
logger.Error("Unable to parse DSN as URI", "dsn", loggableDSN(dsn), "err", err)
e.logger.Error("Unable to parse DSN as URI", "dsn", loggableDSN(dsn), "err", err)
continue
}
} else if connstringRe.MatchString(dsn) {
dsnConnstring = dsn
} else {
logger.Error("Unable to parse DSN as either URI or connstring", "dsn", loggableDSN(dsn))
e.logger.Error("Unable to parse DSN as either URI or connstring", "dsn", loggableDSN(dsn))
continue
}

server, err := e.servers.GetServer(dsn)
if err != nil {
logger.Error("Error opening connection to database", "dsn", loggableDSN(dsn), "err", err)
e.logger.Error("Error opening connection to database", "dsn", loggableDSN(dsn), "err", err)
continue
}
dsns[dsn] = struct{}{}
Expand All @@ -61,7 +61,7 @@ func (e *Exporter) discoverDatabaseDSNs() []string {

databaseNames, err := queryDatabases(server)
if err != nil {
logger.Error("Error querying databases", "dsn", loggableDSN(dsn), "err", err)
e.logger.Error("Error querying databases", "dsn", loggableDSN(dsn), "err", err)
continue
}
for _, databaseName := range databaseNames {
Expand Down Expand Up @@ -109,7 +109,7 @@ func (e *Exporter) scrapeDSN(ch chan<- prometheus.Metric, dsn string) error {

// Check if map versions need to be updated
if err := e.checkMapVersions(ch, server); err != nil {
logger.Warn("Proceeding with outdated query maps, as the Postgres version could not be determined", "err", err)
e.logger.Warn("Proceeding with outdated query maps, as the Postgres version could not be determined", "err", err)
}

return server.Scrape(ch, e.disableSettingsMetrics)
Expand All @@ -119,7 +119,7 @@ func (e *Exporter) scrapeDSN(ch chan<- prometheus.Metric, dsn string) error {
// DATA_SOURCE_NAME always wins so we do not break older versions
// reading secrets from files wins over secrets in environment variables
// DATA_SOURCE_NAME > DATA_SOURCE_{USER|PASS}_FILE > DATA_SOURCE_{USER|PASS}
func getDataSources() ([]string, error) {
func GetDataSources() ([]string, error) {
var dsn = os.Getenv("DATA_SOURCE_NAME")
if len(dsn) != 0 {
return strings.Split(dsn, ","), nil
Expand Down
20 changes: 10 additions & 10 deletions cmd/postgres_exporter/namespace.go → exporter/namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package main
package exporter

import (
"database/sql"
Expand Down Expand Up @@ -129,7 +129,7 @@ func queryNamespaceMapping(server *Server, namespace string, mapping MetricMapNa
nonfatalErrors = append(nonfatalErrors, errors.New(fmt.Sprintln("Missing column: ", namespace, columnName+"_sum")))
continue
}
sum, ok := dbToFloat64(columnData[idx])
sum, ok := dbToFloat64(columnData[idx], server.logger)
if !ok {
nonfatalErrors = append(nonfatalErrors, errors.New(fmt.Sprintln("Unexpected error parsing column: ", namespace, columnName+"_sum", columnData[idx])))
continue
Expand All @@ -140,7 +140,7 @@ func queryNamespaceMapping(server *Server, namespace string, mapping MetricMapNa
nonfatalErrors = append(nonfatalErrors, errors.New(fmt.Sprintln("Missing column: ", namespace, columnName+"_count")))
continue
}
count, ok := dbToUint64(columnData[idx])
count, ok := dbToUint64(columnData[idx], server.logger)
if !ok {
nonfatalErrors = append(nonfatalErrors, errors.New(fmt.Sprintln("Unexpected error parsing column: ", namespace, columnName+"_count", columnData[idx])))
continue
Expand All @@ -152,7 +152,7 @@ func queryNamespaceMapping(server *Server, namespace string, mapping MetricMapNa
labels...,
)
} else {
value, ok := dbToFloat64(columnData[idx])
value, ok := dbToFloat64(columnData[idx], server.logger)
if !ok {
nonfatalErrors = append(nonfatalErrors, errors.New(fmt.Sprintln("Unexpected error parsing column: ", namespace, columnName, columnData[idx])))
continue
Expand All @@ -167,7 +167,7 @@ func queryNamespaceMapping(server *Server, namespace string, mapping MetricMapNa

// Its not an error to fail here, since the values are
// unexpected anyway.
value, ok := dbToFloat64(columnData[idx])
value, ok := dbToFloat64(columnData[idx], server.logger)
if !ok {
nonfatalErrors = append(nonfatalErrors, errors.New(fmt.Sprintln("Unparseable column type - discarding: ", namespace, columnName, err)))
continue
Expand All @@ -189,10 +189,10 @@ func queryNamespaceMappings(ch chan<- prometheus.Metric, server *Server) map[str
scrapeStart := time.Now()

for namespace, mapping := range server.metricMap {
logger.Debug("Querying namespace", "namespace", namespace)
server.logger.Debug("Querying namespace", "namespace", namespace)

if mapping.master && !server.master {
logger.Debug("Query skipped...")
server.logger.Debug("Query skipped...")
continue
}

Expand All @@ -201,7 +201,7 @@ func queryNamespaceMappings(ch chan<- prometheus.Metric, server *Server) map[str
serVersion, _ := semver.Parse(server.lastMapVersion.String())
runServerRange, _ := semver.ParseRange(server.runonserver)
if !runServerRange(serVersion) {
logger.Debug("Query skipped for this database version", "version", server.lastMapVersion.String(), "target_version", server.runonserver)
server.logger.Debug("Query skipped for this database version", "version", server.lastMapVersion.String(), "target_version", server.runonserver)
continue
}
}
Expand Down Expand Up @@ -232,12 +232,12 @@ func queryNamespaceMappings(ch chan<- prometheus.Metric, server *Server) map[str
// Serious error - a namespace disappeared
if err != nil {
namespaceErrors[namespace] = err
logger.Info("error finding namespace", "err", err)
server.logger.Info("error finding namespace", "err", err)
}
// Non-serious errors - likely version or parsing problems.
if len(nonFatalErrors) > 0 {
for _, err := range nonFatalErrors {
logger.Info("error querying namespace", "err", err)
server.logger.Info("error querying namespace", "err", err)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package main
package exporter

import (
"fmt"
Expand All @@ -31,7 +31,7 @@ var (

// Query the pg_settings view containing runtime variables
func querySettings(ch chan<- prometheus.Metric, server *Server) error {
logger.Debug("Querying pg_setting view", "server", server)
server.logger.Debug("Querying pg_setting view", "server", server)

// pg_settings docs: https://www.postgresql.org/docs/current/static/view-pg-settings.html
//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

//go:build !integration

package main
package exporter

import (
"github.com/prometheus/client_golang/prometheus"
Expand Down
Loading
Loading