mirror of
https://github.com/prometheus-community/postgres_exporter
synced 2025-04-07 09:41:52 +00:00
Fix some autodiscovery problems (#314)
* Fix problem: If autodiscovery is enable exporter make connection twice to database from connetion string (exclude current database from SQL-query); * Fix problem: don't get default metrics and settings if autodiscovery is enabled. Now you can use --disable-default-metrics and --disable-settings-metrics with --auto-discover-databases and
This commit is contained in:
parent
ececfdeab7
commit
1385b4f658
@ -749,6 +749,7 @@ func loggableDSN(dsn string) string {
|
|||||||
type Server struct {
|
type Server struct {
|
||||||
db *sql.DB
|
db *sql.DB
|
||||||
labels prometheus.Labels
|
labels prometheus.Labels
|
||||||
|
master bool
|
||||||
|
|
||||||
// Last version used to calculate metric map. If mismatch on scrape,
|
// Last version used to calculate metric map. If mismatch on scrape,
|
||||||
// then maps are recalculated.
|
// then maps are recalculated.
|
||||||
@ -789,7 +790,8 @@ func NewServer(dsn string, opts ...ServerOpt) (*Server, error) {
|
|||||||
log.Infof("Established new database connection to %q.", fingerprint)
|
log.Infof("Established new database connection to %q.", fingerprint)
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
db: db,
|
db: db,
|
||||||
|
master: false,
|
||||||
labels: prometheus.Labels{
|
labels: prometheus.Labels{
|
||||||
serverLabelName: fingerprint,
|
serverLabelName: fingerprint,
|
||||||
},
|
},
|
||||||
@ -830,7 +832,7 @@ func (s *Server) Scrape(ch chan<- prometheus.Metric, disableSettingsMetrics bool
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if !disableSettingsMetrics {
|
if (!disableSettingsMetrics && !*autoDiscoverDatabases) || (!disableSettingsMetrics && *autoDiscoverDatabases && s.master) {
|
||||||
if err = querySettings(ch, s); err != nil {
|
if err = querySettings(ch, s); err != nil {
|
||||||
err = fmt.Errorf("error retrieving settings: %s", err)
|
err = fmt.Errorf("error retrieving settings: %s", err)
|
||||||
}
|
}
|
||||||
@ -1100,7 +1102,7 @@ func newDesc(subsystem, name, help string, labels prometheus.Labels) *prometheus
|
|||||||
}
|
}
|
||||||
|
|
||||||
func queryDatabases(server *Server) ([]string, error) {
|
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 {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error retrieving databases: %v", err)
|
return nil, fmt.Errorf("Error retrieving databases: %v", err)
|
||||||
}
|
}
|
||||||
@ -1264,7 +1266,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server)
|
|||||||
log.Infof("Semantic Version Changed on %q: %s -> %s", server, server.lastMapVersion, semanticVersion)
|
log.Infof("Semantic Version Changed on %q: %s -> %s", server, server.lastMapVersion, semanticVersion)
|
||||||
server.mappingMtx.Lock()
|
server.mappingMtx.Lock()
|
||||||
|
|
||||||
if e.disableDefaultMetrics {
|
if e.disableDefaultMetrics || (!e.disableDefaultMetrics && e.autoDiscoverDatabases && !server.master) {
|
||||||
server.metricMap = make(map[string]MetricMapNamespace)
|
server.metricMap = make(map[string]MetricMapNamespace)
|
||||||
server.queryOverrides = make(map[string]string)
|
server.queryOverrides = make(map[string]string)
|
||||||
} else {
|
} else {
|
||||||
@ -1303,7 +1305,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server)
|
|||||||
versionDesc := prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, staticLabelName),
|
versionDesc := prometheus.NewDesc(fmt.Sprintf("%s_%s", namespace, staticLabelName),
|
||||||
"Version string as reported by postgres", []string{"version", "short_version"}, server.labels)
|
"Version string as reported by postgres", []string{"version", "short_version"}, server.labels)
|
||||||
|
|
||||||
if !e.disableDefaultMetrics {
|
if !e.disableDefaultMetrics && (server.master && e.autoDiscoverDatabases) {
|
||||||
ch <- prometheus.MustNewConstMetric(versionDesc,
|
ch <- prometheus.MustNewConstMetric(versionDesc,
|
||||||
prometheus.UntypedValue, 1, versionString, semanticVersion.String())
|
prometheus.UntypedValue, 1, versionString, semanticVersion.String())
|
||||||
}
|
}
|
||||||
@ -1368,6 +1370,8 @@ func (e *Exporter) discoverDatabaseDSNs() []string {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server.master = true
|
||||||
|
|
||||||
databaseNames, err := queryDatabases(server)
|
databaseNames, err := queryDatabases(server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Error querying databases (%s): %v", loggableDSN(dsn), err)
|
log.Errorf("Error querying databases (%s): %v", loggableDSN(dsn), err)
|
||||||
|
Loading…
Reference in New Issue
Block a user