mirror of
https://github.com/prometheus-community/postgres_exporter
synced 2025-04-22 15:05:27 +00:00
104 lines
2.9 KiB
Go
104 lines
2.9 KiB
Go
package metricmaps
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/blang/semver"
|
|
)
|
|
|
|
// ColumnUsage should be one of several enum values which describe how a
|
|
// queried row is to be converted to a Prometheus metric.
|
|
type ColumnUsage int
|
|
|
|
// nolint: golint
|
|
const (
|
|
DISCARD ColumnUsage = iota // Ignore this column
|
|
LABEL ColumnUsage = iota // Use this column as a label
|
|
COUNTER ColumnUsage = iota // Use this column as a counter
|
|
GAUGE ColumnUsage = iota // Use this column as a gauge
|
|
MAPPEDMETRIC ColumnUsage = iota // Use this column with the supplied mapping of text values
|
|
DURATION ColumnUsage = iota // This column should be interpreted as a text duration (and converted to milliseconds)
|
|
)
|
|
|
|
// UnmarshalYAML implements the yaml.Unmarshaller interface.
|
|
func (cu *ColumnUsage) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
|
var value string
|
|
if err := unmarshal(&value); err != nil {
|
|
return err
|
|
}
|
|
|
|
columnUsage, err := StringToColumnUsage(value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*cu = columnUsage
|
|
return nil
|
|
}
|
|
|
|
// StringToColumnUsage converts a string to the corresponding ColumnUsage
|
|
func StringToColumnUsage(s string) (ColumnUsage, error) {
|
|
var u ColumnUsage
|
|
var err error
|
|
switch s {
|
|
case "DISCARD":
|
|
u = DISCARD
|
|
|
|
case "LABEL":
|
|
u = LABEL
|
|
|
|
case "COUNTER":
|
|
u = COUNTER
|
|
|
|
case "GAUGE":
|
|
u = GAUGE
|
|
|
|
case "MAPPEDMETRIC":
|
|
u = MAPPEDMETRIC
|
|
|
|
case "DURATION":
|
|
u = DURATION
|
|
|
|
default:
|
|
err = fmt.Errorf("wrong ColumnUsage given : %s", s)
|
|
}
|
|
|
|
return u, err
|
|
}
|
|
|
|
// ColumnMapping is the 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).
|
|
}
|
|
|
|
// UnmarshalYAML implements yaml.Unmarshaller
|
|
func (cm *ColumnMapping) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
|
type plain ColumnMapping
|
|
return unmarshal((*plain)(cm))
|
|
}
|
|
|
|
|
|
// nolint: golint
|
|
type Mapping map[string]MappingOptions
|
|
|
|
// nolint: golint
|
|
type UserQuery struct {
|
|
Query string `yaml:"query"`
|
|
Metrics []Mapping `yaml:"metrics"`
|
|
Master bool `yaml:"master"` // Querying only for master database
|
|
CacheSeconds uint64 `yaml:"cache_seconds"` // Number of seconds to cache the namespace result metrics for.
|
|
}
|
|
|
|
// nolint: golint
|
|
type UserQueries map[string]UserQuery
|
|
|
|
// OverrideQuery are run in-place of simple namespace look ups, and provide
|
|
// advanced functionality. But they have a tendency to postgres version specific.
|
|
// There aren't too many versions, so we simply store customized versions using
|
|
// the semver matching we do for columns.
|
|
type OverrideQuery struct {
|
|
VersionRange semver.Range
|
|
Query string
|
|
} |