From 27d2a6bdd4da381a1c7b59668d8c5a0e2c3f7931 Mon Sep 17 00:00:00 2001 From: sfalkon Date: Wed, 9 Oct 2019 07:46:57 +0300 Subject: [PATCH 1/4] Exeption current_database from select db names --- cmd/postgres_exporter/postgres_exporter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/postgres_exporter/postgres_exporter.go b/cmd/postgres_exporter/postgres_exporter.go index 3522f7abc..55434b835 100644 --- a/cmd/postgres_exporter/postgres_exporter.go +++ b/cmd/postgres_exporter/postgres_exporter.go @@ -1087,7 +1087,7 @@ func newDesc(subsystem, name, help string, labels prometheus.Labels) *prometheus } func queryDatabases(server *Server) ([]string, error) { - rows, err := server.db.Query("SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false") // nolint: safesql + rows, err := server.db.Query("SELECT datname FROM pg_database WHERE datallowconn = true AND datistemplate = false AND datname != current_database()") // nolint: safesql if err != nil { return nil, fmt.Errorf("Error retrieving databases: %v", err) } From 75a90a9fa4a2f5cc235d49e17a2d8c0a904cdd11 Mon Sep 17 00:00:00 2001 From: sfalkon Date: Thu, 10 Oct 2019 19:27:34 +0300 Subject: [PATCH 2/4] add first database as master --- cmd/postgres_exporter/postgres_exporter.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cmd/postgres_exporter/postgres_exporter.go b/cmd/postgres_exporter/postgres_exporter.go index 55434b835..93d783b14 100644 --- a/cmd/postgres_exporter/postgres_exporter.go +++ b/cmd/postgres_exporter/postgres_exporter.go @@ -748,6 +748,7 @@ func loggableDSN(dsn string) string { type Server struct { db *sql.DB labels prometheus.Labels + master bool // Last version used to calculate metric map. If mismatch on scrape, // then maps are recalculated. @@ -788,7 +789,8 @@ func NewServer(dsn string, opts ...ServerOpt) (*Server, error) { log.Infof("Established new database connection to %q.", fingerprint) s := &Server{ - db: db, + db: db, + master: false, labels: prometheus.Labels{ serverLabelName: fingerprint, }, @@ -829,7 +831,7 @@ func (s *Server) Scrape(ch chan<- prometheus.Metric, disableSettingsMetrics bool var err error - if !disableSettingsMetrics { + if !disableSettingsMetrics && s.master { if err = querySettings(ch, s); err != nil { err = fmt.Errorf("error retrieving settings: %s", err) } @@ -1231,7 +1233,7 @@ func queryNamespaceMappings(ch chan<- prometheus.Metric, server *Server) map[str // Check and update the exporters query maps if the version has changed. func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server) error { - log.Debugf("Querying Postgres Version on %q", server) + versionRow := server.db.QueryRow("SELECT version();") var versionString string err := versionRow.Scan(&versionString) @@ -1251,7 +1253,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server) log.Infof("Semantic Version Changed on %q: %s -> %s", server, server.lastMapVersion, semanticVersion) server.mappingMtx.Lock() - if e.disableDefaultMetrics { + if e.disableDefaultMetrics || !server.master { server.metricMap = make(map[string]MetricMapNamespace) server.queryOverrides = make(map[string]string) } else { @@ -1290,7 +1292,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server) versionDesc := prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, staticLabelName), "Version string as reported by postgres", []string{"version", "short_version"}, server.labels) - if !e.disableDefaultMetrics { + if !e.disableDefaultMetrics && server.master { ch <- prometheus.MustNewConstMetric(versionDesc, prometheus.UntypedValue, 1, versionString, semanticVersion.String()) } @@ -1355,6 +1357,8 @@ func (e *Exporter) discoverDatabaseDSNs() []string { continue } + server.master = true + databaseNames, err := queryDatabases(server) if err != nil { log.Errorf("Error querying databases (%s): %v", loggableDSN(dsn), err) From 95f7c00097733ae071cf734311b987113a2e5ae5 Mon Sep 17 00:00:00 2001 From: sfalkon Date: Fri, 11 Oct 2019 18:17:04 +0300 Subject: [PATCH 3/4] fix: default metric is not loaded if set autodiscovery --- cmd/postgres_exporter/postgres_exporter.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/postgres_exporter/postgres_exporter.go b/cmd/postgres_exporter/postgres_exporter.go index 93d783b14..d9b0a1e94 100644 --- a/cmd/postgres_exporter/postgres_exporter.go +++ b/cmd/postgres_exporter/postgres_exporter.go @@ -831,7 +831,7 @@ func (s *Server) Scrape(ch chan<- prometheus.Metric, disableSettingsMetrics bool var err error - if !disableSettingsMetrics && s.master { + if (!disableSettingsMetrics && !*autoDiscoverDatabases) || (!disableSettingsMetrics && *autoDiscoverDatabases && s.master) { if err = querySettings(ch, s); err != nil { err = fmt.Errorf("error retrieving settings: %s", err) } @@ -1233,7 +1233,7 @@ func queryNamespaceMappings(ch chan<- prometheus.Metric, server *Server) map[str // Check and update the exporters query maps if the version has changed. func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server) error { - + log.Debugf("Querying Postgres Version on %q", server) versionRow := server.db.QueryRow("SELECT version();") var versionString string err := versionRow.Scan(&versionString) @@ -1253,7 +1253,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server) log.Infof("Semantic Version Changed on %q: %s -> %s", server, server.lastMapVersion, semanticVersion) server.mappingMtx.Lock() - if e.disableDefaultMetrics || !server.master { + if e.disableDefaultMetrics || (!e.disableDefaultMetrics && e.autoDiscoverDatabases && !server.master) { server.metricMap = make(map[string]MetricMapNamespace) server.queryOverrides = make(map[string]string) } else { From ed0250778ccb9522c480e8e50a0366ddc62d8e6b Mon Sep 17 00:00:00 2001 From: sfalkon Date: Fri, 11 Oct 2019 18:46:18 +0300 Subject: [PATCH 4/4] Fix condition --- cmd/postgres_exporter/postgres_exporter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/postgres_exporter/postgres_exporter.go b/cmd/postgres_exporter/postgres_exporter.go index d9b0a1e94..750e35c08 100644 --- a/cmd/postgres_exporter/postgres_exporter.go +++ b/cmd/postgres_exporter/postgres_exporter.go @@ -1292,7 +1292,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server) versionDesc := prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, staticLabelName), "Version string as reported by postgres", []string{"version", "short_version"}, server.labels) - if !e.disableDefaultMetrics && server.master { + if !e.disableDefaultMetrics && (server.master && e.autoDiscoverDatabases) { ch <- prometheus.MustNewConstMetric(versionDesc, prometheus.UntypedValue, 1, versionString, semanticVersion.String()) }