diff --git a/postgres_exporter.go b/postgres_exporter.go index 4ef7c612..4940b54b 100644 --- a/postgres_exporter.go +++ b/postgres_exporter.go @@ -2,25 +2,24 @@ package main import ( "database/sql" + "errors" "flag" "fmt" "io/ioutil" "math" "net/http" "os" - "strconv" - "time" "regexp" - "errors" + "strconv" "sync" + "time" "gopkg.in/yaml.v2" + "github.com/blang/semver" _ "github.com/lib/pq" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" - "github.com/blang/semver" - ) var Version string = "0.0.1" @@ -116,10 +115,10 @@ func parseVersion(versionString string) (semver.Version, error) { // User-friendly representation of a prometheus descriptor map type ColumnMapping struct { - usage ColumnUsage `yaml:"usage"` - description string `yaml:"description"` - mapping map[string]float64 `yaml:"metric_mapping"` // Optional column mapping for MAPPEDMETRIC - supportedVersions semver.Range `yaml:"pg_version"` // Semantic version ranges which are supported. Unsupported columns are not queried (internally converted to DISCARD). + usage ColumnUsage `yaml:"usage"` + description string `yaml:"description"` + mapping map[string]float64 `yaml:"metric_mapping"` // Optional column mapping for MAPPEDMETRIC + supportedVersions semver.Range `yaml:"pg_version"` // Semantic version ranges which are supported. Unsupported columns are not queried (internally converted to DISCARD). } func (this *ColumnMapping) UnmarshalYAML(unmarshal func(interface{}) error) error { @@ -232,7 +231,7 @@ var metricMaps = map[string]map[string]ColumnMapping{ "count": {GAUGE, "Number of locks", nil, nil}, }, "pg_stat_replication": map[string]ColumnMapping{ - "procpid": {DISCARD, "Process ID of a WAL sender process", nil, semver.MustParseRange("<9.2.0")}, + "procpid": {DISCARD, "Process ID of a WAL sender process", nil, semver.MustParseRange("<9.2.0")}, "pid": {DISCARD, "Process ID of a WAL sender process", nil, semver.MustParseRange(">=9.2.0")}, "usesysid": {DISCARD, "OID of the user logged into this WAL sender process", nil, nil}, "usename": {DISCARD, "Name of the user logged into this WAL sender process", nil, nil}, @@ -276,7 +275,7 @@ var metricMaps = map[string]map[string]ColumnMapping{ // the semver matching we do for columns. type OverrideQuery struct { versionRange semver.Range - query string + query string } // Overriding queries for namespaces above. @@ -358,7 +357,6 @@ var queryOverrides = map[string][]OverrideQuery{ }, // No query is applicable for 9.1 that gives any sensible data. }, - } // Convert the query override file to the version-specific query override file @@ -509,7 +507,7 @@ func makeDescMap(pgVersion semver.Version, metricMaps map[string]map[string]Colu // Check column version compatibility for the current map // Force to discard if not compatible. if columnMapping.supportedVersions != nil { - if columnMapping.supportedVersions(pgVersion) { + if !columnMapping.supportedVersions(pgVersion) { thisMap[columnName] = MetricMap{ discard: true, conversion: func(in interface{}) (float64, bool) { @@ -683,26 +681,26 @@ func dbToString(t interface{}) (string, bool) { // Exporter collects Postgres metrics. It implements prometheus.Collector. type Exporter struct { dsn string - userQueriesPath string + userQueriesPath string duration, error prometheus.Gauge totalScrapes prometheus.Counter // Last version used to calculate metric map. If mismatch on scrape, // then maps are recalculated. - lastMapVersion semver.Version + lastMapVersion semver.Version // Currently active variable map - variableMap map[string]MetricMapNamespace + variableMap map[string]MetricMapNamespace // Currently active metric map - metricMap map[string]MetricMapNamespace + metricMap map[string]MetricMapNamespace // Currently active query overrides - queryOverrides map[string]string - mappingMtx sync.RWMutex + queryOverrides map[string]string + mappingMtx sync.RWMutex } // NewExporter returns a new PostgreSQL exporter for the provided DSN. func NewExporter(dsn string, userQueriesPath string) *Exporter { return &Exporter{ - dsn: dsn, + dsn: dsn, userQueriesPath: userQueriesPath, duration: prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: namespace, @@ -722,8 +720,8 @@ func NewExporter(dsn string, userQueriesPath string) *Exporter { Name: "last_scrape_error", Help: "Whether the last scrape of metrics from PostgreSQL resulted in an error (1 for error, 0 for success).", }), - variableMap: nil, - metricMap: nil, + variableMap: nil, + metricMap: nil, queryOverrides: nil, } } @@ -948,7 +946,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, db *sql.DB) err e.lastMapVersion = semanticVersion if e.userQueriesPath != "" { - if err := addQueries(e.userQueriesPath, semanticVersion, e.metricMap, e.queryOverrides) ; err != nil { + if err := addQueries(e.userQueriesPath, semanticVersion, e.metricMap, e.queryOverrides); err != nil { log.Errorln("Failed to reload user queries:", e.userQueriesPath, err) } }