Refactor collectors - part 2
parent
58a99510d2
commit
ed7a10dde2
|
@ -31,4 +31,15 @@ type NodeCollectorConfig struct {
|
||||||
NTP NTPConfig
|
NTP NTPConfig
|
||||||
Perf PerfConfig
|
Perf PerfConfig
|
||||||
PowerSupplyClass PowerSupplyClassConfig
|
PowerSupplyClass PowerSupplyClassConfig
|
||||||
|
Qdisc QdiscConfig
|
||||||
|
Rapl RaplConfig
|
||||||
|
Runit RunitConfig
|
||||||
|
Stat StatConfig
|
||||||
|
Supervisord SupervisordConfig
|
||||||
|
Sysctl SysctlConfig
|
||||||
|
Systemd SystemdConfig
|
||||||
|
Tapestats TapestatsConfig
|
||||||
|
TextFile TextFileConfig
|
||||||
|
VmStat VmStatConfig
|
||||||
|
Wifi WifiConfig
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,6 @@ type logindSeatEntry struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("logind", defaultDisabled, NewLogindCollector)
|
|
||||||
registerCollector("logind", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
registerCollector("logind", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
return NewLogindCollector(logger)
|
return NewLogindCollector(logger)
|
||||||
})
|
})
|
||||||
|
|
|
@ -22,7 +22,6 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/ema/qdisc"
|
"github.com/ema/qdisc"
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -38,21 +37,25 @@ type qdiscStatCollector struct {
|
||||||
overlimits typedDesc
|
overlimits typedDesc
|
||||||
qlength typedDesc
|
qlength typedDesc
|
||||||
backlog typedDesc
|
backlog typedDesc
|
||||||
|
config QdiscConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
collectorQdisc = kingpin.Flag("collector.qdisc.fixtures", "test fixtures to use for qdisc collector end-to-end testing").Default("").String()
|
|
||||||
collectorQdiskDeviceInclude = kingpin.Flag("collector.qdisk.device-include", "Regexp of qdisk devices to include (mutually exclusive to device-exclude).").String()
|
|
||||||
collectorQdiskDeviceExclude = kingpin.Flag("collector.qdisk.device-exclude", "Regexp of qdisk devices to exclude (mutually exclusive to device-include).").String()
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("qdisc", defaultDisabled, NewQdiscStatCollector)
|
registerCollector("qdisc", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(QdiscConfig)
|
||||||
|
return NewQdiscStatCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type QdiscConfig struct {
|
||||||
|
Fixtures *string
|
||||||
|
DeviceInclude *string
|
||||||
|
DeviceExclude *string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewQdiscStatCollector returns a new Collector exposing queuing discipline statistics.
|
// NewQdiscStatCollector returns a new Collector exposing queuing discipline statistics.
|
||||||
func NewQdiscStatCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewQdiscStatCollector(config QdiscConfig, logger log.Logger) (Collector, error) {
|
||||||
if *collectorQdiskDeviceExclude != "" && *collectorQdiskDeviceInclude != "" {
|
if *config.DeviceExclude != "" && *config.DeviceInclude != "" {
|
||||||
return nil, fmt.Errorf("collector.qdisk.device-include and collector.qdisk.device-exclude are mutaly exclusive")
|
return nil, fmt.Errorf("collector.qdisk.device-include and collector.qdisk.device-exclude are mutaly exclusive")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +96,8 @@ func NewQdiscStatCollector(config NodeCollectorConfig, logger log.Logger) (Colle
|
||||||
[]string{"device", "kind"}, nil,
|
[]string{"device", "kind"}, nil,
|
||||||
), prometheus.GaugeValue},
|
), prometheus.GaugeValue},
|
||||||
logger: logger,
|
logger: logger,
|
||||||
deviceFilter: newDeviceFilter(*collectorQdiskDeviceExclude, *collectorQdiskDeviceExclude),
|
deviceFilter: newDeviceFilter(*config.DeviceExclude, *config.DeviceExclude),
|
||||||
|
config: config,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +117,7 @@ func (c *qdiscStatCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
var msgs []qdisc.QdiscInfo
|
var msgs []qdisc.QdiscInfo
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
fixtures := *collectorQdisc
|
fixtures := *c.config.Fixtures
|
||||||
|
|
||||||
if fixtures == "" {
|
if fixtures == "" {
|
||||||
msgs, err = qdisc.Get()
|
msgs, err = qdisc.Get()
|
||||||
|
|
|
@ -22,7 +22,6 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -36,18 +35,22 @@ type raplCollector struct {
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
|
|
||||||
joulesMetricDesc *prometheus.Desc
|
joulesMetricDesc *prometheus.Desc
|
||||||
|
config RaplConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector(raplCollectorSubsystem, defaultEnabled, NewRaplCollector)
|
registerCollector(raplCollectorSubsystem, defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(RaplConfig)
|
||||||
|
return NewRaplCollector(cfg, logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
type RaplConfig struct {
|
||||||
raplZoneLabel = kingpin.Flag("collector.rapl.enable-zone-label", "Enables service unit metric unit_start_time_seconds").Bool()
|
ZoneLabel *bool
|
||||||
)
|
}
|
||||||
|
|
||||||
// NewRaplCollector returns a new Collector exposing RAPL metrics.
|
// NewRaplCollector returns a new Collector exposing RAPL metrics.
|
||||||
func NewRaplCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewRaplCollector(config RaplConfig, logger log.Logger) (Collector, error) {
|
||||||
fs, err := sysfs.NewFS(*sysPath)
|
fs, err := sysfs.NewFS(*sysPath)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -64,6 +67,7 @@ func NewRaplCollector(config NodeCollectorConfig, logger log.Logger) (Collector,
|
||||||
fs: fs,
|
fs: fs,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
joulesMetricDesc: joulesMetricDesc,
|
joulesMetricDesc: joulesMetricDesc,
|
||||||
|
config: config,
|
||||||
}
|
}
|
||||||
return &collector, nil
|
return &collector, nil
|
||||||
}
|
}
|
||||||
|
@ -96,7 +100,7 @@ func (c *raplCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
||||||
joules := float64(microJoules) / 1000000.0
|
joules := float64(microJoules) / 1000000.0
|
||||||
|
|
||||||
if *raplZoneLabel {
|
if *c.config.ZoneLabel {
|
||||||
ch <- c.joulesMetricWithZoneLabel(rz, joules)
|
ch <- c.joulesMetricWithZoneLabel(rz, joules)
|
||||||
} else {
|
} else {
|
||||||
ch <- c.joulesMetric(rz, joules)
|
ch <- c.joulesMetric(rz, joules)
|
||||||
|
|
|
@ -17,29 +17,34 @@
|
||||||
package collector
|
package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
"github.com/prometheus-community/go-runit/runit"
|
"github.com/prometheus-community/go-runit/runit"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
var runitServiceDir = kingpin.Flag("collector.runit.servicedir", "Path to runit service directory.").Default("/etc/service").String()
|
|
||||||
|
|
||||||
type runitCollector struct {
|
type runitCollector struct {
|
||||||
state typedDesc
|
state typedDesc
|
||||||
stateDesired typedDesc
|
stateDesired typedDesc
|
||||||
stateNormal typedDesc
|
stateNormal typedDesc
|
||||||
stateTimestamp typedDesc
|
stateTimestamp typedDesc
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
|
config RunitConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("runit", defaultDisabled, NewRunitCollector)
|
registerCollector("runit", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(RunitConfig)
|
||||||
|
return NewRunitCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type RunitConfig struct {
|
||||||
|
ServiceDir *string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRunitCollector returns a new Collector exposing runit statistics.
|
// NewRunitCollector returns a new Collector exposing runit statistics.
|
||||||
func NewRunitCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewRunitCollector(config RunitConfig, logger log.Logger) (Collector, error) {
|
||||||
var (
|
var (
|
||||||
subsystem = "service"
|
subsystem = "service"
|
||||||
constLabels = prometheus.Labels{"supervisor": "runit"}
|
constLabels = prometheus.Labels{"supervisor": "runit"}
|
||||||
|
@ -70,11 +75,12 @@ func NewRunitCollector(config NodeCollectorConfig, logger log.Logger) (Collector
|
||||||
labelNames, constLabels,
|
labelNames, constLabels,
|
||||||
), prometheus.GaugeValue},
|
), prometheus.GaugeValue},
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
config: config,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *runitCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *runitCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
services, err := runit.GetServices(*runitServiceDir)
|
services, err := runit.GetServices(*c.config.ServiceDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewSchedstatCollector returns a new Collector exposing task scheduler statistics
|
// NewSchedstatCollector returns a new Collector exposing task scheduler statistics
|
||||||
func NewSchedstatCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSchedstatCollector(logger log.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||||
|
@ -68,7 +68,9 @@ type schedstatCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("schedstat", defaultEnabled, NewSchedstatCollector)
|
registerCollector("schedstat", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewSchedstatCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *schedstatCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *schedstatCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
|
|
@ -30,11 +30,13 @@ type selinuxCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("selinux", defaultEnabled, NewSelinuxCollector)
|
registerCollector("selinux", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewSelinuxCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSelinuxCollector returns a new Collector exposing SELinux statistics.
|
// NewSelinuxCollector returns a new Collector exposing SELinux statistics.
|
||||||
func NewSelinuxCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSelinuxCollector(logger log.Logger) (Collector, error) {
|
||||||
const subsystem = "selinux"
|
const subsystem = "selinux"
|
||||||
|
|
||||||
return &selinuxCollector{
|
return &selinuxCollector{
|
||||||
|
|
|
@ -32,10 +32,12 @@ type slabinfoCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("slabinfo", defaultDisabled, NewSlabinfoCollector)
|
registerCollector("slabinfo", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewSlabinfoCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSlabinfoCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSlabinfoCollector(logger log.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||||
|
|
|
@ -39,11 +39,13 @@ type sockStatCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector(sockStatSubsystem, defaultEnabled, NewSockStatCollector)
|
registerCollector(sockStatSubsystem, defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewSockStatCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSockStatCollector returns a new Collector exposing socket stats.
|
// NewSockStatCollector returns a new Collector exposing socket stats.
|
||||||
func NewSockStatCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSockStatCollector(logger log.Logger) (Collector, error) {
|
||||||
return &sockStatCollector{logger}, nil
|
return &sockStatCollector{logger}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ package collector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
|
@ -30,11 +31,13 @@ type softirqsCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("softirqs", defaultDisabled, NewSoftirqsCollector)
|
registerCollector("softirqs", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewSoftirqsCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSoftirqsCollector returns a new Collector exposing softirq stats.
|
// NewSoftirqsCollector returns a new Collector exposing softirq stats.
|
||||||
func NewSoftirqsCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSoftirqsCollector(logger log.Logger) (Collector, error) {
|
||||||
desc := typedDesc{prometheus.NewDesc(
|
desc := typedDesc{prometheus.NewDesc(
|
||||||
namespace+"_softirqs_functions_total",
|
namespace+"_softirqs_functions_total",
|
||||||
"Softirq counts per CPU.",
|
"Softirq counts per CPU.",
|
||||||
|
|
|
@ -42,11 +42,13 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("softnet", defaultEnabled, NewSoftnetCollector)
|
registerCollector("softnet", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewSoftnetCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSoftnetCollector returns a new Collector exposing softnet metrics.
|
// NewSoftnetCollector returns a new Collector exposing softnet metrics.
|
||||||
func NewSoftnetCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSoftnetCollector(logger log.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||||
|
|
|
@ -19,7 +19,6 @@ package collector
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
|
@ -35,16 +34,22 @@ type statCollector struct {
|
||||||
procsBlocked *prometheus.Desc
|
procsBlocked *prometheus.Desc
|
||||||
softIRQ *prometheus.Desc
|
softIRQ *prometheus.Desc
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
|
config StatConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
var statSoftirqFlag = kingpin.Flag("collector.stat.softirq", "Export softirq calls per vector").Default("false").Bool()
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("stat", defaultEnabled, NewStatCollector)
|
registerCollector("stat", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(StatConfig)
|
||||||
|
return NewStatCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type StatConfig struct {
|
||||||
|
Softirq *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewStatCollector returns a new Collector exposing kernel/system statistics.
|
// NewStatCollector returns a new Collector exposing kernel/system statistics.
|
||||||
func NewStatCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewStatCollector(config StatConfig, logger log.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||||
|
@ -87,6 +92,7 @@ func NewStatCollector(config NodeCollectorConfig, logger log.Logger) (Collector,
|
||||||
[]string{"vector"}, nil,
|
[]string{"vector"}, nil,
|
||||||
),
|
),
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
config: config,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +112,7 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
ch <- prometheus.MustNewConstMetric(c.procsRunning, prometheus.GaugeValue, float64(stats.ProcessesRunning))
|
ch <- prometheus.MustNewConstMetric(c.procsRunning, prometheus.GaugeValue, float64(stats.ProcessesRunning))
|
||||||
ch <- prometheus.MustNewConstMetric(c.procsBlocked, prometheus.GaugeValue, float64(stats.ProcessesBlocked))
|
ch <- prometheus.MustNewConstMetric(c.procsBlocked, prometheus.GaugeValue, float64(stats.ProcessesBlocked))
|
||||||
|
|
||||||
if *statSoftirqFlag {
|
if *c.config.Softirq {
|
||||||
si := stats.SoftIRQ
|
si := stats.SoftIRQ
|
||||||
|
|
||||||
for _, vec := range []struct {
|
for _, vec := range []struct {
|
||||||
|
|
|
@ -24,7 +24,6 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
"github.com/mattn/go-xmlrpc"
|
"github.com/mattn/go-xmlrpc"
|
||||||
|
@ -32,8 +31,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
supervisordURL = kingpin.Flag("collector.supervisord.url", "XML RPC endpoint.").Default("http://localhost:9001/RPC2").Envar("SUPERVISORD_URL").String()
|
xrpc *xmlrpc.Client
|
||||||
xrpc *xmlrpc.Client
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type supervisordCollector struct {
|
type supervisordCollector struct {
|
||||||
|
@ -45,17 +43,24 @@ type supervisordCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("supervisord", defaultDisabled, NewSupervisordCollector)
|
registerCollector("supervisord", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(SupervisordConfig)
|
||||||
|
return NewSupervisordCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type SupervisordConfig struct {
|
||||||
|
URL *string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSupervisordCollector returns a new Collector exposing supervisord statistics.
|
// NewSupervisordCollector returns a new Collector exposing supervisord statistics.
|
||||||
func NewSupervisordCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSupervisordCollector(config SupervisordConfig, logger log.Logger) (Collector, error) {
|
||||||
var (
|
var (
|
||||||
subsystem = "supervisord"
|
subsystem = "supervisord"
|
||||||
labelNames = []string{"name", "group"}
|
labelNames = []string{"name", "group"}
|
||||||
)
|
)
|
||||||
|
|
||||||
if u, err := url.Parse(*supervisordURL); err == nil && u.Scheme == "unix" {
|
if u, err := url.Parse(*config.URL); err == nil && u.Scheme == "unix" {
|
||||||
// Fake the URI scheme as http, since net/http.*Transport.roundTrip will complain
|
// Fake the URI scheme as http, since net/http.*Transport.roundTrip will complain
|
||||||
// about a non-http(s) transport.
|
// about a non-http(s) transport.
|
||||||
xrpc = xmlrpc.NewClient("http://unix/RPC2")
|
xrpc = xmlrpc.NewClient("http://unix/RPC2")
|
||||||
|
@ -66,7 +71,7 @@ func NewSupervisordCollector(config NodeCollectorConfig, logger log.Logger) (Col
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
xrpc = xmlrpc.NewClient(*supervisordURL)
|
xrpc = xmlrpc.NewClient(*config.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
level.Warn(logger).Log("msg", "This collector is deprecated and will be removed in the next major version release.")
|
level.Warn(logger).Log("msg", "This collector is deprecated and will be removed in the next major version release.")
|
||||||
|
|
|
@ -18,16 +18,12 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs"
|
"github.com/prometheus/procfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
sysctlInclude = kingpin.Flag("collector.sysctl.include", "Select sysctl metrics to include").Strings()
|
|
||||||
sysctlIncludeInfo = kingpin.Flag("collector.sysctl.include-info", "Select sysctl metrics to include as info metrics").Strings()
|
|
||||||
|
|
||||||
sysctlInfoDesc = prometheus.NewDesc(prometheus.BuildFQName(namespace, "sysctl", "info"), "sysctl info", []string{"name", "value", "index"}, nil)
|
sysctlInfoDesc = prometheus.NewDesc(prometheus.BuildFQName(namespace, "sysctl", "info"), "sysctl info", []string{"name", "value", "index"}, nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,10 +34,18 @@ type sysctlCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("sysctl", defaultDisabled, NewSysctlCollector)
|
registerCollector("sysctl", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(SysctlConfig)
|
||||||
|
return NewSysctlCollector(cfg, logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSysctlCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
type SysctlConfig struct {
|
||||||
|
Include *[]string
|
||||||
|
IncludeInfo *[]string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSysctlCollector(config SysctlConfig, logger log.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
||||||
|
@ -52,7 +56,7 @@ func NewSysctlCollector(config NodeCollectorConfig, logger log.Logger) (Collecto
|
||||||
sysctls: []*sysctl{},
|
sysctls: []*sysctl{},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, include := range *sysctlInclude {
|
for _, include := range *config.Include {
|
||||||
sysctl, err := newSysctl(include, true)
|
sysctl, err := newSysctl(include, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -60,7 +64,7 @@ func NewSysctlCollector(config NodeCollectorConfig, logger log.Logger) (Collecto
|
||||||
c.sysctls = append(c.sysctls, sysctl)
|
c.sysctls = append(c.sysctls, sysctl)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, include := range *sysctlIncludeInfo {
|
for _, include := range *config.IncludeInfo {
|
||||||
sysctl, err := newSysctl(include, false)
|
sysctl, err := newSysctl(include, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -27,7 +27,6 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/coreos/go-systemd/v22/dbus"
|
"github.com/coreos/go-systemd/v22/dbus"
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
|
@ -43,21 +42,7 @@ const (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
systemdUnitIncludeSet bool
|
systemdUnitIncludeSet bool
|
||||||
systemdUnitInclude = kingpin.Flag("collector.systemd.unit-include", "Regexp of systemd units to include. Units must both match include and not match exclude to be included.").Default(".+").PreAction(func(c *kingpin.ParseContext) error {
|
|
||||||
systemdUnitIncludeSet = true
|
|
||||||
return nil
|
|
||||||
}).String()
|
|
||||||
oldSystemdUnitInclude = kingpin.Flag("collector.systemd.unit-whitelist", "DEPRECATED: Use --collector.systemd.unit-include").Hidden().String()
|
|
||||||
systemdUnitExcludeSet bool
|
systemdUnitExcludeSet bool
|
||||||
systemdUnitExclude = kingpin.Flag("collector.systemd.unit-exclude", "Regexp of systemd units to exclude. Units must both match include and not match exclude to be included.").Default(".+\\.(automount|device|mount|scope|slice)").PreAction(func(c *kingpin.ParseContext) error {
|
|
||||||
systemdUnitExcludeSet = true
|
|
||||||
return nil
|
|
||||||
}).String()
|
|
||||||
oldSystemdUnitExclude = kingpin.Flag("collector.systemd.unit-blacklist", "DEPRECATED: Use collector.systemd.unit-exclude").Hidden().String()
|
|
||||||
systemdPrivate = kingpin.Flag("collector.systemd.private", "Establish a private, direct connection to systemd without dbus (Strongly discouraged since it requires root. For testing purposes only).").Hidden().Bool()
|
|
||||||
enableTaskMetrics = kingpin.Flag("collector.systemd.enable-task-metrics", "Enables service unit tasks metrics unit_tasks_current and unit_tasks_max").Bool()
|
|
||||||
enableRestartsMetrics = kingpin.Flag("collector.systemd.enable-restarts-metrics", "Enables service unit metric service_restart_total").Bool()
|
|
||||||
enableStartTimeMetrics = kingpin.Flag("collector.systemd.enable-start-time-metrics", "Enables service unit metric unit_start_time_seconds").Bool()
|
|
||||||
|
|
||||||
systemdVersionRE = regexp.MustCompile(`[0-9]{3,}(\.[0-9]+)?`)
|
systemdVersionRE = regexp.MustCompile(`[0-9]{3,}(\.[0-9]+)?`)
|
||||||
)
|
)
|
||||||
|
@ -79,16 +64,31 @@ type systemdCollector struct {
|
||||||
systemdUnitIncludePattern *regexp.Regexp
|
systemdUnitIncludePattern *regexp.Regexp
|
||||||
systemdUnitExcludePattern *regexp.Regexp
|
systemdUnitExcludePattern *regexp.Regexp
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
|
config SystemdConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
var unitStatesName = []string{"active", "activating", "deactivating", "inactive", "failed"}
|
var unitStatesName = []string{"active", "activating", "deactivating", "inactive", "failed"}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("systemd", defaultDisabled, NewSystemdCollector)
|
registerCollector("systemd", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(SystemdConfig)
|
||||||
|
return NewSystemdCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type SystemdConfig struct {
|
||||||
|
UnitInclude *string
|
||||||
|
UnitExclude *string
|
||||||
|
OldUnitInclude *string
|
||||||
|
OldUnitExclude *string
|
||||||
|
Private *bool
|
||||||
|
EnableTaskMetrics *bool
|
||||||
|
EnableRestartsMetrics *bool
|
||||||
|
EnableStartTimeMetrics *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSystemdCollector returns a new Collector exposing systemd statistics.
|
// NewSystemdCollector returns a new Collector exposing systemd statistics.
|
||||||
func NewSystemdCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewSystemdCollector(config SystemdConfig, logger log.Logger) (Collector, error) {
|
||||||
const subsystem = "systemd"
|
const subsystem = "systemd"
|
||||||
|
|
||||||
unitDesc := prometheus.NewDesc(
|
unitDesc := prometheus.NewDesc(
|
||||||
|
@ -134,26 +134,26 @@ func NewSystemdCollector(config NodeCollectorConfig, logger log.Logger) (Collect
|
||||||
prometheus.BuildFQName(namespace, subsystem, "version"),
|
prometheus.BuildFQName(namespace, subsystem, "version"),
|
||||||
"Detected systemd version", []string{"version"}, nil)
|
"Detected systemd version", []string{"version"}, nil)
|
||||||
|
|
||||||
if *oldSystemdUnitExclude != "" {
|
if *config.OldUnitExclude != "" {
|
||||||
if !systemdUnitExcludeSet {
|
if !systemdUnitExcludeSet {
|
||||||
level.Warn(logger).Log("msg", "--collector.systemd.unit-blacklist is DEPRECATED and will be removed in 2.0.0, use --collector.systemd.unit-exclude")
|
level.Warn(logger).Log("msg", "--collector.systemd.unit-blacklist is DEPRECATED and will be removed in 2.0.0, use --collector.systemd.unit-exclude")
|
||||||
*systemdUnitExclude = *oldSystemdUnitExclude
|
*config.UnitExclude = *config.OldUnitExclude
|
||||||
} else {
|
} else {
|
||||||
return nil, errors.New("--collector.systemd.unit-blacklist and --collector.systemd.unit-exclude are mutually exclusive")
|
return nil, errors.New("--collector.systemd.unit-blacklist and --collector.systemd.unit-exclude are mutually exclusive")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if *oldSystemdUnitInclude != "" {
|
if *config.OldUnitInclude != "" {
|
||||||
if !systemdUnitIncludeSet {
|
if !systemdUnitIncludeSet {
|
||||||
level.Warn(logger).Log("msg", "--collector.systemd.unit-whitelist is DEPRECATED and will be removed in 2.0.0, use --collector.systemd.unit-include")
|
level.Warn(logger).Log("msg", "--collector.systemd.unit-whitelist is DEPRECATED and will be removed in 2.0.0, use --collector.systemd.unit-include")
|
||||||
*systemdUnitInclude = *oldSystemdUnitInclude
|
*config.UnitInclude = *config.OldUnitInclude
|
||||||
} else {
|
} else {
|
||||||
return nil, errors.New("--collector.systemd.unit-whitelist and --collector.systemd.unit-include are mutually exclusive")
|
return nil, errors.New("--collector.systemd.unit-whitelist and --collector.systemd.unit-include are mutually exclusive")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
level.Info(logger).Log("msg", "Parsed flag --collector.systemd.unit-include", "flag", *systemdUnitInclude)
|
level.Info(logger).Log("msg", "Parsed flag --collector.systemd.unit-include", "flag", *config.UnitInclude)
|
||||||
systemdUnitIncludePattern := regexp.MustCompile(fmt.Sprintf("^(?:%s)$", *systemdUnitInclude))
|
systemdUnitIncludePattern := regexp.MustCompile(fmt.Sprintf("^(?:%s)$", *config.UnitInclude))
|
||||||
level.Info(logger).Log("msg", "Parsed flag --collector.systemd.unit-exclude", "flag", *systemdUnitExclude)
|
level.Info(logger).Log("msg", "Parsed flag --collector.systemd.unit-exclude", "flag", *config.UnitExclude)
|
||||||
systemdUnitExcludePattern := regexp.MustCompile(fmt.Sprintf("^(?:%s)$", *systemdUnitExclude))
|
systemdUnitExcludePattern := regexp.MustCompile(fmt.Sprintf("^(?:%s)$", *config.UnitExclude))
|
||||||
|
|
||||||
return &systemdCollector{
|
return &systemdCollector{
|
||||||
unitDesc: unitDesc,
|
unitDesc: unitDesc,
|
||||||
|
@ -178,7 +178,7 @@ func NewSystemdCollector(config NodeCollectorConfig, logger log.Logger) (Collect
|
||||||
// to reduce wait time for responses.
|
// to reduce wait time for responses.
|
||||||
func (c *systemdCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *systemdCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
begin := time.Now()
|
begin := time.Now()
|
||||||
conn, err := newSystemdDbusConn()
|
conn, err := newSystemdDbusConn(c.config.Private)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("couldn't get dbus connection: %w", err)
|
return fmt.Errorf("couldn't get dbus connection: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -221,7 +221,7 @@ func (c *systemdCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
level.Debug(c.logger).Log("msg", "collectUnitStatusMetrics took", "duration_seconds", time.Since(begin).Seconds())
|
level.Debug(c.logger).Log("msg", "collectUnitStatusMetrics took", "duration_seconds", time.Since(begin).Seconds())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if *enableStartTimeMetrics {
|
if *c.config.EnableStartTimeMetrics {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
@ -231,7 +231,7 @@ func (c *systemdCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
if *enableTaskMetrics {
|
if *c.config.EnableTaskMetrics {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
@ -295,7 +295,7 @@ func (c *systemdCollector) collectUnitStatusMetrics(conn *dbus.Conn, ch chan<- p
|
||||||
c.unitDesc, prometheus.GaugeValue, isActive,
|
c.unitDesc, prometheus.GaugeValue, isActive,
|
||||||
unit.Name, stateName, serviceType)
|
unit.Name, stateName, serviceType)
|
||||||
}
|
}
|
||||||
if *enableRestartsMetrics && strings.HasSuffix(unit.Name, ".service") {
|
if *c.config.EnableRestartsMetrics && strings.HasSuffix(unit.Name, ".service") {
|
||||||
// NRestarts wasn't added until systemd 235.
|
// NRestarts wasn't added until systemd 235.
|
||||||
restartsCount, err := conn.GetUnitTypePropertyContext(context.TODO(), unit.Name, "Service", "NRestarts")
|
restartsCount, err := conn.GetUnitTypePropertyContext(context.TODO(), unit.Name, "Service", "NRestarts")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -434,7 +434,7 @@ func (c *systemdCollector) collectSystemState(conn *dbus.Conn, ch chan<- prometh
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSystemdDbusConn() (*dbus.Conn, error) {
|
func newSystemdDbusConn(systemdPrivate *bool) (*dbus.Conn, error) {
|
||||||
if *systemdPrivate {
|
if *systemdPrivate {
|
||||||
return dbus.NewSystemdConnectionContext(context.TODO())
|
return dbus.NewSystemdConnectionContext(context.TODO())
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,17 +21,12 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/procfs/sysfs"
|
"github.com/prometheus/procfs/sysfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
ignoredTapeDevices = kingpin.Flag("collector.tapestats.ignored-devices", "Regexp of devices to ignore for tapestats.").Default("^$").String()
|
|
||||||
)
|
|
||||||
|
|
||||||
type tapestatsCollector struct {
|
type tapestatsCollector struct {
|
||||||
ignoredDevicesPattern *regexp.Regexp
|
ignoredDevicesPattern *regexp.Regexp
|
||||||
ioNow *prometheus.Desc
|
ioNow *prometheus.Desc
|
||||||
|
@ -49,12 +44,19 @@ type tapestatsCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("tapestats", defaultEnabled, NewTapestatsCollector)
|
registerCollector("tapestats", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(TapestatsConfig)
|
||||||
|
return NewTapestatsCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type TapestatsConfig struct {
|
||||||
|
IgnoredDevices *string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTapestatsCollector returns a new Collector exposing tape device stats.
|
// NewTapestatsCollector returns a new Collector exposing tape device stats.
|
||||||
// Docs from https://www.kernel.org/doc/html/latest/scsi/st.html#sysfs-and-statistics-for-tape-devices
|
// Docs from https://www.kernel.org/doc/html/latest/scsi/st.html#sysfs-and-statistics-for-tape-devices
|
||||||
func NewTapestatsCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewTapestatsCollector(config TapestatsConfig, logger log.Logger) (Collector, error) {
|
||||||
var tapeLabelNames = []string{"device"}
|
var tapeLabelNames = []string{"device"}
|
||||||
|
|
||||||
fs, err := sysfs.NewFS(*sysPath)
|
fs, err := sysfs.NewFS(*sysPath)
|
||||||
|
@ -65,7 +67,7 @@ func NewTapestatsCollector(config NodeCollectorConfig, logger log.Logger) (Colle
|
||||||
tapeSubsystem := "tape"
|
tapeSubsystem := "tape"
|
||||||
|
|
||||||
return &tapestatsCollector{
|
return &tapestatsCollector{
|
||||||
ignoredDevicesPattern: regexp.MustCompile(*ignoredTapeDevices),
|
ignoredDevicesPattern: regexp.MustCompile(*config.IgnoredDevices),
|
||||||
|
|
||||||
ioNow: prometheus.NewDesc(
|
ioNow: prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, tapeSubsystem, "io_now"),
|
prometheus.BuildFQName(namespace, tapeSubsystem, "io_now"),
|
||||||
|
|
|
@ -64,11 +64,13 @@ type tcpStatCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("tcpstat", defaultDisabled, NewTCPStatCollector)
|
registerCollector("tcpstat", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewTCPStatCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTCPStatCollector returns a new Collector exposing network stats.
|
// NewTCPStatCollector returns a new Collector exposing network stats.
|
||||||
func NewTCPStatCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewTCPStatCollector(logger log.Logger) (Collector, error) {
|
||||||
return &tcpStatCollector{
|
return &tcpStatCollector{
|
||||||
desc: typedDesc{prometheus.NewDesc(
|
desc: typedDesc{prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, "tcp", "connection_states"),
|
prometheus.BuildFQName(namespace, "tcp", "connection_states"),
|
||||||
|
|
|
@ -24,7 +24,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -33,8 +32,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
textFileDirectory = kingpin.Flag("collector.textfile.directory", "Directory to read text files with metrics from.").Default("").String()
|
mtimeDesc = prometheus.NewDesc(
|
||||||
mtimeDesc = prometheus.NewDesc(
|
|
||||||
"node_textfile_mtime_seconds",
|
"node_textfile_mtime_seconds",
|
||||||
"Unixtime mtime of textfiles successfully read.",
|
"Unixtime mtime of textfiles successfully read.",
|
||||||
[]string{"file"},
|
[]string{"file"},
|
||||||
|
@ -50,14 +48,21 @@ type textFileCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("textfile", defaultEnabled, NewTextFileCollector)
|
registerCollector("textfile", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(TextFileConfig)
|
||||||
|
return NewTextFileCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type TextFileConfig struct {
|
||||||
|
Directory *string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTextFileCollector returns a new Collector exposing metrics read from files
|
// NewTextFileCollector returns a new Collector exposing metrics read from files
|
||||||
// in the given textfile directory.
|
// in the given textfile directory.
|
||||||
func NewTextFileCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewTextFileCollector(config TextFileConfig, logger log.Logger) (Collector, error) {
|
||||||
c := &textFileCollector{
|
c := &textFileCollector{
|
||||||
path: *textFileDirectory,
|
path: *config.Directory,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}
|
}
|
||||||
return c, nil
|
return c, nil
|
||||||
|
|
|
@ -63,7 +63,9 @@ type thermCollector struct {
|
||||||
const thermal = "thermal"
|
const thermal = "thermal"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector(thermal, defaultEnabled, NewThermCollector)
|
registerCollector(thermal, defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewThermCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewThermCollector returns a new Collector exposing current CPU power levels.
|
// NewThermCollector returns a new Collector exposing current CPU power levels.
|
||||||
|
|
|
@ -39,11 +39,13 @@ type thermalZoneCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("thermal_zone", defaultEnabled, NewThermalZoneCollector)
|
registerCollector("thermal_zone", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewThermalZoneCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewThermalZoneCollector returns a new Collector exposing kernel/system statistics.
|
// NewThermalZoneCollector returns a new Collector exposing kernel/system statistics.
|
||||||
func NewThermalZoneCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewThermalZoneCollector(logger log.Logger) (Collector, error) {
|
||||||
fs, err := sysfs.NewFS(*sysPath)
|
fs, err := sysfs.NewFS(*sysPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
||||||
|
|
|
@ -33,12 +33,14 @@ type timeCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("time", defaultEnabled, NewTimeCollector)
|
registerCollector("time", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewTimeCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTimeCollector returns a new Collector exposing the current system time in
|
// NewTimeCollector returns a new Collector exposing the current system time in
|
||||||
// seconds since epoch.
|
// seconds since epoch.
|
||||||
func NewTimeCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewTimeCollector(logger log.Logger) (Collector, error) {
|
||||||
const subsystem = "time"
|
const subsystem = "time"
|
||||||
return &timeCollector{
|
return &timeCollector{
|
||||||
now: typedDesc{prometheus.NewDesc(
|
now: typedDesc{prometheus.NewDesc(
|
||||||
|
|
|
@ -62,11 +62,13 @@ type timexCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("timex", defaultEnabled, NewTimexCollector)
|
registerCollector("timex", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewTimexCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTimexCollector returns a new Collector exposing adjtime(3) stats.
|
// NewTimexCollector returns a new Collector exposing adjtime(3) stats.
|
||||||
func NewTimexCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewTimexCollector(logger log.Logger) (Collector, error) {
|
||||||
const subsystem = "timex"
|
const subsystem = "timex"
|
||||||
|
|
||||||
return &timexCollector{
|
return &timexCollector{
|
||||||
|
|
|
@ -36,11 +36,13 @@ type (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("udp_queues", defaultEnabled, NewUDPqueuesCollector)
|
registerCollector("udp_queues", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewUDPqueuesCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUDPqueuesCollector returns a new Collector exposing network udp queued bytes.
|
// NewUDPqueuesCollector returns a new Collector exposing network udp queued bytes.
|
||||||
func NewUDPqueuesCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewUDPqueuesCollector(logger log.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||||
|
|
|
@ -49,11 +49,13 @@ type uname struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("uname", defaultEnabled, newUnameCollector)
|
registerCollector("uname", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return newUnameCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUnameCollector returns new unameCollector.
|
// NewUnameCollector returns new unameCollector.
|
||||||
func newUnameCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func newUnameCollector(logger log.Logger) (Collector, error) {
|
||||||
return &unameCollector{logger}, nil
|
return &unameCollector{logger}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
)
|
)
|
||||||
|
@ -33,22 +32,25 @@ const (
|
||||||
vmStatSubsystem = "vmstat"
|
vmStatSubsystem = "vmstat"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
vmStatFields = kingpin.Flag("collector.vmstat.fields", "Regexp of fields to return for vmstat collector.").Default("^(oom_kill|pgpg|pswp|pg.*fault).*").String()
|
|
||||||
)
|
|
||||||
|
|
||||||
type vmStatCollector struct {
|
type vmStatCollector struct {
|
||||||
fieldPattern *regexp.Regexp
|
fieldPattern *regexp.Regexp
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("vmstat", defaultEnabled, NewvmStatCollector)
|
registerCollector(vmStatSubsystem, defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(VmStatConfig)
|
||||||
|
return NewvmStatCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type VmStatConfig struct {
|
||||||
|
Fields *string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewvmStatCollector returns a new Collector exposing vmstat stats.
|
// NewvmStatCollector returns a new Collector exposing vmstat stats.
|
||||||
func NewvmStatCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewvmStatCollector(config VmStatConfig, logger log.Logger) (Collector, error) {
|
||||||
pattern := regexp.MustCompile(*vmStatFields)
|
pattern := regexp.MustCompile(*config.Fields)
|
||||||
return &vmStatCollector{
|
return &vmStatCollector{
|
||||||
fieldPattern: pattern,
|
fieldPattern: pattern,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|
|
@ -23,7 +23,6 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin/v2"
|
|
||||||
"github.com/go-kit/log"
|
"github.com/go-kit/log"
|
||||||
"github.com/go-kit/log/level"
|
"github.com/go-kit/log/level"
|
||||||
"github.com/mdlayher/wifi"
|
"github.com/mdlayher/wifi"
|
||||||
|
@ -46,14 +45,18 @@ type wifiCollector struct {
|
||||||
stationBeaconLossTotal *prometheus.Desc
|
stationBeaconLossTotal *prometheus.Desc
|
||||||
|
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
|
config WifiConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
collectorWifi = kingpin.Flag("collector.wifi.fixtures", "test fixtures to use for wifi collector metrics").Default("").String()
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("wifi", defaultDisabled, NewWifiCollector)
|
registerCollector("wifi", defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
cfg := config.(WifiConfig)
|
||||||
|
return NewWifiCollector(cfg, logger)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
type WifiConfig struct {
|
||||||
|
Fixtures *string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ wifiStater = &wifi.Client{}
|
var _ wifiStater = &wifi.Client{}
|
||||||
|
@ -67,7 +70,7 @@ type wifiStater interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWifiCollector returns a new Collector exposing Wifi statistics.
|
// NewWifiCollector returns a new Collector exposing Wifi statistics.
|
||||||
func NewWifiCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewWifiCollector(config WifiConfig, logger log.Logger) (Collector, error) {
|
||||||
const (
|
const (
|
||||||
subsystem = "wifi"
|
subsystem = "wifi"
|
||||||
)
|
)
|
||||||
|
@ -161,11 +164,12 @@ func NewWifiCollector(config NodeCollectorConfig, logger log.Logger) (Collector,
|
||||||
nil,
|
nil,
|
||||||
),
|
),
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
config: config,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *wifiCollector) Update(ch chan<- prometheus.Metric) error {
|
func (c *wifiCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
stat, err := newWifiStater(*collectorWifi)
|
stat, err := newWifiStater(*c.config.Fixtures)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Cannot access wifi metrics, report no error.
|
// Cannot access wifi metrics, report no error.
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
|
|
@ -31,11 +31,13 @@ type xfsCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("xfs", defaultEnabled, NewXFSCollector)
|
registerCollector("xfs", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewXFSCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewXFSCollector returns a new Collector exposing XFS statistics.
|
// NewXFSCollector returns a new Collector exposing XFS statistics.
|
||||||
func NewXFSCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewXFSCollector(logger log.Logger) (Collector, error) {
|
||||||
fs, err := xfs.NewFS(*procPath, *sysPath)
|
fs, err := xfs.NewFS(*procPath, *sysPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
return nil, fmt.Errorf("failed to open sysfs: %w", err)
|
||||||
|
|
|
@ -30,7 +30,9 @@ var errZFSNotAvailable = errors.New("ZFS / ZFS statistics are not available")
|
||||||
type zfsSysctl string
|
type zfsSysctl string
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("zfs", defaultEnabled, NewZFSCollector)
|
registerCollector("zfs", defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewZFSCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type zfsCollector struct {
|
type zfsCollector struct {
|
||||||
|
@ -43,7 +45,7 @@ type zfsCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewZFSCollector returns a new Collector exposing ZFS statistics.
|
// NewZFSCollector returns a new Collector exposing ZFS statistics.
|
||||||
func NewZFSCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewZFSCollector(logger log.Logger) (Collector, error) {
|
||||||
return &zfsCollector{
|
return &zfsCollector{
|
||||||
linuxProcpathBase: "spl/kstat/zfs",
|
linuxProcpathBase: "spl/kstat/zfs",
|
||||||
linuxZpoolIoPath: "/*/io",
|
linuxZpoolIoPath: "/*/io",
|
||||||
|
|
|
@ -33,10 +33,12 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("zfs", defaultEnabled, NewZfsCollector)
|
registerCollector(zfsCollectorSubsystem, defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewZfsCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewZfsCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewZfsCollector(logger log.Logger) (Collector, error) {
|
||||||
return &zfsCollector{
|
return &zfsCollector{
|
||||||
sysctls: []bsdSysctl{
|
sysctls: []bsdSysctl{
|
||||||
{
|
{
|
||||||
|
|
|
@ -62,7 +62,9 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("zfs", defaultEnabled, NewZfsCollector)
|
registerCollector(zfsCollectorSubsystem, defaultEnabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewZfsCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewZfsCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewZfsCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
||||||
|
|
|
@ -33,11 +33,13 @@ type zoneinfoCollector struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registerCollector("zoneinfo", defaultDisabled, NewZoneinfoCollector)
|
registerCollector(zoneinfoSubsystem, defaultDisabled, func(config any, logger log.Logger) (Collector, error) {
|
||||||
|
return NewZoneinfoCollector(logger)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewZoneinfoCollector returns a new Collector exposing zone stats.
|
// NewZoneinfoCollector returns a new Collector exposing zone stats.
|
||||||
func NewZoneinfoCollector(config NodeCollectorConfig, logger log.Logger) (Collector, error) {
|
func NewZoneinfoCollector(logger log.Logger) (Collector, error) {
|
||||||
fs, err := procfs.NewFS(*procPath)
|
fs, err := procfs.NewFS(*procPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
return nil, fmt.Errorf("failed to open procfs: %w", err)
|
||||||
|
|
|
@ -118,5 +118,43 @@ func AddFlags(a *kingpin.Application) collector.NodeCollectorConfig {
|
||||||
config.Perf.CaProfilerFlag = a.Flag("collector.perf.cache-profilers", "perf cache profilers that should be collected").Strings()
|
config.Perf.CaProfilerFlag = a.Flag("collector.perf.cache-profilers", "perf cache profilers that should be collected").Strings()
|
||||||
|
|
||||||
config.PowerSupplyClass.IgnoredPowerSupplies = a.Flag("collector.powersupply.ignored-supplies", "Regexp of power supplies to ignore for powersupplyclass collector.").Default("^$").String()
|
config.PowerSupplyClass.IgnoredPowerSupplies = a.Flag("collector.powersupply.ignored-supplies", "Regexp of power supplies to ignore for powersupplyclass collector.").Default("^$").String()
|
||||||
|
|
||||||
|
config.Qdisc.Fixtures = a.Flag("collector.qdisc.fixtures", "test fixtures to use for qdisc collector end-to-end testing").Default("").String()
|
||||||
|
config.Qdisc.DeviceInclude = a.Flag("collector.qdisk.device-include", "Regexp of qdisk devices to include (mutually exclusive to device-exclude).").String()
|
||||||
|
config.Qdisc.DeviceExclude = a.Flag("collector.qdisk.device-exclude", "Regexp of qdisk devices to exclude (mutually exclusive to device-include).").String()
|
||||||
|
|
||||||
|
config.Rapl.ZoneLabel = a.Flag("collector.rapl.enable-zone-label", "Enables service unit metric unit_start_time_seconds").Bool()
|
||||||
|
|
||||||
|
config.Runit.ServiceDir = a.Flag("collector.runit.servicedir", "Path to runit service directory.").Default("/etc/service").String()
|
||||||
|
|
||||||
|
config.Stat.Softirq = a.Flag("collector.stat.softirq", "Export softirq calls per vector").Default("false").Bool()
|
||||||
|
|
||||||
|
config.Supervisord.URL = a.Flag("collector.supervisord.url", "XML RPC endpoint.").Default("http://localhost:9001/RPC2").Envar("SUPERVISORD_URL").String()
|
||||||
|
|
||||||
|
config.Sysctl.Include = a.Flag("collector.sysctl.include", "Select sysctl metrics to include").Strings()
|
||||||
|
config.Sysctl.IncludeInfo = a.Flag("collector.sysctl.include-info", "Select sysctl metrics to include as info metrics").Strings()
|
||||||
|
|
||||||
|
config.Systemd.UnitInclude = a.Flag("collector.systemd.unit-include", "Regexp of systemd units to include. Units must both match include and not match exclude to be included.").Default(".+").PreAction(func(c *kingpin.ParseContext) error {
|
||||||
|
systemdUnitIncludeSet = true
|
||||||
|
return nil
|
||||||
|
}).String()
|
||||||
|
config.Systemd.UnitExclude = kingpin.Flag("collector.systemd.unit-exclude", "Regexp of systemd units to exclude. Units must both match include and not match exclude to be included.").Default(".+\\.(automount|device|mount|scope|slice)").PreAction(func(c *kingpin.ParseContext) error {
|
||||||
|
systemdUnitExcludeSet = true
|
||||||
|
return nil
|
||||||
|
}).String()
|
||||||
|
config.Systemd.OldUnitInclude = kingpin.Flag("collector.systemd.unit-whitelist", "DEPRECATED: Use --collector.systemd.unit-include").Hidden().String()
|
||||||
|
config.Systemd.OldUnitExclude = kingpin.Flag("collector.systemd.unit-blacklist", "DEPRECATED: Use collector.systemd.unit-exclude").Hidden().String()
|
||||||
|
config.Systemd.Private = kingpin.Flag("collector.systemd.private", "Establish a private, direct connection to systemd without dbus (Strongly discouraged since it requires root. For testing purposes only).").Hidden().Bool()
|
||||||
|
config.Systemd.EnableTaskMetrics = kingpin.Flag("collector.systemd.enable-task-metrics", "Enables service unit tasks metrics unit_tasks_current and unit_tasks_max").Bool()
|
||||||
|
config.Systemd.EnableRestartsMetrics = kingpin.Flag("collector.systemd.enable-restarts-metrics", "Enables service unit metric service_restart_total").Bool()
|
||||||
|
config.Systemd.EnableStartTimeMetrics = kingpin.Flag("collector.systemd.enable-start-time-metrics", "Enables service unit metric unit_start_time_seconds").Bool()
|
||||||
|
|
||||||
|
config.Tapestats.IgnoredDevices = kingpin.Flag("collector.tapestats.ignored-devices", "Regexp of devices to ignore for tapestats.").Default("^$").String()
|
||||||
|
|
||||||
|
config.TextFile.Directory = a.Flag("collector.textfile.directory", "Directory to read text files with metrics from.").Default("").String()
|
||||||
|
|
||||||
|
config.VmStat.Fields = a.Flag("collector.vmstat.fields", "Regexp of fields to return for vmstat collector.").Default("^(oom_kill|pgpg|pswp|pg.*fault).*").String()
|
||||||
|
|
||||||
|
config.Wifi.Fixtures = a.Flag("collector.wifi.fixtures", "test fixtures to use for wifi collector end-to-end testing").Default("").String()
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue