Update logging (#3097)

Switch from promlog/go-kit to promslog/slog for logging.
* Update Go build to 1.23.

Signed-off-by: Ben Kochie <superq@gmail.com>
superq/v2
Ben Kochie 2 months ago committed by GitHub
parent 041d67d269
commit 090957658e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -32,8 +32,6 @@ linters-settings:
exclude-functions: exclude-functions:
# Used in HTTP handlers, any error is handled by the server itself. # Used in HTTP handlers, any error is handled by the server itself.
- (net/http.ResponseWriter).Write - (net/http.ResponseWriter).Write
# Never check for logger errors.
- (github.com/go-kit/log.Logger).Log
revive: revive:
rules: rules:
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter

@ -19,10 +19,10 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"net" "net"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/jsimonetti/rtnetlink" "github.com/jsimonetti/rtnetlink"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
@ -39,7 +39,7 @@ type arpCollector struct {
fs procfs.FS fs procfs.FS
deviceFilter deviceFilter deviceFilter deviceFilter
entries *prometheus.Desc entries *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -47,7 +47,7 @@ func init() {
} }
// NewARPCollector returns a new Collector exposing ARP stats. // NewARPCollector returns a new Collector exposing ARP stats.
func NewARPCollector(logger log.Logger) (Collector, error) { func NewARPCollector(logger *slog.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)

@ -18,9 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/bcache" "github.com/prometheus/procfs/bcache"
) )
@ -36,12 +36,12 @@ func init() {
// A bcacheCollector is a Collector which gathers metrics from Linux bcache. // A bcacheCollector is a Collector which gathers metrics from Linux bcache.
type bcacheCollector struct { type bcacheCollector struct {
fs bcache.FS fs bcache.FS
logger log.Logger logger *slog.Logger
} }
// NewBcacheCollector returns a newly allocated bcacheCollector. // NewBcacheCollector returns a newly allocated bcacheCollector.
// It exposes a number of Linux bcache statistics. // It exposes a number of Linux bcache statistics.
func NewBcacheCollector(logger log.Logger) (Collector, error) { func NewBcacheCollector(logger *slog.Logger) (Collector, error) {
fs, err := bcache.NewFS(*sysPath) fs, err := bcache.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)

@ -19,18 +19,17 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
type bondingCollector struct { type bondingCollector struct {
slaves, active typedDesc slaves, active typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -39,7 +38,7 @@ func init() {
// NewBondingCollector returns a newly allocated bondingCollector. // NewBondingCollector returns a newly allocated bondingCollector.
// It exposes the number of configured and active slave of linux bonding interfaces. // It exposes the number of configured and active slave of linux bonding interfaces.
func NewBondingCollector(logger log.Logger) (Collector, error) { func NewBondingCollector(logger *slog.Logger) (Collector, error) {
return &bondingCollector{ return &bondingCollector{
slaves: typedDesc{prometheus.NewDesc( slaves: typedDesc{prometheus.NewDesc(
prometheus.BuildFQName(namespace, "bonding", "slaves"), prometheus.BuildFQName(namespace, "bonding", "slaves"),
@ -61,7 +60,7 @@ func (c *bondingCollector) Update(ch chan<- prometheus.Metric) error {
bondingStats, err := readBondingStats(statusfile) bondingStats, err := readBondingStats(statusfile)
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "Not collecting bonding, file does not exist", "file", statusfile) c.logger.Debug("Not collecting bonding, file does not exist", "file", statusfile)
return ErrNoData return ErrNoData
} }
return err return err

@ -18,13 +18,13 @@
package collector package collector
import ( import (
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"log/slog"
) )
type bootTimeCollector struct { type bootTimeCollector struct {
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -32,7 +32,7 @@ func init() {
} }
// newBootTimeCollector returns a new Collector exposing system boot time on BSD systems. // newBootTimeCollector returns a new Collector exposing system boot time on BSD systems.
func newBootTimeCollector(logger log.Logger) (Collector, error) { func newBootTimeCollector(logger *slog.Logger) (Collector, error) {
return &bootTimeCollector{ return &bootTimeCollector{
logger: logger, logger: logger,
}, nil }, nil

@ -17,21 +17,21 @@
package collector package collector
import ( import (
"github.com/go-kit/log"
"github.com/illumos/go-kstat" "github.com/illumos/go-kstat"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"log/slog"
) )
type bootTimeCollector struct { type bootTimeCollector struct {
boottime typedDesc boottime typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
registerCollector("boottime", defaultEnabled, newBootTimeCollector) registerCollector("boottime", defaultEnabled, newBootTimeCollector)
} }
func newBootTimeCollector(logger log.Logger) (Collector, error) { func newBootTimeCollector(logger *slog.Logger) (Collector, error) {
return &bootTimeCollector{ return &bootTimeCollector{
boottime: typedDesc{ boottime: typedDesc{
prometheus.NewDesc( prometheus.NewDesc(

@ -18,13 +18,12 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"path" "path"
"strings" "strings"
"syscall" "syscall"
dennwc "github.com/dennwc/btrfs" dennwc "github.com/dennwc/btrfs"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/btrfs" "github.com/prometheus/procfs/btrfs"
) )
@ -32,7 +31,7 @@ import (
// A btrfsCollector is a Collector which gathers metrics from Btrfs filesystems. // A btrfsCollector is a Collector which gathers metrics from Btrfs filesystems.
type btrfsCollector struct { type btrfsCollector struct {
fs btrfs.FS fs btrfs.FS
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -40,7 +39,7 @@ func init() {
} }
// NewBtrfsCollector returns a new Collector exposing Btrfs statistics. // NewBtrfsCollector returns a new Collector exposing Btrfs statistics.
func NewBtrfsCollector(logger log.Logger) (Collector, error) { func NewBtrfsCollector(logger *slog.Logger) (Collector, error) {
fs, err := btrfs.NewFS(*sysPath) fs, err := btrfs.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)
@ -62,8 +61,8 @@ func (c *btrfsCollector) Update(ch chan<- prometheus.Metric) error {
ioctlStatsMap, err := c.getIoctlStats() ioctlStatsMap, err := c.getIoctlStats()
if err != nil { if err != nil {
level.Debug(c.logger).Log( c.logger.Debug(
"msg", "Error querying btrfs device stats with ioctl", "Error querying btrfs device stats with ioctl",
"err", err) "err", err)
ioctlStatsMap = make(map[string]*btrfsIoctlFsStats) ioctlStatsMap = make(map[string]*btrfsIoctlFsStats)
} }
@ -129,8 +128,8 @@ func (c *btrfsCollector) getIoctlStats() (map[string]*btrfsIoctlFsStats, error)
if err != nil { if err != nil {
// Failed to open this mount point, maybe we didn't have permission // Failed to open this mount point, maybe we didn't have permission
// maybe we'll find another mount point for this FS later. // maybe we'll find another mount point for this FS later.
level.Debug(c.logger).Log( c.logger.Debug(
"msg", "Error inspecting btrfs mountpoint", "Error inspecting btrfs mountpoint",
"mountPoint", mountPath, "mountPoint", mountPath,
"err", err) "err", err)
continue continue
@ -141,8 +140,8 @@ func (c *btrfsCollector) getIoctlStats() (map[string]*btrfsIoctlFsStats, error)
if err != nil { if err != nil {
// Failed to get the FS info for some reason, // Failed to get the FS info for some reason,
// perhaps it'll work with a different mount point // perhaps it'll work with a different mount point
level.Debug(c.logger).Log( c.logger.Debug(
"msg", "Error querying btrfs filesystem", "Error querying btrfs filesystem",
"mountPoint", mountPath, "mountPoint", mountPath,
"err", err) "err", err)
continue continue
@ -156,8 +155,8 @@ func (c *btrfsCollector) getIoctlStats() (map[string]*btrfsIoctlFsStats, error)
deviceStats, err := c.getIoctlDeviceStats(fs, &fsInfo) deviceStats, err := c.getIoctlDeviceStats(fs, &fsInfo)
if err != nil { if err != nil {
level.Debug(c.logger).Log( c.logger.Debug(
"msg", "Error querying btrfs device stats", "Error querying btrfs device stats",
"mountPoint", mountPath, "mountPoint", mountPath,
"err", err) "err", err)
continue continue

@ -18,10 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"strconv" "strconv"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -33,7 +32,7 @@ const (
type buddyinfoCollector struct { type buddyinfoCollector struct {
fs procfs.FS fs procfs.FS
desc *prometheus.Desc desc *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -41,7 +40,7 @@ func init() {
} }
// NewBuddyinfoCollector returns a new Collector exposing buddyinfo stats. // NewBuddyinfoCollector returns a new Collector exposing buddyinfo stats.
func NewBuddyinfoCollector(logger log.Logger) (Collector, error) { func NewBuddyinfoCollector(logger *slog.Logger) (Collector, error) {
desc := prometheus.NewDesc( desc := prometheus.NewDesc(
prometheus.BuildFQName(namespace, buddyInfoSubsystem, "blocks"), prometheus.BuildFQName(namespace, buddyInfoSubsystem, "blocks"),
"Count of free blocks according to size.", "Count of free blocks according to size.",
@ -62,7 +61,7 @@ func (c *buddyinfoCollector) Update(ch chan<- prometheus.Metric) error {
return fmt.Errorf("couldn't get buddyinfo: %w", err) return fmt.Errorf("couldn't get buddyinfo: %w", err)
} }
level.Debug(c.logger).Log("msg", "Set node_buddy", "buddyInfo", buddyInfo) c.logger.Debug("Set node_buddy", "buddyInfo", buddyInfo)
for _, entry := range buddyInfo { for _, entry := range buddyInfo {
for size, value := range entry.Sizes { for size, value := range entry.Sizes {
ch <- prometheus.MustNewConstMetric( ch <- prometheus.MustNewConstMetric(

@ -18,8 +18,8 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"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,7 +30,7 @@ type cgroupSummaryCollector struct {
fs procfs.FS fs procfs.FS
cgroups *prometheus.Desc cgroups *prometheus.Desc
enabled *prometheus.Desc enabled *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -38,7 +38,7 @@ func init() {
} }
// NewCgroupSummaryCollector returns a new Collector exposing a summary of cgroups. // NewCgroupSummaryCollector returns a new Collector exposing a summary of cgroups.
func NewCgroupSummaryCollector(logger log.Logger) (Collector, error) { func NewCgroupSummaryCollector(logger *slog.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)

@ -17,12 +17,11 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"sync" "sync"
"time" "time"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -50,14 +49,14 @@ const (
) )
var ( var (
factories = make(map[string]func(logger log.Logger) (Collector, error)) factories = make(map[string]func(logger *slog.Logger) (Collector, error))
initiatedCollectorsMtx = sync.Mutex{} initiatedCollectorsMtx = sync.Mutex{}
initiatedCollectors = make(map[string]Collector) initiatedCollectors = make(map[string]Collector)
collectorState = make(map[string]*bool) collectorState = make(map[string]*bool)
forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled
) )
func registerCollector(collector string, isDefaultEnabled bool, factory func(logger log.Logger) (Collector, error)) { func registerCollector(collector string, isDefaultEnabled bool, factory func(logger *slog.Logger) (Collector, error)) {
var helpDefaultState string var helpDefaultState string
if isDefaultEnabled { if isDefaultEnabled {
helpDefaultState = "enabled" helpDefaultState = "enabled"
@ -78,7 +77,7 @@ func registerCollector(collector string, isDefaultEnabled bool, factory func(log
// NodeCollector implements the prometheus.Collector interface. // NodeCollector implements the prometheus.Collector interface.
type NodeCollector struct { type NodeCollector struct {
Collectors map[string]Collector Collectors map[string]Collector
logger log.Logger logger *slog.Logger
} }
// DisableDefaultCollectors sets the collector state to false for all collectors which // DisableDefaultCollectors sets the collector state to false for all collectors which
@ -104,7 +103,7 @@ func collectorFlagAction(collector string) func(ctx *kingpin.ParseContext) error
} }
// NewNodeCollector creates a new NodeCollector. // NewNodeCollector creates a new NodeCollector.
func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, error) { func NewNodeCollector(logger *slog.Logger, filters ...string) (*NodeCollector, error) {
f := make(map[string]bool) f := make(map[string]bool)
for _, filter := range filters { for _, filter := range filters {
enabled, exist := collectorState[filter] enabled, exist := collectorState[filter]
@ -126,7 +125,7 @@ func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, err
if collector, ok := initiatedCollectors[key]; ok { if collector, ok := initiatedCollectors[key]; ok {
collectors[key] = collector collectors[key] = collector
} else { } else {
collector, err := factories[key](log.With(logger, "collector", key)) collector, err := factories[key](logger.With("collector", key))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -156,7 +155,7 @@ func (n NodeCollector) Collect(ch chan<- prometheus.Metric) {
wg.Wait() wg.Wait()
} }
func execute(name string, c Collector, ch chan<- prometheus.Metric, logger log.Logger) { func execute(name string, c Collector, ch chan<- prometheus.Metric, logger *slog.Logger) {
begin := time.Now() begin := time.Now()
err := c.Update(ch) err := c.Update(ch)
duration := time.Since(begin) duration := time.Since(begin)
@ -164,13 +163,13 @@ func execute(name string, c Collector, ch chan<- prometheus.Metric, logger log.L
if err != nil { if err != nil {
if IsNoDataError(err) { if IsNoDataError(err) {
level.Debug(logger).Log("msg", "collector returned no data", "name", name, "duration_seconds", duration.Seconds(), "err", err) logger.Debug("collector returned no data", "name", name, "duration_seconds", duration.Seconds(), "err", err)
} else { } else {
level.Error(logger).Log("msg", "collector failed", "name", name, "duration_seconds", duration.Seconds(), "err", err) logger.Error("collector failed", "name", name, "duration_seconds", duration.Seconds(), "err", err)
} }
success = 0 success = 0
} else { } else {
level.Debug(logger).Log("msg", "collector succeeded", "name", name, "duration_seconds", duration.Seconds()) logger.Debug("collector succeeded", "name", name, "duration_seconds", duration.Seconds())
success = 1 success = 1
} }
ch <- prometheus.MustNewConstMetric(scrapeDurationDesc, prometheus.GaugeValue, duration.Seconds(), name) ch <- prometheus.MustNewConstMetric(scrapeDurationDesc, prometheus.GaugeValue, duration.Seconds(), name)

@ -19,10 +19,9 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -38,7 +37,7 @@ type conntrackCollector struct {
drop *prometheus.Desc drop *prometheus.Desc
earlyDrop *prometheus.Desc earlyDrop *prometheus.Desc
searchRestart *prometheus.Desc searchRestart *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
type conntrackStatistics struct { type conntrackStatistics struct {
@ -57,7 +56,7 @@ func init() {
} }
// NewConntrackCollector returns a new Collector exposing conntrack stats. // NewConntrackCollector returns a new Collector exposing conntrack stats.
func NewConntrackCollector(logger log.Logger) (Collector, error) { func NewConntrackCollector(logger *slog.Logger) (Collector, error) {
return &conntrackCollector{ return &conntrackCollector{
current: prometheus.NewDesc( current: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "nf_conntrack_entries"), prometheus.BuildFQName(namespace, "", "nf_conntrack_entries"),
@ -154,7 +153,7 @@ func (c *conntrackCollector) Update(ch chan<- prometheus.Metric) error {
func (c *conntrackCollector) handleErr(err error) error { func (c *conntrackCollector) handleErr(err error) error {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "conntrack probably not loaded") c.logger.Debug("conntrack probably not loaded")
return ErrNoData return ErrNoData
} }
return fmt.Errorf("failed to retrieve conntrack stats: %w", err) return fmt.Errorf("failed to retrieve conntrack stats: %w", err)

@ -23,10 +23,10 @@ import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"log/slog"
"strconv" "strconv"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -53,7 +53,7 @@ const ClocksPerSec = float64(C.CLK_TCK)
type statCollector struct { type statCollector struct {
cpu *prometheus.Desc cpu *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -61,7 +61,7 @@ func init() {
} }
// NewCPUCollector returns a new Collector exposing CPU stats. // NewCPUCollector returns a new Collector exposing CPU stats.
func NewCPUCollector(logger log.Logger) (Collector, error) { func NewCPUCollector(logger *slog.Logger) (Collector, error) {
return &statCollector{ return &statCollector{
cpu: nodeCPUSecondsDesc, cpu: nodeCPUSecondsDesc,
logger: logger, logger: logger,

@ -18,10 +18,10 @@ package collector
import ( import (
"errors" "errors"
"log/slog"
"strconv" "strconv"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -78,7 +78,7 @@ const maxCPUTimesLen = C.MAXCPU * C.CPUSTATES
type statCollector struct { type statCollector struct {
cpu *prometheus.Desc cpu *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -86,7 +86,7 @@ func init() {
} }
// NewStatCollector returns a new Collector exposing CPU stats. // NewStatCollector returns a new Collector exposing CPU stats.
func NewStatCollector(logger log.Logger) (Collector, error) { func NewStatCollector(logger *slog.Logger) (Collector, error) {
return &statCollector{ return &statCollector{
cpu: nodeCPUSecondsDesc, cpu: nodeCPUSecondsDesc,
logger: logger, logger: logger,

@ -18,12 +18,11 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"math" "math"
"strconv" "strconv"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -85,7 +84,7 @@ func getCPUTimes() ([]cputime, error) {
type statCollector struct { type statCollector struct {
cpu typedDesc cpu typedDesc
temp typedDesc temp typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -93,7 +92,7 @@ func init() {
} }
// NewStatCollector returns a new Collector exposing CPU stats. // NewStatCollector returns a new Collector exposing CPU stats.
func NewStatCollector(logger log.Logger) (Collector, error) { func NewStatCollector(logger *slog.Logger) (Collector, error) {
return &statCollector{ return &statCollector{
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue}, cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
temp: typedDesc{prometheus.NewDesc( temp: typedDesc{prometheus.NewDesc(
@ -134,11 +133,11 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) error {
if err != nil { if err != nil {
if err == unix.ENOENT { if err == unix.ENOENT {
// No temperature information for this CPU // No temperature information for this CPU
level.Debug(c.logger).Log("msg", "no temperature information for CPU", "cpu", cpu) c.logger.Debug("no temperature information for CPU", "cpu", cpu)
} else { } else {
// Unexpected error // Unexpected error
ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu) ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu)
level.Error(c.logger).Log("msg", "failed to query CPU temperature for CPU", "cpu", cpu, "err", err) c.logger.Error("failed to query CPU temperature for CPU", "cpu", cpu, "err", err)
} }
continue continue
} }

@ -18,6 +18,7 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
"regexp" "regexp"
@ -26,8 +27,6 @@ import (
"sync" "sync"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
"github.com/prometheus/procfs/sysfs" "github.com/prometheus/procfs/sysfs"
@ -45,7 +44,7 @@ type cpuCollector struct {
cpuCoreThrottle *prometheus.Desc cpuCoreThrottle *prometheus.Desc
cpuPackageThrottle *prometheus.Desc cpuPackageThrottle *prometheus.Desc
cpuIsolated *prometheus.Desc cpuIsolated *prometheus.Desc
logger log.Logger logger *slog.Logger
cpuStats map[int64]procfs.CPUStat cpuStats map[int64]procfs.CPUStat
cpuStatsMutex sync.Mutex cpuStatsMutex sync.Mutex
isolatedCpus []uint16 isolatedCpus []uint16
@ -70,7 +69,7 @@ func init() {
} }
// NewCPUCollector returns a new Collector exposing kernel/system statistics. // NewCPUCollector returns a new Collector exposing kernel/system statistics.
func NewCPUCollector(logger log.Logger) (Collector, error) { func NewCPUCollector(logger *slog.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)
@ -86,7 +85,7 @@ func NewCPUCollector(logger log.Logger) (Collector, error) {
if !os.IsNotExist(err) { if !os.IsNotExist(err) {
return nil, fmt.Errorf("Unable to get isolated cpus: %w", err) return nil, fmt.Errorf("Unable to get isolated cpus: %w", err)
} }
level.Debug(logger).Log("msg", "Could not open isolated file", "error", err) logger.Debug("Could not open isolated file", "error", err)
} }
c := &cpuCollector{ c := &cpuCollector{
@ -146,7 +145,7 @@ func NewCPUCollector(logger log.Logger) (Collector, error) {
func (c *cpuCollector) compileIncludeFlags(flagsIncludeFlag, bugsIncludeFlag *string) error { func (c *cpuCollector) compileIncludeFlags(flagsIncludeFlag, bugsIncludeFlag *string) error {
if (*flagsIncludeFlag != "" || *bugsIncludeFlag != "") && !*enableCPUInfo { if (*flagsIncludeFlag != "" || *bugsIncludeFlag != "") && !*enableCPUInfo {
*enableCPUInfo = true *enableCPUInfo = true
level.Info(c.logger).Log("msg", "--collector.cpu.info has been set to `true` because you set the following flags, like --collector.cpu.info.flags-include and --collector.cpu.info.bugs-include") c.logger.Info("--collector.cpu.info has been set to `true` because you set the following flags, like --collector.cpu.info.flags-include and --collector.cpu.info.bugs-include")
} }
var err error var err error
@ -205,7 +204,7 @@ func (c *cpuCollector) updateInfo(ch chan<- prometheus.Metric) error {
cpuFreqEnabled, ok := collectorState["cpufreq"] cpuFreqEnabled, ok := collectorState["cpufreq"]
if !ok || cpuFreqEnabled == nil { if !ok || cpuFreqEnabled == nil {
level.Debug(c.logger).Log("msg", "cpufreq key missing or nil value in collectorState map") c.logger.Debug("cpufreq key missing or nil value in collectorState map")
} else if !*cpuFreqEnabled { } else if !*cpuFreqEnabled {
for _, cpu := range info { for _, cpu := range info {
ch <- prometheus.MustNewConstMetric(c.cpuFrequencyHz, ch <- prometheus.MustNewConstMetric(c.cpuFrequencyHz,
@ -269,12 +268,12 @@ func (c *cpuCollector) updateThermalThrottle(ch chan<- prometheus.Metric) error
// topology/physical_package_id // topology/physical_package_id
if physicalPackageID, err = readUintFromFile(filepath.Join(cpu, "topology", "physical_package_id")); err != nil { if physicalPackageID, err = readUintFromFile(filepath.Join(cpu, "topology", "physical_package_id")); err != nil {
level.Debug(c.logger).Log("msg", "CPU is missing physical_package_id", "cpu", cpu) c.logger.Debug("CPU is missing physical_package_id", "cpu", cpu)
continue continue
} }
// topology/core_id // topology/core_id
if coreID, err = readUintFromFile(filepath.Join(cpu, "topology", "core_id")); err != nil { if coreID, err = readUintFromFile(filepath.Join(cpu, "topology", "core_id")); err != nil {
level.Debug(c.logger).Log("msg", "CPU is missing core_id", "cpu", cpu) c.logger.Debug("CPU is missing core_id", "cpu", cpu)
continue continue
} }
@ -292,7 +291,7 @@ func (c *cpuCollector) updateThermalThrottle(ch chan<- prometheus.Metric) error
if coreThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "core_throttle_count")); err == nil { if coreThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "core_throttle_count")); err == nil {
packageCoreThrottles[physicalPackageID][coreID] = coreThrottleCount packageCoreThrottles[physicalPackageID][coreID] = coreThrottleCount
} else { } else {
level.Debug(c.logger).Log("msg", "CPU is missing core_throttle_count", "cpu", cpu) c.logger.Debug("CPU is missing core_throttle_count", "cpu", cpu)
} }
} }
@ -302,7 +301,7 @@ func (c *cpuCollector) updateThermalThrottle(ch chan<- prometheus.Metric) error
if packageThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "package_throttle_count")); err == nil { if packageThrottleCount, err := readUintFromFile(filepath.Join(cpu, "thermal_throttle", "package_throttle_count")); err == nil {
packageThrottles[physicalPackageID] = packageThrottleCount packageThrottles[physicalPackageID] = packageThrottleCount
} else { } else {
level.Debug(c.logger).Log("msg", "CPU is missing package_throttle_count", "cpu", cpu) c.logger.Debug("CPU is missing package_throttle_count", "cpu", cpu)
} }
} }
} }
@ -380,68 +379,68 @@ func (c *cpuCollector) updateCPUStats(newStats map[int64]procfs.CPUStat) {
// If idle jumps backwards by more than X seconds, assume we had a hotplug event and reset the stats for this CPU. // If idle jumps backwards by more than X seconds, assume we had a hotplug event and reset the stats for this CPU.
if (cpuStats.Idle - n.Idle) >= jumpBackSeconds { if (cpuStats.Idle - n.Idle) >= jumpBackSeconds {
level.Debug(c.logger).Log("msg", jumpBackDebugMessage, "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle) c.logger.Debug(jumpBackDebugMessage, "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle)
cpuStats = procfs.CPUStat{} cpuStats = procfs.CPUStat{}
} }
if n.Idle >= cpuStats.Idle { if n.Idle >= cpuStats.Idle {
cpuStats.Idle = n.Idle cpuStats.Idle = n.Idle
} else { } else {
level.Debug(c.logger).Log("msg", "CPU Idle counter jumped backwards", "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle) c.logger.Debug("CPU Idle counter jumped backwards", "cpu", i, "old_value", cpuStats.Idle, "new_value", n.Idle)
} }
if n.User >= cpuStats.User { if n.User >= cpuStats.User {
cpuStats.User = n.User cpuStats.User = n.User
} else { } else {
level.Debug(c.logger).Log("msg", "CPU User counter jumped backwards", "cpu", i, "old_value", cpuStats.User, "new_value", n.User) c.logger.Debug("CPU User counter jumped backwards", "cpu", i, "old_value", cpuStats.User, "new_value", n.User)
} }
if n.Nice >= cpuStats.Nice { if n.Nice >= cpuStats.Nice {
cpuStats.Nice = n.Nice cpuStats.Nice = n.Nice
} else { } else {
level.Debug(c.logger).Log("msg", "CPU Nice counter jumped backwards", "cpu", i, "old_value", cpuStats.Nice, "new_value", n.Nice) c.logger.Debug("CPU Nice counter jumped backwards", "cpu", i, "old_value", cpuStats.Nice, "new_value", n.Nice)
} }
if n.System >= cpuStats.System { if n.System >= cpuStats.System {
cpuStats.System = n.System cpuStats.System = n.System
} else { } else {
level.Debug(c.logger).Log("msg", "CPU System counter jumped backwards", "cpu", i, "old_value", cpuStats.System, "new_value", n.System) c.logger.Debug("CPU System counter jumped backwards", "cpu", i, "old_value", cpuStats.System, "new_value", n.System)
} }
if n.Iowait >= cpuStats.Iowait { if n.Iowait >= cpuStats.Iowait {
cpuStats.Iowait = n.Iowait cpuStats.Iowait = n.Iowait
} else { } else {
level.Debug(c.logger).Log("msg", "CPU Iowait counter jumped backwards", "cpu", i, "old_value", cpuStats.Iowait, "new_value", n.Iowait) c.logger.Debug("CPU Iowait counter jumped backwards", "cpu", i, "old_value", cpuStats.Iowait, "new_value", n.Iowait)
} }
if n.IRQ >= cpuStats.IRQ { if n.IRQ >= cpuStats.IRQ {
cpuStats.IRQ = n.IRQ cpuStats.IRQ = n.IRQ
} else { } else {
level.Debug(c.logger).Log("msg", "CPU IRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.IRQ, "new_value", n.IRQ) c.logger.Debug("CPU IRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.IRQ, "new_value", n.IRQ)
} }
if n.SoftIRQ >= cpuStats.SoftIRQ { if n.SoftIRQ >= cpuStats.SoftIRQ {
cpuStats.SoftIRQ = n.SoftIRQ cpuStats.SoftIRQ = n.SoftIRQ
} else { } else {
level.Debug(c.logger).Log("msg", "CPU SoftIRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.SoftIRQ, "new_value", n.SoftIRQ) c.logger.Debug("CPU SoftIRQ counter jumped backwards", "cpu", i, "old_value", cpuStats.SoftIRQ, "new_value", n.SoftIRQ)
} }
if n.Steal >= cpuStats.Steal { if n.Steal >= cpuStats.Steal {
cpuStats.Steal = n.Steal cpuStats.Steal = n.Steal
} else { } else {
level.Debug(c.logger).Log("msg", "CPU Steal counter jumped backwards", "cpu", i, "old_value", cpuStats.Steal, "new_value", n.Steal) c.logger.Debug("CPU Steal counter jumped backwards", "cpu", i, "old_value", cpuStats.Steal, "new_value", n.Steal)
} }
if n.Guest >= cpuStats.Guest { if n.Guest >= cpuStats.Guest {
cpuStats.Guest = n.Guest cpuStats.Guest = n.Guest
} else { } else {
level.Debug(c.logger).Log("msg", "CPU Guest counter jumped backwards", "cpu", i, "old_value", cpuStats.Guest, "new_value", n.Guest) c.logger.Debug("CPU Guest counter jumped backwards", "cpu", i, "old_value", cpuStats.Guest, "new_value", n.Guest)
} }
if n.GuestNice >= cpuStats.GuestNice { if n.GuestNice >= cpuStats.GuestNice {
cpuStats.GuestNice = n.GuestNice cpuStats.GuestNice = n.GuestNice
} else { } else {
level.Debug(c.logger).Log("msg", "CPU GuestNice counter jumped backwards", "cpu", i, "old_value", cpuStats.GuestNice, "new_value", n.GuestNice) c.logger.Debug("CPU GuestNice counter jumped backwards", "cpu", i, "old_value", cpuStats.GuestNice, "new_value", n.GuestNice)
} }
c.cpuStats[i] = cpuStats c.cpuStats[i] = cpuStats

@ -17,10 +17,11 @@
package collector package collector
import ( import (
"io"
"log/slog"
"reflect" "reflect"
"testing" "testing"
"github.com/go-kit/log"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -35,7 +36,7 @@ func makeTestCPUCollector(s map[int64]procfs.CPUStat) *cpuCollector {
dup := make(map[int64]procfs.CPUStat, len(s)) dup := make(map[int64]procfs.CPUStat, len(s))
copyStats(dup, s) copyStats(dup, s)
return &cpuCollector{ return &cpuCollector{
logger: log.NewNopLogger(), logger: slog.New(slog.NewTextHandler(io.Discard, nil)),
cpuStats: dup, cpuStats: dup,
} }
} }

@ -18,6 +18,7 @@ package collector
import ( import (
"errors" "errors"
"log/slog"
"math" "math"
"regexp" "regexp"
"sort" "sort"
@ -25,8 +26,6 @@ import (
"strings" "strings"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
@ -214,7 +213,7 @@ func getCPUTimes() ([]cputime, error) {
type statCollector struct { type statCollector struct {
cpu typedDesc cpu typedDesc
temp typedDesc temp typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -222,7 +221,7 @@ func init() {
} }
// NewStatCollector returns a new Collector exposing CPU stats. // NewStatCollector returns a new Collector exposing CPU stats.
func NewStatCollector(logger log.Logger) (Collector, error) { func NewStatCollector(logger *slog.Logger) (Collector, error) {
return &statCollector{ return &statCollector{
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue}, cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
temp: typedDesc{prometheus.NewDesc( temp: typedDesc{prometheus.NewDesc(
@ -269,7 +268,7 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) error {
if temp, ok := cpuTemperatures[cpu]; ok { if temp, ok := cpuTemperatures[cpu]; ok {
ch <- c.temp.mustNewConstMetric(temp, lcpu) ch <- c.temp.mustNewConstMetric(temp, lcpu)
} else { } else {
level.Debug(c.logger).Log("msg", "no temperature information for CPU", "cpu", cpu) c.logger.Debug("no temperature information for CPU", "cpu", cpu)
ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu) ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu)
} }
} }

@ -17,10 +17,10 @@
package collector package collector
import ( import (
"log/slog"
"strconv" "strconv"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -45,14 +45,14 @@ const (
type cpuCollector struct { type cpuCollector struct {
cpu typedDesc cpu typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
registerCollector("cpu", defaultEnabled, NewCPUCollector) registerCollector("cpu", defaultEnabled, NewCPUCollector)
} }
func NewCPUCollector(logger log.Logger) (Collector, error) { func NewCPUCollector(logger *slog.Logger) (Collector, error) {
return &cpuCollector{ return &cpuCollector{
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue}, cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
logger: logger, logger: logger,

@ -17,9 +17,9 @@
package collector package collector
import ( import (
"log/slog"
"strconv" "strconv"
"github.com/go-kit/log"
"github.com/illumos/go-kstat" "github.com/illumos/go-kstat"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -29,14 +29,14 @@ import "C"
type cpuCollector struct { type cpuCollector struct {
cpu typedDesc cpu typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
registerCollector("cpu", defaultEnabled, NewCpuCollector) registerCollector("cpu", defaultEnabled, NewCpuCollector)
} }
func NewCpuCollector(logger log.Logger) (Collector, error) { func NewCpuCollector(logger *slog.Logger) (Collector, error) {
return &cpuCollector{ return &cpuCollector{
cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue}, cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue},
logger: logger, logger: logger,

@ -15,8 +15,8 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/sysfs" "github.com/prometheus/procfs/sysfs"
) )
@ -40,7 +40,7 @@ func init() {
registerCollector(cpuVulerabilitiesCollector, defaultDisabled, NewVulnerabilitySysfsCollector) registerCollector(cpuVulerabilitiesCollector, defaultDisabled, NewVulnerabilitySysfsCollector)
} }
func NewVulnerabilitySysfsCollector(logger log.Logger) (Collector, error) { func NewVulnerabilitySysfsCollector(logger *slog.Logger) (Collector, error) {
return &cpuVulnerabilitiesCollector{}, nil return &cpuVulnerabilitiesCollector{}, nil
} }

@ -18,15 +18,15 @@ package collector
import ( import (
"fmt" "fmt"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/sysfs" "github.com/prometheus/procfs/sysfs"
"log/slog"
"strings" "strings"
) )
type cpuFreqCollector struct { type cpuFreqCollector struct {
fs sysfs.FS fs sysfs.FS
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -34,7 +34,7 @@ func init() {
} }
// NewCPUFreqCollector returns a new Collector exposing kernel/system statistics. // NewCPUFreqCollector returns a new Collector exposing kernel/system statistics.
func NewCPUFreqCollector(logger log.Logger) (Collector, error) { func NewCPUFreqCollector(logger *slog.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)

@ -18,9 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"strconv" "strconv"
"github.com/go-kit/log"
"github.com/illumos/go-kstat" "github.com/illumos/go-kstat"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -29,14 +29,14 @@ import (
import "C" import "C"
type cpuFreqCollector struct { type cpuFreqCollector struct {
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
registerCollector("cpufreq", defaultEnabled, NewCpuFreqCollector) registerCollector("cpufreq", defaultEnabled, NewCpuFreqCollector)
} }
func NewCpuFreqCollector(logger log.Logger) (Collector, error) { func NewCpuFreqCollector(logger *slog.Logger) (Collector, error) {
return &cpuFreqCollector{ return &cpuFreqCollector{
logger: logger, logger: logger,
}, nil }, nil

@ -19,8 +19,8 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -98,7 +98,7 @@ type devstatCollector struct {
bytesDesc *prometheus.Desc bytesDesc *prometheus.Desc
transfersDesc *prometheus.Desc transfersDesc *prometheus.Desc
blocksDesc *prometheus.Desc blocksDesc *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -106,7 +106,7 @@ func init() {
} }
// NewDevstatCollector returns a new Collector exposing Device stats. // NewDevstatCollector returns a new Collector exposing Device stats.
func NewDevstatCollector(logger log.Logger) (Collector, error) { func NewDevstatCollector(logger *slog.Logger) (Collector, error) {
return &devstatCollector{ return &devstatCollector{
bytesDesc: prometheus.NewDesc( bytesDesc: prometheus.NewDesc(
prometheus.BuildFQName(namespace, devstatSubsystem, "bytes_total"), prometheus.BuildFQName(namespace, devstatSubsystem, "bytes_total"),

@ -19,10 +19,10 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"sync" "sync"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -43,7 +43,7 @@ type devstatCollector struct {
duration typedDesc duration typedDesc
busyTime typedDesc busyTime typedDesc
blocks typedDesc blocks typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -51,7 +51,7 @@ func init() {
} }
// NewDevstatCollector returns a new Collector exposing Device stats. // NewDevstatCollector returns a new Collector exposing Device stats.
func NewDevstatCollector(logger log.Logger) (Collector, error) { func NewDevstatCollector(logger *slog.Logger) (Collector, error) {
return &devstatCollector{ return &devstatCollector{
devinfo: &C.struct_devinfo{}, devinfo: &C.struct_devinfo{},
bytes: typedDesc{prometheus.NewDesc( bytes: typedDesc{prometheus.NewDesc(

@ -19,10 +19,9 @@ package collector
import ( import (
"errors" "errors"
"log/slog"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -93,10 +92,10 @@ var (
) )
) )
func newDiskstatsDeviceFilter(logger log.Logger) (deviceFilter, error) { func newDiskstatsDeviceFilter(logger *slog.Logger) (deviceFilter, error) {
if *oldDiskstatsDeviceExclude != "" { if *oldDiskstatsDeviceExclude != "" {
if !diskstatsDeviceExcludeSet { if !diskstatsDeviceExcludeSet {
level.Warn(logger).Log("msg", "--collector.diskstats.ignored-devices is DEPRECATED and will be removed in 2.0.0, use --collector.diskstats.device-exclude") logger.Warn("--collector.diskstats.ignored-devices is DEPRECATED and will be removed in 2.0.0, use --collector.diskstats.device-exclude")
*diskstatsDeviceExclude = *oldDiskstatsDeviceExclude *diskstatsDeviceExclude = *oldDiskstatsDeviceExclude
} else { } else {
return deviceFilter{}, errors.New("--collector.diskstats.ignored-devices and --collector.diskstats.device-exclude are mutually exclusive") return deviceFilter{}, errors.New("--collector.diskstats.ignored-devices and --collector.diskstats.device-exclude are mutually exclusive")
@ -108,11 +107,11 @@ func newDiskstatsDeviceFilter(logger log.Logger) (deviceFilter, error) {
} }
if *diskstatsDeviceExclude != "" { if *diskstatsDeviceExclude != "" {
level.Info(logger).Log("msg", "Parsed flag --collector.diskstats.device-exclude", "flag", *diskstatsDeviceExclude) logger.Info("Parsed flag --collector.diskstats.device-exclude", "flag", *diskstatsDeviceExclude)
} }
if *diskstatsDeviceInclude != "" { if *diskstatsDeviceInclude != "" {
level.Info(logger).Log("msg", "Parsed Flag --collector.diskstats.device-include", "flag", *diskstatsDeviceInclude) logger.Info("Parsed Flag --collector.diskstats.device-include", "flag", *diskstatsDeviceInclude)
} }
return newDeviceFilter(*diskstatsDeviceExclude, *diskstatsDeviceInclude), nil return newDeviceFilter(*diskstatsDeviceExclude, *diskstatsDeviceInclude), nil

@ -18,8 +18,8 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/lufia/iostat" "github.com/lufia/iostat"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -35,7 +35,7 @@ type diskstatsCollector struct {
descs []typedDescFunc descs []typedDescFunc
deviceFilter deviceFilter deviceFilter deviceFilter
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -43,7 +43,7 @@ func init() {
} }
// NewDiskstatsCollector returns a new Collector exposing disk device stats. // NewDiskstatsCollector returns a new Collector exposing disk device stats.
func NewDiskstatsCollector(logger log.Logger) (Collector, error) { func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
var diskLabelNames = []string{"device"} var diskLabelNames = []string{"device"}
deviceFilter, err := newDiskstatsDeviceFilter(logger) deviceFilter, err := newDiskstatsDeviceFilter(logger)

@ -19,12 +19,11 @@ package collector
import ( import (
"bufio" "bufio"
"fmt" "fmt"
"log/slog"
"os" "os"
"strconv" "strconv"
"strings" "strings"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/blockdevice" "github.com/prometheus/procfs/blockdevice"
) )
@ -85,7 +84,7 @@ type diskstatsCollector struct {
filesystemInfoDesc typedFactorDesc filesystemInfoDesc typedFactorDesc
deviceMapperInfoDesc typedFactorDesc deviceMapperInfoDesc typedFactorDesc
ataDescs map[string]typedFactorDesc ataDescs map[string]typedFactorDesc
logger log.Logger logger *slog.Logger
getUdevDeviceProperties func(uint32, uint32) (udevInfo, error) getUdevDeviceProperties func(uint32, uint32) (udevInfo, error)
} }
@ -95,7 +94,7 @@ func init() {
// NewDiskstatsCollector returns a new Collector exposing disk device stats. // NewDiskstatsCollector returns a new Collector exposing disk device stats.
// Docs from https://www.kernel.org/doc/Documentation/iostats.txt // Docs from https://www.kernel.org/doc/Documentation/iostats.txt
func NewDiskstatsCollector(logger log.Logger) (Collector, error) { func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
var diskLabelNames = []string{"device"} var diskLabelNames = []string{"device"}
fs, err := blockdevice.NewFS(*procPath, *sysPath) fs, err := blockdevice.NewFS(*procPath, *sysPath)
if err != nil { if err != nil {
@ -262,7 +261,7 @@ func NewDiskstatsCollector(logger log.Logger) (Collector, error) {
// Only enable getting device properties from udev if the directory is readable. // Only enable getting device properties from udev if the directory is readable.
if stat, err := os.Stat(*udevDataPath); err != nil || !stat.IsDir() { if stat, err := os.Stat(*udevDataPath); err != nil || !stat.IsDir() {
level.Error(logger).Log("msg", "Failed to open directory, disabling udev device properties", "path", *udevDataPath) logger.Error("Failed to open directory, disabling udev device properties", "path", *udevDataPath)
} else { } else {
collector.getUdevDeviceProperties = getUdevDeviceProperties collector.getUdevDeviceProperties = getUdevDeviceProperties
} }
@ -284,7 +283,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
info, err := getUdevDeviceProperties(stats.MajorNumber, stats.MinorNumber) info, err := getUdevDeviceProperties(stats.MajorNumber, stats.MinorNumber)
if err != nil { if err != nil {
level.Debug(c.logger).Log("msg", "Failed to parse udev info", "err", err) c.logger.Debug("Failed to parse udev info", "err", err)
} }
// This is usually the serial printed on the disk label. // This is usually the serial printed on the disk label.
@ -355,14 +354,14 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error {
for attr, desc := range c.ataDescs { for attr, desc := range c.ataDescs {
str, ok := info[attr] str, ok := info[attr]
if !ok { if !ok {
level.Debug(c.logger).Log("msg", "Udev attribute does not exist", "attribute", attr) c.logger.Debug("Udev attribute does not exist", "attribute", attr)
continue continue
} }
if value, err := strconv.ParseFloat(str, 64); err == nil { if value, err := strconv.ParseFloat(str, 64); err == nil {
ch <- desc.mustNewConstMetric(value, dev) ch <- desc.mustNewConstMetric(value, dev)
} else { } else {
level.Error(c.logger).Log("msg", "Failed to parse ATA value", "err", err) c.logger.Error("Failed to parse ATA value", "err", err)
} }
} }
} }

@ -18,11 +18,11 @@ package collector
import ( import (
"fmt" "fmt"
"os" "io"
"log/slog"
"strings" "strings"
"testing" "testing"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil" "github.com/prometheus/client_golang/prometheus/testutil"
) )
@ -39,7 +39,7 @@ func (c testDiskStatsCollector) Describe(ch chan<- *prometheus.Desc) {
prometheus.DescribeByCollect(c, ch) prometheus.DescribeByCollect(c, ch)
} }
func NewTestDiskStatsCollector(logger log.Logger) (prometheus.Collector, error) { func NewTestDiskStatsCollector(logger *slog.Logger) (prometheus.Collector, error) {
dsc, err := NewDiskstatsCollector(logger) dsc, err := NewDiskstatsCollector(logger)
if err != nil { if err != nil {
return testDiskStatsCollector{}, err return testDiskStatsCollector{}, err
@ -317,7 +317,7 @@ node_disk_written_bytes_total{device="sr0"} 0
node_disk_written_bytes_total{device="vda"} 1.0938236928e+11 node_disk_written_bytes_total{device="vda"} 1.0938236928e+11
` `
logger := log.NewLogfmtLogger(os.Stderr) logger := slog.New(slog.NewTextHandler(io.Discard, nil))
collector, err := NewDiskstatsCollector(logger) collector, err := NewDiskstatsCollector(logger)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

@ -18,9 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -41,7 +41,7 @@ type diskstatsCollector struct {
time typedDesc time typedDesc
deviceFilter deviceFilter deviceFilter deviceFilter
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -49,7 +49,7 @@ func init() {
} }
// NewDiskstatsCollector returns a new Collector exposing disk device stats. // NewDiskstatsCollector returns a new Collector exposing disk device stats.
func NewDiskstatsCollector(logger log.Logger) (Collector, error) { func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
deviceFilter, err := newDiskstatsDeviceFilter(logger) deviceFilter, err := newDiskstatsDeviceFilter(logger)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse device filter flags: %w", err) return nil, fmt.Errorf("failed to parse device filter flags: %w", err)

@ -18,9 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"unsafe" "unsafe"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -52,7 +52,7 @@ type diskstatsCollector struct {
time typedDesc time typedDesc
deviceFilter deviceFilter deviceFilter deviceFilter
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -60,7 +60,7 @@ func init() {
} }
// NewDiskstatsCollector returns a new Collector exposing disk device stats. // NewDiskstatsCollector returns a new Collector exposing disk device stats.
func NewDiskstatsCollector(logger log.Logger) (Collector, error) { func NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {
deviceFilter, err := newDiskstatsDeviceFilter(logger) deviceFilter, err := newDiskstatsDeviceFilter(logger)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse device filter flags: %w", err) return nil, fmt.Errorf("failed to parse device filter flags: %w", err)

@ -19,11 +19,10 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"strings" "strings"
"github.com/go-kit/log"
"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"
) )
@ -38,7 +37,7 @@ func init() {
} }
// NewDMICollector returns a new Collector exposing DMI information. // NewDMICollector returns a new Collector exposing DMI information.
func NewDMICollector(logger log.Logger) (Collector, error) { func NewDMICollector(logger *slog.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)
@ -47,7 +46,7 @@ func NewDMICollector(logger log.Logger) (Collector, error) {
dmi, err := fs.DMIClass() dmi, err := fs.DMIClass()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(logger).Log("msg", "Platform does not support Desktop Management Interface (DMI) information", "err", err) logger.Debug("Platform does not support Desktop Management Interface (DMI) information", "err", err)
dmi = &sysfs.DMIClass{} dmi = &sysfs.DMIClass{}
} else { } else {
return nil, fmt.Errorf("failed to read Desktop Management Interface (DMI) information: %w", err) return nil, fmt.Errorf("failed to read Desktop Management Interface (DMI) information: %w", err)

@ -20,12 +20,11 @@ import (
"bufio" "bufio"
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"strconv" "strconv"
"strings" "strings"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -79,14 +78,14 @@ type drbdCollector struct {
numerical map[string]drbdNumericalMetric numerical map[string]drbdNumericalMetric
stringPair map[string]drbdStringPairMetric stringPair map[string]drbdStringPairMetric
connected *prometheus.Desc connected *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
registerCollector("drbd", defaultDisabled, newDRBDCollector) registerCollector("drbd", defaultDisabled, newDRBDCollector)
} }
func newDRBDCollector(logger log.Logger) (Collector, error) { func newDRBDCollector(logger *slog.Logger) (Collector, error) {
return &drbdCollector{ return &drbdCollector{
numerical: map[string]drbdNumericalMetric{ numerical: map[string]drbdNumericalMetric{
"ns": newDRBDNumericalMetric( "ns": newDRBDNumericalMetric(
@ -191,7 +190,7 @@ func (c *drbdCollector) Update(ch chan<- prometheus.Metric) error {
file, err := os.Open(statsFile) file, err := os.Open(statsFile)
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "stats file does not exist, skipping", "file", statsFile, "err", err) c.logger.Debug("stats file does not exist, skipping", "file", statsFile, "err", err)
return ErrNoData return ErrNoData
} }
@ -208,7 +207,7 @@ func (c *drbdCollector) Update(ch chan<- prometheus.Metric) error {
kv := strings.Split(field, ":") kv := strings.Split(field, ":")
if len(kv) != 2 { if len(kv) != 2 {
level.Debug(c.logger).Log("msg", "skipping invalid key:value pair", "field", field) c.logger.Debug("skipping invalid key:value pair", "field", field)
continue continue
} }
@ -274,7 +273,7 @@ func (c *drbdCollector) Update(ch chan<- prometheus.Metric) error {
continue continue
} }
level.Debug(c.logger).Log("msg", "unhandled key-value pair", "key", kv[0], "value", kv[1]) c.logger.Debug("unhandled key-value pair", "key", kv[0], "value", kv[1])
} }
return scanner.Err() return scanner.Err()

@ -18,8 +18,8 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/sysfs" "github.com/prometheus/procfs/sysfs"
) )
@ -30,7 +30,7 @@ const (
type drmCollector struct { type drmCollector struct {
fs sysfs.FS fs sysfs.FS
logger log.Logger logger *slog.Logger
CardInfo *prometheus.Desc CardInfo *prometheus.Desc
GPUBusyPercent *prometheus.Desc GPUBusyPercent *prometheus.Desc
MemoryGTTSize *prometheus.Desc MemoryGTTSize *prometheus.Desc
@ -46,7 +46,7 @@ func init() {
} }
// NewDrmCollector returns a new Collector exposing /sys/class/drm/card?/device stats. // NewDrmCollector returns a new Collector exposing /sys/class/drm/card?/device stats.
func NewDrmCollector(logger log.Logger) (Collector, error) { func NewDrmCollector(logger *slog.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)

@ -18,10 +18,10 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"path/filepath" "path/filepath"
"regexp" "regexp"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -39,7 +39,7 @@ type edacCollector struct {
ueCount *prometheus.Desc ueCount *prometheus.Desc
csRowCECount *prometheus.Desc csRowCECount *prometheus.Desc
csRowUECount *prometheus.Desc csRowUECount *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -47,7 +47,7 @@ func init() {
} }
// NewEdacCollector returns a new Collector exposing edac stats. // NewEdacCollector returns a new Collector exposing edac stats.
func NewEdacCollector(logger log.Logger) (Collector, error) { func NewEdacCollector(logger *slog.Logger) (Collector, error) {
return &edacCollector{ return &edacCollector{
ceCount: prometheus.NewDesc( ceCount: prometheus.NewDesc(
prometheus.BuildFQName(namespace, edacSubsystem, "correctable_errors_total"), prometheus.BuildFQName(namespace, edacSubsystem, "correctable_errors_total"),

@ -18,8 +18,8 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"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"
) )
@ -28,7 +28,7 @@ type entropyCollector struct {
fs procfs.FS fs procfs.FS
entropyAvail *prometheus.Desc entropyAvail *prometheus.Desc
entropyPoolSize *prometheus.Desc entropyPoolSize *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -36,7 +36,7 @@ func init() {
} }
// NewEntropyCollector returns a new Collector exposing entropy stats. // NewEntropyCollector returns a new Collector exposing entropy stats.
func NewEntropyCollector(logger log.Logger) (Collector, error) { func NewEntropyCollector(logger *slog.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)

@ -23,6 +23,7 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"regexp" "regexp"
"sort" "sort"
@ -31,8 +32,6 @@ import (
"syscall" "syscall"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"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"
"github.com/safchain/ethtool" "github.com/safchain/ethtool"
@ -79,13 +78,13 @@ type ethtoolCollector struct {
deviceFilter deviceFilter deviceFilter deviceFilter
infoDesc *prometheus.Desc infoDesc *prometheus.Desc
metricsPattern *regexp.Regexp metricsPattern *regexp.Regexp
logger log.Logger logger *slog.Logger
} }
// makeEthtoolCollector is the internal constructor for EthtoolCollector. // makeEthtoolCollector is the internal constructor for EthtoolCollector.
// This allows NewEthtoolTestCollector to override its .ethtool interface // This allows NewEthtoolTestCollector to override its .ethtool interface
// for testing. // for testing.
func makeEthtoolCollector(logger log.Logger) (*ethtoolCollector, error) { func makeEthtoolCollector(logger *slog.Logger) (*ethtoolCollector, 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)
@ -97,13 +96,13 @@ func makeEthtoolCollector(logger log.Logger) (*ethtoolCollector, error) {
} }
if *ethtoolDeviceInclude != "" { if *ethtoolDeviceInclude != "" {
level.Info(logger).Log("msg", "Parsed flag --collector.ethtool.device-include", "flag", *ethtoolDeviceInclude) logger.Info("Parsed flag --collector.ethtool.device-include", "flag", *ethtoolDeviceInclude)
} }
if *ethtoolDeviceExclude != "" { if *ethtoolDeviceExclude != "" {
level.Info(logger).Log("msg", "Parsed flag --collector.ethtool.device-exclude", "flag", *ethtoolDeviceExclude) logger.Info("Parsed flag --collector.ethtool.device-exclude", "flag", *ethtoolDeviceExclude)
} }
if *ethtoolIncludedMetrics != "" { if *ethtoolIncludedMetrics != "" {
level.Info(logger).Log("msg", "Parsed flag --collector.ethtool.metrics-include", "flag", *ethtoolIncludedMetrics) logger.Info("Parsed flag --collector.ethtool.metrics-include", "flag", *ethtoolIncludedMetrics)
} }
// Pre-populate some common ethtool metrics. // Pre-populate some common ethtool metrics.
@ -223,7 +222,7 @@ func buildEthtoolFQName(metric string) string {
} }
// NewEthtoolCollector returns a new Collector exposing ethtool stats. // NewEthtoolCollector returns a new Collector exposing ethtool stats.
func NewEthtoolCollector(logger log.Logger) (Collector, error) { func NewEthtoolCollector(logger *slog.Logger) (Collector, error) {
return makeEthtoolCollector(logger) return makeEthtoolCollector(logger)
} }
@ -376,7 +375,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
netClass, err := c.fs.NetClass() netClass, err := c.fs.NetClass()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission) { if errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission) {
level.Debug(c.logger).Log("msg", "Could not read netclass file", "err", err) c.logger.Debug("Could not read netclass file", "err", err)
return ErrNoData return ErrNoData
} }
return fmt.Errorf("could not get net class info: %w", err) return fmt.Errorf("could not get net class info: %w", err)
@ -405,12 +404,12 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
} else { } else {
if errno, ok := err.(syscall.Errno); ok { if errno, ok := err.(syscall.Errno); ok {
if err == unix.EOPNOTSUPP { if err == unix.EOPNOTSUPP {
level.Debug(c.logger).Log("msg", "ethtool link info error", "err", err, "device", device, "errno", uint(errno)) c.logger.Debug("ethtool link info error", "err", err, "device", device, "errno", uint(errno))
} else if errno != 0 { } else if errno != 0 {
level.Error(c.logger).Log("msg", "ethtool link info error", "err", err, "device", device, "errno", uint(errno)) c.logger.Error("ethtool link info error", "err", err, "device", device, "errno", uint(errno))
} }
} else { } else {
level.Error(c.logger).Log("msg", "ethtool link info error", "err", err, "device", device) c.logger.Error("ethtool link info error", "err", err, "device", device)
} }
} }
@ -422,12 +421,12 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
} else { } else {
if errno, ok := err.(syscall.Errno); ok { if errno, ok := err.(syscall.Errno); ok {
if err == unix.EOPNOTSUPP { if err == unix.EOPNOTSUPP {
level.Debug(c.logger).Log("msg", "ethtool driver info error", "err", err, "device", device, "errno", uint(errno)) c.logger.Debug("ethtool driver info error", "err", err, "device", device, "errno", uint(errno))
} else if errno != 0 { } else if errno != 0 {
level.Error(c.logger).Log("msg", "ethtool driver info error", "err", err, "device", device, "errno", uint(errno)) c.logger.Error("ethtool driver info error", "err", err, "device", device, "errno", uint(errno))
} }
} else { } else {
level.Error(c.logger).Log("msg", "ethtool driver info error", "err", err, "device", device) c.logger.Error("ethtool driver info error", "err", err, "device", device)
} }
} }
@ -438,12 +437,12 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
if err != nil { if err != nil {
if errno, ok := err.(syscall.Errno); ok { if errno, ok := err.(syscall.Errno); ok {
if err == unix.EOPNOTSUPP { if err == unix.EOPNOTSUPP {
level.Debug(c.logger).Log("msg", "ethtool stats error", "err", err, "device", device, "errno", uint(errno)) c.logger.Debug("ethtool stats error", "err", err, "device", device, "errno", uint(errno))
} else if errno != 0 { } else if errno != 0 {
level.Error(c.logger).Log("msg", "ethtool stats error", "err", err, "device", device, "errno", uint(errno)) c.logger.Error("ethtool stats error", "err", err, "device", device, "errno", uint(errno))
} }
} else { } else {
level.Error(c.logger).Log("msg", "ethtool stats error", "err", err, "device", device) c.logger.Error("ethtool stats error", "err", err, "device", device)
} }
} }
@ -462,7 +461,7 @@ func (c *ethtoolCollector) Update(ch chan<- prometheus.Metric) error {
metricFQName := buildEthtoolFQName(metricName) metricFQName := buildEthtoolFQName(metricName)
existingMetric, exists := metricFQNames[metricFQName] existingMetric, exists := metricFQNames[metricFQName]
if exists { if exists {
level.Debug(c.logger).Log("msg", "dropping duplicate metric name", "device", device, c.logger.Debug("dropping duplicate metric name", "device", device,
"metricFQName", metricFQName, "metric1", existingMetric, "metric2", metricName) "metricFQName", metricFQName, "metric1", existingMetric, "metric2", metricName)
// Keep the metricName as "deleted" in the dict in case there are 3 duplicates. // Keep the metricName as "deleted" in the dict in case there are 3 duplicates.
metricFQNames[metricFQName] = "" metricFQNames[metricFQName] = ""

@ -19,6 +19,8 @@ package collector
import ( import (
"bufio" "bufio"
"fmt" "fmt"
"io"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
"strconv" "strconv"
@ -26,7 +28,6 @@ import (
"syscall" "syscall"
"testing" "testing"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil" "github.com/prometheus/client_golang/prometheus/testutil"
"github.com/safchain/ethtool" "github.com/safchain/ethtool"
@ -49,7 +50,7 @@ func (c testEthtoolCollector) Describe(ch chan<- *prometheus.Desc) {
prometheus.DescribeByCollect(c, ch) prometheus.DescribeByCollect(c, ch)
} }
func NewTestEthtoolCollector(logger log.Logger) (prometheus.Collector, error) { func NewTestEthtoolCollector(logger *slog.Logger) (prometheus.Collector, error) {
dsc, err := NewEthtoolTestCollector(logger) dsc, err := NewEthtoolTestCollector(logger)
if err != nil { if err != nil {
return testEthtoolCollector{}, err return testEthtoolCollector{}, err
@ -255,7 +256,7 @@ func (e *EthtoolFixture) LinkInfo(intf string) (ethtool.EthtoolCmd, error) {
return res, err return res, err
} }
func NewEthtoolTestCollector(logger log.Logger) (Collector, error) { func NewEthtoolTestCollector(logger *slog.Logger) (Collector, error) {
collector, err := makeEthtoolCollector(logger) collector, err := makeEthtoolCollector(logger)
if err != nil { if err != nil {
return nil, err return nil, err
@ -370,7 +371,7 @@ node_network_supported_speed_bytes{device="eth0",duplex="half",mode="10baseT"} 1
` `
*sysPath = "fixtures/sys" *sysPath = "fixtures/sys"
logger := log.NewLogfmtLogger(os.Stderr) logger := slog.New(slog.NewTextHandler(io.Discard, nil))
collector, err := NewEthtoolTestCollector(logger) collector, err := NewEthtoolTestCollector(logger)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

@ -18,13 +18,13 @@
package collector package collector
import ( import (
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"log/slog"
) )
type execCollector struct { type execCollector struct {
sysctls []bsdSysctl sysctls []bsdSysctl
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -32,7 +32,7 @@ func init() {
} }
// NewExecCollector returns a new Collector exposing system execution statistics. // NewExecCollector returns a new Collector exposing system execution statistics.
func NewExecCollector(logger log.Logger) (Collector, error) { func NewExecCollector(logger *slog.Logger) (Collector, error) {
// From sys/vm/vm_meter.c: // From sys/vm/vm_meter.c:
// All are of type CTLTYPE_UINT. // All are of type CTLTYPE_UINT.
// //

@ -18,10 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"os" "os"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/node_exporter/collector/utils" "github.com/prometheus/node_exporter/collector/utils"
"github.com/prometheus/procfs/sysfs" "github.com/prometheus/procfs/sysfs"
@ -32,7 +31,7 @@ const maxUint64 = ^uint64(0)
type fibrechannelCollector struct { type fibrechannelCollector struct {
fs sysfs.FS fs sysfs.FS
metricDescs map[string]*prometheus.Desc metricDescs map[string]*prometheus.Desc
logger log.Logger logger *slog.Logger
subsystem string subsystem string
} }
@ -41,7 +40,7 @@ func init() {
} }
// NewFibreChannelCollector returns a new Collector exposing FibreChannel stats. // NewFibreChannelCollector returns a new Collector exposing FibreChannel stats.
func NewFibreChannelCollector(logger log.Logger) (Collector, error) { func NewFibreChannelCollector(logger *slog.Logger) (Collector, error) {
var i fibrechannelCollector var i fibrechannelCollector
var err error var err error
@ -99,7 +98,7 @@ func (c *fibrechannelCollector) Update(ch chan<- prometheus.Metric) error {
hosts, err := c.fs.FibreChannelClass() hosts, err := c.fs.FibreChannelClass()
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
level.Debug(c.logger).Log("msg", "fibrechannel statistics not found, skipping") c.logger.Debug("fibrechannel statistics not found, skipping")
return ErrNoData return ErrNoData
} }
return fmt.Errorf("error obtaining FibreChannel class info: %s", err) return fmt.Errorf("error obtaining FibreChannel class info: %s", err)

@ -20,10 +20,10 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"io" "io"
"log/slog"
"os" "os"
"strconv" "strconv"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -32,7 +32,7 @@ const (
) )
type fileFDStatCollector struct { type fileFDStatCollector struct {
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -40,7 +40,7 @@ func init() {
} }
// NewFileFDStatCollector returns a new Collector exposing file-nr stats. // NewFileFDStatCollector returns a new Collector exposing file-nr stats.
func NewFileFDStatCollector(logger log.Logger) (Collector, error) { func NewFileFDStatCollector(logger *slog.Logger) (Collector, error) {
return &fileFDStatCollector{logger}, nil return &fileFDStatCollector{logger}, nil
} }

@ -20,8 +20,6 @@ package collector
import ( import (
"errors" "errors"
"unsafe" "unsafe"
"github.com/go-kit/log/level"
) )
/* /*
@ -51,14 +49,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
for i := 0; i < int(count); i++ { for i := 0; i < int(count); i++ {
mountpoint := C.GoString(&mnt[i].f_mntonname[0]) mountpoint := C.GoString(&mnt[i].f_mntonname[0])
if c.excludedMountPointsPattern.MatchString(mountpoint) { if c.excludedMountPointsPattern.MatchString(mountpoint) {
level.Debug(c.logger).Log("msg", "Ignoring mount point", "mountpoint", mountpoint) c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
continue continue
} }
device := C.GoString(&mnt[i].f_mntfromname[0]) device := C.GoString(&mnt[i].f_mntfromname[0])
fstype := C.GoString(&mnt[i].f_fstypename[0]) fstype := C.GoString(&mnt[i].f_fstypename[0])
if c.excludedFSTypesPattern.MatchString(fstype) { if c.excludedFSTypesPattern.MatchString(fstype) {
level.Debug(c.logger).Log("msg", "Ignoring fs type", "type", fstype) c.logger.Debug("Ignoring fs type", "type", fstype)
continue continue
} }

@ -19,11 +19,10 @@ package collector
import ( import (
"errors" "errors"
"log/slog"
"regexp" "regexp"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -70,7 +69,7 @@ type filesystemCollector struct {
filesDesc, filesFreeDesc *prometheus.Desc filesDesc, filesFreeDesc *prometheus.Desc
roDesc, deviceErrorDesc *prometheus.Desc roDesc, deviceErrorDesc *prometheus.Desc
mountInfoDesc *prometheus.Desc mountInfoDesc *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
type filesystemLabels struct { type filesystemLabels struct {
@ -89,10 +88,10 @@ func init() {
} }
// NewFilesystemCollector returns a new Collector exposing filesystems stats. // NewFilesystemCollector returns a new Collector exposing filesystems stats.
func NewFilesystemCollector(logger log.Logger) (Collector, error) { func NewFilesystemCollector(logger *slog.Logger) (Collector, error) {
if *oldMountPointsExcluded != "" { if *oldMountPointsExcluded != "" {
if !mountPointsExcludeSet { if !mountPointsExcludeSet {
level.Warn(logger).Log("msg", "--collector.filesystem.ignored-mount-points is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.mount-points-exclude") logger.Warn("--collector.filesystem.ignored-mount-points is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.mount-points-exclude")
*mountPointsExclude = *oldMountPointsExcluded *mountPointsExclude = *oldMountPointsExcluded
} else { } else {
return nil, errors.New("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive") return nil, errors.New("--collector.filesystem.ignored-mount-points and --collector.filesystem.mount-points-exclude are mutually exclusive")
@ -101,7 +100,7 @@ func NewFilesystemCollector(logger log.Logger) (Collector, error) {
if *oldFSTypesExcluded != "" { if *oldFSTypesExcluded != "" {
if !fsTypesExcludeSet { if !fsTypesExcludeSet {
level.Warn(logger).Log("msg", "--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude") logger.Warn("--collector.filesystem.ignored-fs-types is DEPRECATED and will be removed in 2.0.0, use --collector.filesystem.fs-types-exclude")
*fsTypesExclude = *oldFSTypesExcluded *fsTypesExclude = *oldFSTypesExcluded
} else { } else {
return nil, errors.New("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive") return nil, errors.New("--collector.filesystem.ignored-fs-types and --collector.filesystem.fs-types-exclude are mutually exclusive")
@ -109,9 +108,9 @@ func NewFilesystemCollector(logger log.Logger) (Collector, error) {
} }
subsystem := "filesystem" subsystem := "filesystem"
level.Info(logger).Log("msg", "Parsed flag --collector.filesystem.mount-points-exclude", "flag", *mountPointsExclude) logger.Info("Parsed flag --collector.filesystem.mount-points-exclude", "flag", *mountPointsExclude)
mountPointPattern := regexp.MustCompile(*mountPointsExclude) mountPointPattern := regexp.MustCompile(*mountPointsExclude)
level.Info(logger).Log("msg", "Parsed flag --collector.filesystem.fs-types-exclude", "flag", *fsTypesExclude) logger.Info("Parsed flag --collector.filesystem.fs-types-exclude", "flag", *fsTypesExclude)
filesystemsTypesPattern := regexp.MustCompile(*fsTypesExclude) filesystemsTypesPattern := regexp.MustCompile(*fsTypesExclude)
sizeDesc := prometheus.NewDesc( sizeDesc := prometheus.NewDesc(

@ -17,7 +17,6 @@
package collector package collector
import ( import (
"github.com/go-kit/log/level"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -41,19 +40,19 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
for _, fs := range buf { for _, fs := range buf {
mountpoint := unix.ByteSliceToString(fs.Mntonname[:]) mountpoint := unix.ByteSliceToString(fs.Mntonname[:])
if c.excludedMountPointsPattern.MatchString(mountpoint) { if c.excludedMountPointsPattern.MatchString(mountpoint) {
level.Debug(c.logger).Log("msg", "Ignoring mount point", "mountpoint", mountpoint) c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
continue continue
} }
device := unix.ByteSliceToString(fs.Mntfromname[:]) device := unix.ByteSliceToString(fs.Mntfromname[:])
fstype := unix.ByteSliceToString(fs.Fstypename[:]) fstype := unix.ByteSliceToString(fs.Fstypename[:])
if c.excludedFSTypesPattern.MatchString(fstype) { if c.excludedFSTypesPattern.MatchString(fstype) {
level.Debug(c.logger).Log("msg", "Ignoring fs type", "type", fstype) c.logger.Debug("Ignoring fs type", "type", fstype)
continue continue
} }
if (fs.Flags & unix.MNT_IGNORE) != 0 { if (fs.Flags & unix.MNT_IGNORE) != 0 {
level.Debug(c.logger).Log("msg", "Ignoring mount flagged as ignore", "mountpoint", mountpoint) c.logger.Debug("Ignoring mount flagged as ignore", "mountpoint", mountpoint)
continue continue
} }

@ -21,14 +21,13 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"log/slog"
"os" "os"
"strings" "strings"
"sync" "sync"
"time" "time"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -75,11 +74,11 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
go func() { go func() {
for _, labels := range mps { for _, labels := range mps {
if c.excludedMountPointsPattern.MatchString(labels.mountPoint) { if c.excludedMountPointsPattern.MatchString(labels.mountPoint) {
level.Debug(c.logger).Log("msg", "Ignoring mount point", "mountpoint", labels.mountPoint) c.logger.Debug("Ignoring mount point", "mountpoint", labels.mountPoint)
continue continue
} }
if c.excludedFSTypesPattern.MatchString(labels.fsType) { if c.excludedFSTypesPattern.MatchString(labels.fsType) {
level.Debug(c.logger).Log("msg", "Ignoring fs", "type", labels.fsType) c.logger.Debug("Ignoring fs", "type", labels.fsType)
continue continue
} }
@ -90,7 +89,7 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
labels: labels, labels: labels,
deviceError: 1, deviceError: 1,
}) })
level.Debug(c.logger).Log("msg", "Mount point is in an unresponsive state", "mountpoint", labels.mountPoint) c.logger.Debug("Mount point is in an unresponsive state", "mountpoint", labels.mountPoint)
stuckMountsMtx.Unlock() stuckMountsMtx.Unlock()
continue continue
} }
@ -128,14 +127,14 @@ func (c *filesystemCollector) processStat(labels filesystemLabels) filesystemSta
// If the mount has been marked as stuck, unmark it and log it's recovery. // If the mount has been marked as stuck, unmark it and log it's recovery.
if _, ok := stuckMounts[labels.mountPoint]; ok { if _, ok := stuckMounts[labels.mountPoint]; ok {
level.Debug(c.logger).Log("msg", "Mount point has recovered, monitoring will resume", "mountpoint", labels.mountPoint) c.logger.Debug("Mount point has recovered, monitoring will resume", "mountpoint", labels.mountPoint)
delete(stuckMounts, labels.mountPoint) delete(stuckMounts, labels.mountPoint)
} }
stuckMountsMtx.Unlock() stuckMountsMtx.Unlock()
if err != nil { if err != nil {
labels.deviceError = err.Error() labels.deviceError = err.Error()
level.Debug(c.logger).Log("msg", "Error on statfs() system call", "rootfs", rootfsFilePath(labels.mountPoint), "err", err) c.logger.Debug("Error on statfs() system call", "rootfs", rootfsFilePath(labels.mountPoint), "err", err)
return filesystemStats{ return filesystemStats{
labels: labels, labels: labels,
deviceError: 1, deviceError: 1,
@ -157,7 +156,7 @@ func (c *filesystemCollector) processStat(labels filesystemLabels) filesystemSta
// stuckMountWatcher listens on the given success channel and if the channel closes // stuckMountWatcher listens on the given success channel and if the channel closes
// then the watcher does nothing. If instead the timeout is reached, the // then the watcher does nothing. If instead the timeout is reached, the
// mount point that is being watched is marked as stuck. // mount point that is being watched is marked as stuck.
func stuckMountWatcher(mountPoint string, success chan struct{}, logger log.Logger) { func stuckMountWatcher(mountPoint string, success chan struct{}, logger *slog.Logger) {
mountCheckTimer := time.NewTimer(*mountTimeout) mountCheckTimer := time.NewTimer(*mountTimeout)
defer mountCheckTimer.Stop() defer mountCheckTimer.Stop()
select { select {
@ -170,18 +169,18 @@ func stuckMountWatcher(mountPoint string, success chan struct{}, logger log.Logg
case <-success: case <-success:
// Success came in just after the timeout was reached, don't label the mount as stuck // Success came in just after the timeout was reached, don't label the mount as stuck
default: default:
level.Debug(logger).Log("msg", "Mount point timed out, it is being labeled as stuck and will not be monitored", "mountpoint", mountPoint) logger.Debug("Mount point timed out, it is being labeled as stuck and will not be monitored", "mountpoint", mountPoint)
stuckMounts[mountPoint] = struct{}{} stuckMounts[mountPoint] = struct{}{}
} }
stuckMountsMtx.Unlock() stuckMountsMtx.Unlock()
} }
} }
func mountPointDetails(logger log.Logger) ([]filesystemLabels, error) { func mountPointDetails(logger *slog.Logger) ([]filesystemLabels, error) {
file, err := os.Open(procFilePath("1/mountinfo")) file, err := os.Open(procFilePath("1/mountinfo"))
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
// Fallback to `/proc/self/mountinfo` if `/proc/1/mountinfo` is missing due hidepid. // Fallback to `/proc/self/mountinfo` if `/proc/1/mountinfo` is missing due hidepid.
level.Debug(logger).Log("msg", "Reading root mounts failed, falling back to self mounts", "err", err) logger.Debug("Reading root mounts failed, falling back to self mounts", "err", err)
file, err = os.Open(procFilePath("self/mountinfo")) file, err = os.Open(procFilePath("self/mountinfo"))
} }
if err != nil { if err != nil {

@ -17,11 +17,12 @@
package collector package collector
import ( import (
"io"
"log/slog"
"strings" "strings"
"testing" "testing"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
) )
func Test_parseFilesystemLabelsError(t *testing.T) { func Test_parseFilesystemLabelsError(t *testing.T) {
@ -82,7 +83,7 @@ func TestMountPointDetails(t *testing.T) {
"/var/lib/kubelet/plugins/kubernetes.io/vsphere-volume/mounts/[vsanDatastore] bafb9e5a-8856-7e6c-699c-801844e77a4a/kubernetes-dynamic-pvc-3eba5bba-48a3-11e8-89ab-005056b92113.vmdk": "", "/var/lib/kubelet/plugins/kubernetes.io/vsphere-volume/mounts/[vsanDatastore] bafb9e5a-8856-7e6c-699c-801844e77a4a/kubernetes-dynamic-pvc-3eba5bba-48a3-11e8-89ab-005056b92113.vmdk": "",
} }
filesystems, err := mountPointDetails(log.NewNopLogger()) filesystems, err := mountPointDetails(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
t.Log(err) t.Log(err)
} }
@ -111,7 +112,7 @@ func TestMountsFallback(t *testing.T) {
"/": "", "/": "",
} }
filesystems, err := mountPointDetails(log.NewNopLogger()) filesystems, err := mountPointDetails(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
t.Log(err) t.Log(err)
} }
@ -139,7 +140,7 @@ func TestPathRootfs(t *testing.T) {
"/sys/fs/cgroup": "", "/sys/fs/cgroup": "",
} }
filesystems, err := mountPointDetails(log.NewNopLogger()) filesystems, err := mountPointDetails(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
t.Log(err) t.Log(err)
} }

@ -17,7 +17,6 @@
package collector package collector
import ( import (
"github.com/go-kit/log/level"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -43,14 +42,14 @@ func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) {
for _, v := range mnt { for _, v := range mnt {
mountpoint := unix.ByteSliceToString(v.F_mntonname[:]) mountpoint := unix.ByteSliceToString(v.F_mntonname[:])
if c.excludedMountPointsPattern.MatchString(mountpoint) { if c.excludedMountPointsPattern.MatchString(mountpoint) {
level.Debug(c.logger).Log("msg", "Ignoring mount point", "mountpoint", mountpoint) c.logger.Debug("Ignoring mount point", "mountpoint", mountpoint)
continue continue
} }
device := unix.ByteSliceToString(v.F_mntfromname[:]) device := unix.ByteSliceToString(v.F_mntfromname[:])
fstype := unix.ByteSliceToString(v.F_fstypename[:]) fstype := unix.ByteSliceToString(v.F_fstypename[:])
if c.excludedFSTypesPattern.MatchString(fstype) { if c.excludedFSTypesPattern.MatchString(fstype) {
level.Debug(c.logger).Log("msg", "Ignoring fs type", "type", fstype) c.logger.Debug("Ignoring fs type", "type", fstype)
continue continue
} }

@ -18,6 +18,7 @@ package collector
import ( import (
"errors" "errors"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
"regexp" "regexp"
@ -25,8 +26,6 @@ import (
"strings" "strings"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -55,12 +54,12 @@ func init() {
type hwMonCollector struct { type hwMonCollector struct {
deviceFilter deviceFilter deviceFilter deviceFilter
sensorFilter deviceFilter sensorFilter deviceFilter
logger log.Logger logger *slog.Logger
} }
// NewHwMonCollector returns a new Collector exposing /sys/class/hwmon stats // NewHwMonCollector returns a new Collector exposing /sys/class/hwmon stats
// (similar to lm-sensors). // (similar to lm-sensors).
func NewHwMonCollector(logger log.Logger) (Collector, error) { func NewHwMonCollector(logger *slog.Logger) (Collector, error) {
return &hwMonCollector{ return &hwMonCollector{
logger: logger, logger: logger,
@ -168,7 +167,7 @@ func (c *hwMonCollector) updateHwmon(ch chan<- prometheus.Metric, dir string) er
} }
if c.deviceFilter.ignored(hwmonName) { if c.deviceFilter.ignored(hwmonName) {
level.Debug(c.logger).Log("msg", "ignoring hwmon chip", "chip", hwmonName) c.logger.Debug("ignoring hwmon chip", "chip", hwmonName)
return nil return nil
} }
@ -211,7 +210,7 @@ func (c *hwMonCollector) updateHwmon(ch chan<- prometheus.Metric, dir string) er
// sensors on specific devices. For example, to exclude the sensor "temp3" on // sensors on specific devices. For example, to exclude the sensor "temp3" on
// the device "platform_coretemp_0", use "platform_coretemp_0;temp3" // the device "platform_coretemp_0", use "platform_coretemp_0;temp3"
if c.sensorFilter.ignored(hwmonName + ";" + sensor) { if c.sensorFilter.ignored(hwmonName + ";" + sensor) {
level.Debug(c.logger).Log("msg", "ignoring sensor", "sensor", sensor) c.logger.Debug("ignoring sensor", "sensor", sensor)
continue continue
} }
@ -450,7 +449,7 @@ func (c *hwMonCollector) Update(ch chan<- prometheus.Metric) error {
hwmonFiles, err := os.ReadDir(hwmonPathName) hwmonFiles, err := os.ReadDir(hwmonPathName)
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "hwmon collector metrics are not available for this system") c.logger.Debug("hwmon collector metrics are not available for this system")
return ErrNoData return ErrNoData
} }

@ -19,11 +19,10 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"strconv" "strconv"
"github.com/go-kit/log"
"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"
) )
@ -31,7 +30,7 @@ import (
type infinibandCollector struct { type infinibandCollector struct {
fs sysfs.FS fs sysfs.FS
metricDescs map[string]*prometheus.Desc metricDescs map[string]*prometheus.Desc
logger log.Logger logger *slog.Logger
subsystem string subsystem string
} }
@ -40,7 +39,7 @@ func init() {
} }
// NewInfiniBandCollector returns a new Collector exposing InfiniBand stats. // NewInfiniBandCollector returns a new Collector exposing InfiniBand stats.
func NewInfiniBandCollector(logger log.Logger) (Collector, error) { func NewInfiniBandCollector(logger *slog.Logger) (Collector, error) {
var i infinibandCollector var i infinibandCollector
var err error var err error
@ -116,7 +115,7 @@ func (c *infinibandCollector) Update(ch chan<- prometheus.Metric) error {
devices, err := c.fs.InfiniBandClass() devices, err := c.fs.InfiniBandClass()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "infiniband statistics not found, skipping") c.logger.Debug("infiniband statistics not found, skipping")
return ErrNoData return ErrNoData
} }
return fmt.Errorf("error obtaining InfiniBand class info: %w", err) return fmt.Errorf("error obtaining InfiniBand class info: %w", err)

@ -19,13 +19,13 @@ package collector
import ( import (
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"log/slog"
) )
type interruptsCollector struct { type interruptsCollector struct {
desc typedDesc desc typedDesc
logger log.Logger logger *slog.Logger
nameFilter deviceFilter nameFilter deviceFilter
includeZeros bool includeZeros bool
} }
@ -41,7 +41,7 @@ var (
) )
// NewInterruptsCollector returns a new Collector exposing interrupts stats. // NewInterruptsCollector returns a new Collector exposing interrupts stats.
func NewInterruptsCollector(logger log.Logger) (Collector, error) { func NewInterruptsCollector(logger *slog.Logger) (Collector, error) {
return &interruptsCollector{ return &interruptsCollector{
desc: typedDesc{prometheus.NewDesc( desc: typedDesc{prometheus.NewDesc(
namespace+"_interrupts_total", namespace+"_interrupts_total",

@ -25,7 +25,6 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -42,7 +41,7 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) (err error) {
for cpuNo, value := range interrupt.values { for cpuNo, value := range interrupt.values {
filterName := name + ";" + interrupt.info + ";" + interrupt.devices filterName := name + ";" + interrupt.info + ";" + interrupt.devices
if c.nameFilter.ignored(filterName) { if c.nameFilter.ignored(filterName) {
level.Debug(c.logger).Log("msg", "ignoring interrupt name", "filter_name", filterName) c.logger.Debug("ignoring interrupt name", "filter_name", filterName)
continue continue
} }
fv, err := strconv.ParseFloat(value, 64) fv, err := strconv.ParseFloat(value, 64)
@ -50,7 +49,7 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) (err error) {
return fmt.Errorf("invalid value %s in interrupts: %w", value, err) return fmt.Errorf("invalid value %s in interrupts: %w", value, err)
} }
if !c.includeZeros && fv == 0.0 { if !c.includeZeros && fv == 0.0 {
level.Debug(c.logger).Log("msg", "ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo) c.logger.Debug("ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
continue continue
} }
ch <- c.desc.mustNewConstMetric(fv, strconv.Itoa(cpuNo), name, interrupt.info, interrupt.devices) ch <- c.desc.mustNewConstMetric(fv, strconv.Itoa(cpuNo), name, interrupt.info, interrupt.devices)

@ -20,7 +20,6 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -110,11 +109,11 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) error {
interruptType := fmt.Sprintf("%d", interrupt.vector) interruptType := fmt.Sprintf("%d", interrupt.vector)
filterName := interruptType + ";" + dev filterName := interruptType + ";" + dev
if c.nameFilter.ignored(filterName) { if c.nameFilter.ignored(filterName) {
level.Debug(c.logger).Log("msg", "ignoring interrupt name", "filter_name", filterName) c.logger.Debug("ignoring interrupt name", "filter_name", filterName)
continue continue
} }
if !c.includeZeros && value == 0.0 { if !c.includeZeros && value == 0.0 {
level.Debug(c.logger).Log("msg", "ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo) c.logger.Debug("ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
continue continue
} }
ch <- c.desc.mustNewConstMetric( ch <- c.desc.mustNewConstMetric(

@ -21,7 +21,6 @@ import (
"strconv" "strconv"
"unsafe" "unsafe"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -81,11 +80,11 @@ func (c *interruptsCollector) Update(ch chan<- prometheus.Metric) error {
interruptType := fmt.Sprintf("%d", interrupt.vector) interruptType := fmt.Sprintf("%d", interrupt.vector)
filterName := interruptType + ";" + dev filterName := interruptType + ";" + dev
if c.nameFilter.ignored(filterName) { if c.nameFilter.ignored(filterName) {
level.Debug(c.logger).Log("msg", "ignoring interrupt name", "filter_name", filterName) c.logger.Debug("ignoring interrupt name", "filter_name", filterName)
continue continue
} }
if !c.includeZeros && value == 0.0 { if !c.includeZeros && value == 0.0 {
level.Debug(c.logger).Log("msg", "ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo) c.logger.Debug("ignoring interrupt with zero value", "filter_name", filterName, "cpu", cpuNo)
continue continue
} }
ch <- c.desc.mustNewConstMetric( ch <- c.desc.mustNewConstMetric(

@ -19,14 +19,13 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"sort" "sort"
"strconv" "strconv"
"strings" "strings"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -37,7 +36,7 @@ type ipvsCollector struct {
backendLabels []string backendLabels []string
backendConnectionsActive, backendConnectionsInact, backendWeight typedDesc backendConnectionsActive, backendConnectionsInact, backendWeight typedDesc
connections, incomingPackets, outgoingPackets, incomingBytes, outgoingBytes typedDesc connections, incomingPackets, outgoingPackets, incomingBytes, outgoingBytes typedDesc
logger log.Logger logger *slog.Logger
} }
type ipvsBackendStatus struct { type ipvsBackendStatus struct {
@ -73,11 +72,11 @@ func init() {
// NewIPVSCollector sets up a new collector for IPVS metrics. It accepts the // NewIPVSCollector sets up a new collector for IPVS metrics. It accepts the
// "procfs" config parameter to override the default proc location (/proc). // "procfs" config parameter to override the default proc location (/proc).
func NewIPVSCollector(logger log.Logger) (Collector, error) { func NewIPVSCollector(logger *slog.Logger) (Collector, error) {
return newIPVSCollector(logger) return newIPVSCollector(logger)
} }
func newIPVSCollector(logger log.Logger) (*ipvsCollector, error) { func newIPVSCollector(logger *slog.Logger) (*ipvsCollector, error) {
var ( var (
c ipvsCollector c ipvsCollector
err error err error
@ -143,7 +142,7 @@ func (c *ipvsCollector) Update(ch chan<- prometheus.Metric) error {
if err != nil { if err != nil {
// Cannot access ipvs metrics, report no error. // Cannot access ipvs metrics, report no error.
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "ipvs collector metrics are not available for this system") c.logger.Debug("ipvs collector metrics are not available for this system")
return ErrNoData return ErrNoData
} }
return fmt.Errorf("could not get IPVS stats: %w", err) return fmt.Errorf("could not get IPVS stats: %w", err)

@ -19,14 +19,14 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"io"
"log/slog"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"os" "os"
"strings" "strings"
"testing" "testing"
"github.com/go-kit/log"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
@ -114,7 +114,7 @@ func TestIPVSCollector(t *testing.T) {
if _, err := kingpin.CommandLine.Parse(args); err != nil { if _, err := kingpin.CommandLine.Parse(args); err != nil {
t.Fatal(err) t.Fatal(err)
} }
collector, err := newIPVSCollector(log.NewNopLogger()) collector, err := newIPVSCollector(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
if test.err == nil { if test.err == nil {
t.Fatal(err) t.Fatal(err)
@ -182,7 +182,7 @@ func TestIPVSCollectorResponse(t *testing.T) {
if _, err := kingpin.CommandLine.Parse(args); err != nil { if _, err := kingpin.CommandLine.Parse(args); err != nil {
t.Fatal(err) t.Fatal(err)
} }
collector, err := NewIPVSCollector(log.NewNopLogger()) collector, err := NewIPVSCollector(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

@ -18,9 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"path/filepath" "path/filepath"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -31,7 +31,7 @@ var (
type ksmdCollector struct { type ksmdCollector struct {
metricDescs map[string]*prometheus.Desc metricDescs map[string]*prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -50,7 +50,7 @@ func getCanonicalMetricName(filename string) string {
} }
// NewKsmdCollector returns a new Collector exposing kernel/system statistics. // NewKsmdCollector returns a new Collector exposing kernel/system statistics.
func NewKsmdCollector(logger log.Logger) (Collector, error) { func NewKsmdCollector(logger *slog.Logger) (Collector, error) {
subsystem := "ksmd" subsystem := "ksmd"
descs := make(map[string]*prometheus.Desc) descs := make(map[string]*prometheus.Desc)

@ -18,22 +18,22 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"strconv" "strconv"
"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"
) )
type lnstatCollector struct { type lnstatCollector struct {
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
registerCollector("lnstat", defaultDisabled, NewLnstatCollector) registerCollector("lnstat", defaultDisabled, NewLnstatCollector)
} }
func NewLnstatCollector(logger log.Logger) (Collector, error) { func NewLnstatCollector(logger *slog.Logger) (Collector, error) {
return &lnstatCollector{logger}, nil return &lnstatCollector{logger}, nil
} }

@ -19,15 +19,14 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
type loadavgCollector struct { type loadavgCollector struct {
metric []typedDesc metric []typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -35,7 +34,7 @@ func init() {
} }
// NewLoadavgCollector returns a new Collector exposing load average stats. // NewLoadavgCollector returns a new Collector exposing load average stats.
func NewLoadavgCollector(logger log.Logger) (Collector, error) { func NewLoadavgCollector(logger *slog.Logger) (Collector, error) {
return &loadavgCollector{ return &loadavgCollector{
metric: []typedDesc{ metric: []typedDesc{
{prometheus.NewDesc(namespace+"_load1", "1m load average.", nil, nil), prometheus.GaugeValue}, {prometheus.NewDesc(namespace+"_load1", "1m load average.", nil, nil), prometheus.GaugeValue},
@ -52,7 +51,7 @@ func (c *loadavgCollector) Update(ch chan<- prometheus.Metric) error {
return fmt.Errorf("couldn't get load: %w", err) return fmt.Errorf("couldn't get load: %w", err)
} }
for i, load := range loads { for i, load := range loads {
level.Debug(c.logger).Log("msg", "return load", "index", i, "load", load) c.logger.Debug("return load", "index", i, "load", load)
ch <- c.metric[i].mustNewConstMetric(load) ch <- c.metric[i].mustNewConstMetric(load)
} }
return err return err

@ -18,10 +18,10 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"os" "os"
"strconv" "strconv"
"github.com/go-kit/log"
"github.com/godbus/dbus/v5" "github.com/godbus/dbus/v5"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -46,7 +46,7 @@ var (
) )
type logindCollector struct { type logindCollector struct {
logger log.Logger logger *slog.Logger
} }
type logindDbus struct { type logindDbus struct {
@ -86,7 +86,7 @@ func init() {
} }
// NewLogindCollector returns a new Collector exposing logind statistics. // NewLogindCollector returns a new Collector exposing logind statistics.
func NewLogindCollector(logger log.Logger) (Collector, error) { func NewLogindCollector(logger *slog.Logger) (Collector, error) {
return &logindCollector{logger}, nil return &logindCollector{logger}, nil
} }

@ -19,16 +19,15 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
type mdadmCollector struct { type mdadmCollector struct {
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -36,7 +35,7 @@ func init() {
} }
// NewMdadmCollector returns a new Collector exposing raid statistics. // NewMdadmCollector returns a new Collector exposing raid statistics.
func NewMdadmCollector(logger log.Logger) (Collector, error) { func NewMdadmCollector(logger *slog.Logger) (Collector, error) {
return &mdadmCollector{logger}, nil return &mdadmCollector{logger}, nil
} }
@ -112,7 +111,7 @@ func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "Not collecting mdstat, file does not exist", "file", *procPath) c.logger.Debug("Not collecting mdstat, file does not exist", "file", *procPath)
return ErrNoData return ErrNoData
} }
@ -120,7 +119,7 @@ func (c *mdadmCollector) Update(ch chan<- prometheus.Metric) error {
} }
for _, mdStat := range mdStats { for _, mdStat := range mdStats {
level.Debug(c.logger).Log("msg", "collecting metrics for device", "device", mdStat.Name) c.logger.Debug("collecting metrics for device", "device", mdStat.Name)
stateVals := make(map[string]float64) stateVals := make(map[string]float64)
stateVals[mdStat.ActivityState] = 1 stateVals[mdStat.ActivityState] = 1

@ -21,7 +21,6 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -41,7 +40,7 @@ func (c *meminfoCollector) Update(ch chan<- prometheus.Metric) error {
if err != nil { if err != nil {
return fmt.Errorf("couldn't get meminfo: %w", err) return fmt.Errorf("couldn't get meminfo: %w", err)
} }
level.Debug(c.logger).Log("msg", "Set node_mem", "memInfo", fmt.Sprintf("%v", memInfo)) c.logger.Debug("Set node_mem", "memInfo", fmt.Sprintf("%v", memInfo))
for k, v := range memInfo { for k, v := range memInfo {
if strings.HasSuffix(k, "_total") { if strings.HasSuffix(k, "_total") {
metricType = prometheus.CounterValue metricType = prometheus.CounterValue

@ -24,18 +24,18 @@ import "C"
import ( import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"log/slog"
"unsafe" "unsafe"
"github.com/go-kit/log"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
type meminfoCollector struct { type meminfoCollector struct {
logger log.Logger logger *slog.Logger
} }
// NewMeminfoCollector returns a new Collector exposing memory stats. // NewMeminfoCollector returns a new Collector exposing memory stats.
func NewMeminfoCollector(logger log.Logger) (Collector, error) { func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
return &meminfoCollector{ return &meminfoCollector{
logger: logger, logger: logger,
}, nil }, nil

@ -18,18 +18,18 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
type meminfoCollector struct { type meminfoCollector struct {
fs procfs.FS fs procfs.FS
logger log.Logger logger *slog.Logger
} }
// NewMeminfoCollector returns a new Collector exposing memory stats. // NewMeminfoCollector returns a new Collector exposing memory stats.
func NewMeminfoCollector(logger log.Logger) (Collector, error) { func NewMeminfoCollector(logger *slog.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)

@ -17,15 +17,14 @@
package collector package collector
import ( import (
"os" "io"
"log/slog"
"testing" "testing"
"github.com/go-kit/log"
) )
func TestMemInfo(t *testing.T) { func TestMemInfo(t *testing.T) {
*procPath = "fixtures/proc" *procPath = "fixtures/proc"
logger := log.NewLogfmtLogger(os.Stderr) logger := slog.New(slog.NewTextHandler(io.Discard, nil))
collector, err := NewMeminfoCollector(logger) collector, err := NewMeminfoCollector(logger)
if err != nil { if err != nil {

@ -17,16 +17,16 @@
package collector package collector
import ( import (
"github.com/go-kit/log"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"log/slog"
) )
type meminfoCollector struct { type meminfoCollector struct {
logger log.Logger logger *slog.Logger
} }
// NewMeminfoCollector returns a new Collector exposing memory stats. // NewMeminfoCollector returns a new Collector exposing memory stats.
func NewMeminfoCollector(logger log.Logger) (Collector, error) { func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
return &meminfoCollector{ return &meminfoCollector{
logger: logger, logger: logger,
}, nil }, nil

@ -20,13 +20,13 @@ import (
"bufio" "bufio"
"fmt" "fmt"
"io" "io"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
"regexp" "regexp"
"strconv" "strconv"
"strings" "strings"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -45,7 +45,7 @@ type meminfoMetric struct {
type meminfoNumaCollector struct { type meminfoNumaCollector struct {
metricDescs map[string]*prometheus.Desc metricDescs map[string]*prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -53,7 +53,7 @@ func init() {
} }
// NewMeminfoNumaCollector returns a new Collector exposing memory stats. // NewMeminfoNumaCollector returns a new Collector exposing memory stats.
func NewMeminfoNumaCollector(logger log.Logger) (Collector, error) { func NewMeminfoNumaCollector(logger *slog.Logger) (Collector, error) {
return &meminfoNumaCollector{ return &meminfoNumaCollector{
metricDescs: map[string]*prometheus.Desc{}, metricDescs: map[string]*prometheus.Desc{},
logger: logger, logger: logger,

@ -18,8 +18,7 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
) )
/* /*
@ -56,11 +55,11 @@ sysctl_bcstats(struct bcachestats *bcstats)
import "C" import "C"
type meminfoCollector struct { type meminfoCollector struct {
logger log.Logger logger *slog.Logger
} }
// NewMeminfoCollector returns a new Collector exposing memory stats. // NewMeminfoCollector returns a new Collector exposing memory stats.
func NewMeminfoCollector(logger log.Logger) (Collector, error) { func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
return &meminfoCollector{ return &meminfoCollector{
logger: logger, logger: logger,
}, nil }, nil

@ -17,9 +17,9 @@
package collector package collector
import ( import (
"log/slog"
"unsafe" "unsafe"
"github.com/go-kit/log"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -51,11 +51,11 @@ type bcachestats struct {
} }
type meminfoCollector struct { type meminfoCollector struct {
logger log.Logger logger *slog.Logger
} }
// NewMeminfoCollector returns a new Collector exposing memory stats. // NewMeminfoCollector returns a new Collector exposing memory stats.
func NewMeminfoCollector(logger log.Logger) (Collector, error) { func NewMeminfoCollector(logger *slog.Logger) (Collector, error) {
return &meminfoCollector{ return &meminfoCollector{
logger: logger, logger: logger,
}, nil }, nil

@ -19,8 +19,8 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -33,7 +33,7 @@ type memoryCollector struct {
pageSize uint64 pageSize uint64
sysctls []bsdSysctl sysctls []bsdSysctl
kvm kvm kvm kvm
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -41,7 +41,7 @@ func init() {
} }
// NewMemoryCollector returns a new Collector exposing memory stats. // NewMemoryCollector returns a new Collector exposing memory stats.
func NewMemoryCollector(logger log.Logger) (Collector, error) { func NewMemoryCollector(logger *slog.Logger) (Collector, error) {
tmp32, err := unix.SysctlUint32("vm.stats.vm.v_page_size") tmp32, err := unix.SysctlUint32("vm.stats.vm.v_page_size")
if err != nil { if err != nil {
return nil, fmt.Errorf("sysctl(vm.stats.vm.v_page_size) failed: %w", err) return nil, fmt.Errorf("sysctl(vm.stats.vm.v_page_size) failed: %w", err)

@ -18,9 +18,8 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -96,7 +95,7 @@ type mountStatsCollector struct {
proc procfs.Proc proc procfs.Proc
logger log.Logger logger *slog.Logger
} }
// used to uniquely identify an NFS mount to prevent duplicates // used to uniquely identify an NFS mount to prevent duplicates
@ -111,7 +110,7 @@ func init() {
} }
// NewMountStatsCollector returns a new Collector exposing NFS statistics. // NewMountStatsCollector returns a new Collector exposing NFS statistics.
func NewMountStatsCollector(logger log.Logger) (Collector, error) { func NewMountStatsCollector(logger *slog.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)
@ -542,7 +541,7 @@ func (c *mountStatsCollector) Update(ch chan<- prometheus.Metric) error {
deviceIdentifier := nfsDeviceIdentifier{m.Device, stats.Transport[k].Protocol, mountAddress} deviceIdentifier := nfsDeviceIdentifier{m.Device, stats.Transport[k].Protocol, mountAddress}
i := deviceList[deviceIdentifier] i := deviceList[deviceIdentifier]
if i { if i {
level.Debug(c.logger).Log("msg", "Skipping duplicate device entry", "device", deviceIdentifier) c.logger.Debug("Skipping duplicate device entry", "device", deviceIdentifier)
break break
} }
deviceList[deviceIdentifier] = true deviceList[deviceIdentifier] = true

@ -19,14 +19,13 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"net" "net"
"os" "os"
"regexp" "regexp"
"sync" "sync"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"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"
) )
@ -43,7 +42,7 @@ type netClassCollector struct {
ignoredDevicesPattern *regexp.Regexp ignoredDevicesPattern *regexp.Regexp
metricDescs map[string]*prometheus.Desc metricDescs map[string]*prometheus.Desc
metricDescsMu sync.Mutex metricDescsMu sync.Mutex
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -51,7 +50,7 @@ func init() {
} }
// NewNetClassCollector returns a new Collector exposing network class stats. // NewNetClassCollector returns a new Collector exposing network class stats.
func NewNetClassCollector(logger log.Logger) (Collector, error) { func NewNetClassCollector(logger *slog.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)
@ -77,7 +76,7 @@ func (c *netClassCollector) netClassSysfsUpdate(ch chan<- prometheus.Metric) err
netClass, err := c.getNetClassInfo() netClass, err := c.getNetClassInfo()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission) { if errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission) {
level.Debug(c.logger).Log("msg", "Could not read netclass file", "err", err) c.logger.Debug("Could not read netclass file", "err", err)
return ErrNoData return ErrNoData
} }
return fmt.Errorf("could not get net class info: %w", err) return fmt.Errorf("could not get net class info: %w", err)

@ -23,7 +23,6 @@ import (
"path/filepath" "path/filepath"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log/level"
"github.com/jsimonetti/rtnetlink" "github.com/jsimonetti/rtnetlink"
"github.com/mdlayher/ethtool" "github.com/mdlayher/ethtool"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
@ -45,7 +44,7 @@ func (c *netClassCollector) netClassRTNLUpdate(ch chan<- prometheus.Metric) erro
if !errors.Is(errors.Unwrap(err), fs.ErrNotExist) { if !errors.Is(errors.Unwrap(err), fs.ErrNotExist) {
return fmt.Errorf("could not get link modes: %w", err) return fmt.Errorf("could not get link modes: %w", err)
} }
level.Info(c.logger).Log("msg", "ETHTOOL netlink interface unavailable, duplex and linkspeed are not scraped.") c.logger.Info("ETHTOOL netlink interface unavailable, duplex and linkspeed are not scraped.")
} else { } else {
for _, lm := range lms { for _, lm := range lms {
if c.ignoredDevicesPattern.MatchString(lm.Interface.Name) { if c.ignoredDevicesPattern.MatchString(lm.Interface.Name) {

@ -19,9 +19,7 @@ package collector
import ( import (
"errors" "errors"
"log/slog"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
) )
/* /*
@ -34,7 +32,7 @@ import (
*/ */
import "C" import "C"
func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error) { func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
netDev := netDevStats{} netDev := netDevStats{}
var ifap, ifa *C.struct_ifaddrs var ifap, ifa *C.struct_ifaddrs
@ -50,7 +48,7 @@ func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error
dev := C.GoString(ifa.ifa_name) dev := C.GoString(ifa.ifa_name)
if filter.ignored(dev) { if filter.ignored(dev) {
level.Debug(logger).Log("msg", "Ignoring device", "device", dev) logger.Debug("Ignoring device", "device", dev)
continue continue
} }

@ -20,13 +20,12 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"net" "net"
"strconv" "strconv"
"sync" "sync"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -44,7 +43,7 @@ type netDevCollector struct {
deviceFilter deviceFilter deviceFilter deviceFilter
metricDescsMutex sync.Mutex metricDescsMutex sync.Mutex
metricDescs map[string]*prometheus.Desc metricDescs map[string]*prometheus.Desc
logger log.Logger logger *slog.Logger
} }
type netDevStats map[string]map[string]uint64 type netDevStats map[string]map[string]uint64
@ -54,10 +53,10 @@ func init() {
} }
// NewNetDevCollector returns a new Collector exposing network device stats. // NewNetDevCollector returns a new Collector exposing network device stats.
func NewNetDevCollector(logger log.Logger) (Collector, error) { func NewNetDevCollector(logger *slog.Logger) (Collector, error) {
if *oldNetdevDeviceInclude != "" { if *oldNetdevDeviceInclude != "" {
if *netdevDeviceInclude == "" { if *netdevDeviceInclude == "" {
level.Warn(logger).Log("msg", "--collector.netdev.device-whitelist is DEPRECATED and will be removed in 2.0.0, use --collector.netdev.device-include") logger.Warn("--collector.netdev.device-whitelist is DEPRECATED and will be removed in 2.0.0, use --collector.netdev.device-include")
*netdevDeviceInclude = *oldNetdevDeviceInclude *netdevDeviceInclude = *oldNetdevDeviceInclude
} else { } else {
return nil, errors.New("--collector.netdev.device-whitelist and --collector.netdev.device-include are mutually exclusive") return nil, errors.New("--collector.netdev.device-whitelist and --collector.netdev.device-include are mutually exclusive")
@ -66,7 +65,7 @@ func NewNetDevCollector(logger log.Logger) (Collector, error) {
if *oldNetdevDeviceExclude != "" { if *oldNetdevDeviceExclude != "" {
if *netdevDeviceExclude == "" { if *netdevDeviceExclude == "" {
level.Warn(logger).Log("msg", "--collector.netdev.device-blacklist is DEPRECATED and will be removed in 2.0.0, use --collector.netdev.device-exclude") logger.Warn("--collector.netdev.device-blacklist is DEPRECATED and will be removed in 2.0.0, use --collector.netdev.device-exclude")
*netdevDeviceExclude = *oldNetdevDeviceExclude *netdevDeviceExclude = *oldNetdevDeviceExclude
} else { } else {
return nil, errors.New("--collector.netdev.device-blacklist and --collector.netdev.device-exclude are mutually exclusive") return nil, errors.New("--collector.netdev.device-blacklist and --collector.netdev.device-exclude are mutually exclusive")
@ -78,11 +77,11 @@ func NewNetDevCollector(logger log.Logger) (Collector, error) {
} }
if *netdevDeviceExclude != "" { if *netdevDeviceExclude != "" {
level.Info(logger).Log("msg", "Parsed flag --collector.netdev.device-exclude", "flag", *netdevDeviceExclude) logger.Info("Parsed flag --collector.netdev.device-exclude", "flag", *netdevDeviceExclude)
} }
if *netdevDeviceInclude != "" { if *netdevDeviceInclude != "" {
level.Info(logger).Log("msg", "Parsed Flag --collector.netdev.device-include", "flag", *netdevDeviceInclude) logger.Info("Parsed Flag --collector.netdev.device-include", "flag", *netdevDeviceInclude)
} }
return &netDevCollector{ return &netDevCollector{

@ -20,14 +20,13 @@ import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"log/slog"
"net" "net"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error) { func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
netDev := netDevStats{} netDev := netDevStats{}
ifs, err := net.Interfaces() ifs, err := net.Interfaces()
@ -37,13 +36,13 @@ func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error
for _, iface := range ifs { for _, iface := range ifs {
if filter.ignored(iface.Name) { if filter.ignored(iface.Name) {
level.Debug(logger).Log("msg", "Ignoring device", "device", iface.Name) logger.Debug("Ignoring device", "device", iface.Name)
continue continue
} }
ifaceData, err := getIfaceData(iface.Index) ifaceData, err := getIfaceData(iface.Index)
if err != nil { if err != nil {
level.Debug(logger).Log("msg", "failed to load data for interface", "device", iface.Name, "err", err) logger.Debug("failed to load data for interface", "device", iface.Name, "err", err)
continue continue
} }

@ -18,10 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/jsimonetti/rtnetlink" "github.com/jsimonetti/rtnetlink"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
"github.com/prometheus/procfs/sysfs" "github.com/prometheus/procfs/sysfs"
@ -32,14 +31,14 @@ var (
netdevLabelIfAlias = kingpin.Flag("collector.netdev.label-ifalias", "Add ifAlias label").Default("false").Bool() netdevLabelIfAlias = kingpin.Flag("collector.netdev.label-ifalias", "Add ifAlias label").Default("false").Bool()
) )
func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error) { func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
if *netDevNetlink { if *netDevNetlink {
return netlinkStats(filter, logger) return netlinkStats(filter, logger)
} }
return procNetDevStats(filter, logger) return procNetDevStats(filter, logger)
} }
func netlinkStats(filter *deviceFilter, logger log.Logger) (netDevStats, error) { func netlinkStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
conn, err := rtnetlink.Dial(nil) conn, err := rtnetlink.Dial(nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -54,12 +53,12 @@ func netlinkStats(filter *deviceFilter, logger log.Logger) (netDevStats, error)
return parseNetlinkStats(links, filter, logger), nil return parseNetlinkStats(links, filter, logger), nil
} }
func parseNetlinkStats(links []rtnetlink.LinkMessage, filter *deviceFilter, logger log.Logger) netDevStats { func parseNetlinkStats(links []rtnetlink.LinkMessage, filter *deviceFilter, logger *slog.Logger) netDevStats {
metrics := netDevStats{} metrics := netDevStats{}
for _, msg := range links { for _, msg := range links {
if msg.Attributes == nil { if msg.Attributes == nil {
level.Debug(logger).Log("msg", "No netlink attributes, skipping") logger.Debug("No netlink attributes, skipping")
continue continue
} }
name := msg.Attributes.Name name := msg.Attributes.Name
@ -95,13 +94,13 @@ func parseNetlinkStats(links []rtnetlink.LinkMessage, filter *deviceFilter, logg
} }
if filter.ignored(name) { if filter.ignored(name) {
level.Debug(logger).Log("msg", "Ignoring device", "device", name) logger.Debug("Ignoring device", "device", name)
continue continue
} }
// Make sure we don't panic when accessing `stats` attributes below. // Make sure we don't panic when accessing `stats` attributes below.
if stats == nil { if stats == nil {
level.Debug(logger).Log("msg", "No netlink stats, skipping") logger.Debug("No netlink stats, skipping")
continue continue
} }
@ -143,7 +142,7 @@ func parseNetlinkStats(links []rtnetlink.LinkMessage, filter *deviceFilter, logg
return metrics return metrics
} }
func procNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error) { func procNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
metrics := netDevStats{} metrics := netDevStats{}
fs, err := procfs.NewFS(*procPath) fs, err := procfs.NewFS(*procPath)
@ -160,7 +159,7 @@ func procNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, erro
name := stats.Name name := stats.Name
if filter.ignored(name) { if filter.ignored(name) {
level.Debug(logger).Log("msg", "Ignoring device", "device", name) logger.Debug("Ignoring device", "device", name)
continue continue
} }

@ -17,10 +17,10 @@
package collector package collector
import ( import (
"io"
"log/slog"
"testing" "testing"
"github.com/go-kit/log"
"github.com/jsimonetti/rtnetlink" "github.com/jsimonetti/rtnetlink"
) )
@ -166,7 +166,7 @@ var links = []rtnetlink.LinkMessage{
func TestNetDevStatsIgnore(t *testing.T) { func TestNetDevStatsIgnore(t *testing.T) {
filter := newDeviceFilter("^veth", "") filter := newDeviceFilter("^veth", "")
netStats := parseNetlinkStats(links, &filter, log.NewNopLogger()) netStats := parseNetlinkStats(links, &filter, slog.New(slog.NewTextHandler(io.Discard, nil)))
if want, got := uint64(10437182923), netStats["wlan0"]["receive_bytes"]; want != got { if want, got := uint64(10437182923), netStats["wlan0"]["receive_bytes"]; want != got {
t.Errorf("want netstat wlan0 bytes %v, got %v", want, got) t.Errorf("want netstat wlan0 bytes %v, got %v", want, got)
@ -199,7 +199,7 @@ func TestNetDevStatsIgnore(t *testing.T) {
func TestNetDevStatsAccept(t *testing.T) { func TestNetDevStatsAccept(t *testing.T) {
filter := newDeviceFilter("", "^💩0$") filter := newDeviceFilter("", "^💩0$")
netStats := parseNetlinkStats(links, &filter, log.NewNopLogger()) netStats := parseNetlinkStats(links, &filter, slog.New(slog.NewTextHandler(io.Discard, nil)))
if want, got := 1, len(netStats); want != got { if want, got := 1, len(netStats); want != got {
t.Errorf("want count of devices to be %d, got %d", want, got) t.Errorf("want count of devices to be %d, got %d", want, got)
@ -230,7 +230,7 @@ func TestNetDevLegacyMetricNames(t *testing.T) {
} }
filter := newDeviceFilter("", "") filter := newDeviceFilter("", "")
netStats := parseNetlinkStats(links, &filter, log.NewNopLogger()) netStats := parseNetlinkStats(links, &filter, slog.New(slog.NewTextHandler(io.Discard, nil)))
for dev, devStats := range netStats { for dev, devStats := range netStats {
legacy(devStats) legacy(devStats)
@ -263,7 +263,7 @@ func TestNetDevLegacyMetricValues(t *testing.T) {
} }
filter := newDeviceFilter("", "^enp0s0f0$") filter := newDeviceFilter("", "^enp0s0f0$")
netStats := parseNetlinkStats(links, &filter, log.NewNopLogger()) netStats := parseNetlinkStats(links, &filter, slog.New(slog.NewTextHandler(io.Discard, nil)))
metrics, ok := netStats["enp0s0f0"] metrics, ok := netStats["enp0s0f0"]
if !ok { if !ok {
t.Error("expected stats for interface enp0s0f0") t.Error("expected stats for interface enp0s0f0")
@ -285,7 +285,7 @@ func TestNetDevLegacyMetricValues(t *testing.T) {
func TestNetDevMetricValues(t *testing.T) { func TestNetDevMetricValues(t *testing.T) {
filter := newDeviceFilter("", "") filter := newDeviceFilter("", "")
netStats := parseNetlinkStats(links, &filter, log.NewNopLogger()) netStats := parseNetlinkStats(links, &filter, slog.New(slog.NewTextHandler(io.Discard, nil)))
for _, msg := range links { for _, msg := range links {
device := msg.Attributes.Name device := msg.Attributes.Name

@ -18,9 +18,7 @@ package collector
import ( import (
"errors" "errors"
"log/slog"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
) )
/* /*
@ -31,7 +29,7 @@ import (
*/ */
import "C" import "C"
func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error) { func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
netDev := netDevStats{} netDev := netDevStats{}
var ifap, ifa *C.struct_ifaddrs var ifap, ifa *C.struct_ifaddrs
@ -47,7 +45,7 @@ func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error
dev := C.GoString(ifa.ifa_name) dev := C.GoString(ifa.ifa_name)
if filter.ignored(dev) { if filter.ignored(dev) {
level.Debug(logger).Log("msg", "Ignoring device", "device", dev) logger.Debug("Ignoring device", "device", dev)
continue continue
} }

@ -17,15 +17,14 @@
package collector package collector
import ( import (
"github.com/go-kit/log" "log/slog"
"github.com/go-kit/log/level"
"unsafe" "unsafe"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error) { func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
netDev := netDevStats{} netDev := netDevStats{}
mib := [6]_C_int{unix.CTL_NET, unix.AF_ROUTE, 0, 0, unix.NET_RT_IFLIST, 0} mib := [6]_C_int{unix.CTL_NET, unix.AF_ROUTE, 0, 0, unix.NET_RT_IFLIST, 0}
@ -55,7 +54,7 @@ func getNetDevStats(filter *deviceFilter, logger log.Logger) (netDevStats, error
data := ifm.Data data := ifm.Data
dev := int8ToString(dl.Data[:dl.Nlen]) dev := int8ToString(dl.Data[:dl.Nlen])
if filter.ignored(dev) { if filter.ignored(dev) {
level.Debug(logger).Log("msg", "Ignoring device", "device", dev) logger.Debug("Ignoring device", "device", dev)
continue continue
} }

@ -18,14 +18,14 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
type netisrCollector struct { type netisrCollector struct {
sysctls []bsdSysctl sysctls []bsdSysctl
logger log.Logger logger *slog.Logger
} }
const ( const (
@ -36,7 +36,7 @@ func init() {
registerCollector("netisr", defaultEnabled, NewNetisrCollector) registerCollector("netisr", defaultEnabled, NewNetisrCollector)
} }
func NewNetisrCollector(logger log.Logger) (Collector, error) { func NewNetisrCollector(logger *slog.Logger) (Collector, error) {
return &netisrCollector{ return &netisrCollector{
sysctls: []bsdSysctl{ sysctls: []bsdSysctl{
{ {

@ -21,13 +21,13 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"log/slog"
"os" "os"
"regexp" "regexp"
"strconv" "strconv"
"strings" "strings"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -41,7 +41,7 @@ var (
type netStatCollector struct { type netStatCollector struct {
fieldPattern *regexp.Regexp fieldPattern *regexp.Regexp
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -50,7 +50,7 @@ func init() {
// NewNetStatCollector takes and returns // NewNetStatCollector takes and returns
// a new Collector exposing network stats. // a new Collector exposing network stats.
func NewNetStatCollector(logger log.Logger) (Collector, error) { func NewNetStatCollector(logger *slog.Logger) (Collector, error) {
pattern := regexp.MustCompile(*netStatFields) pattern := regexp.MustCompile(*netStatFields)
return &netStatCollector{ return &netStatCollector{
fieldPattern: pattern, fieldPattern: pattern,

@ -19,10 +19,10 @@ package collector
import ( import (
"fmt" "fmt"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"log/slog"
"net" "net"
"strconv" "strconv"
"github.com/go-kit/log"
"github.com/jsimonetti/rtnetlink" "github.com/jsimonetti/rtnetlink"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -30,7 +30,7 @@ import (
type networkRouteCollector struct { type networkRouteCollector struct {
routeInfoDesc *prometheus.Desc routeInfoDesc *prometheus.Desc
routesDesc *prometheus.Desc routesDesc *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -38,7 +38,7 @@ func init() {
} }
// NewNetworkRouteCollector returns a new Collector exposing systemd statistics. // NewNetworkRouteCollector returns a new Collector exposing systemd statistics.
func NewNetworkRouteCollector(logger log.Logger) (Collector, error) { func NewNetworkRouteCollector(logger *slog.Logger) (Collector, error) {
const subsystem = "network" const subsystem = "network"
routeInfoDesc := prometheus.NewDesc( routeInfoDesc := prometheus.NewDesc(

@ -19,11 +19,10 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"reflect" "reflect"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/nfs" "github.com/prometheus/procfs/nfs"
) )
@ -40,7 +39,7 @@ type nfsCollector struct {
nfsRPCRetransmissionsDesc *prometheus.Desc nfsRPCRetransmissionsDesc *prometheus.Desc
nfsRPCAuthenticationRefreshesDesc *prometheus.Desc nfsRPCAuthenticationRefreshesDesc *prometheus.Desc
nfsProceduresDesc *prometheus.Desc nfsProceduresDesc *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -48,7 +47,7 @@ func init() {
} }
// NewNfsCollector returns a new Collector exposing NFS statistics. // NewNfsCollector returns a new Collector exposing NFS statistics.
func NewNfsCollector(logger log.Logger) (Collector, error) { func NewNfsCollector(logger *slog.Logger) (Collector, error) {
fs, err := nfs.NewFS(*procPath) fs, err := nfs.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)
@ -100,7 +99,7 @@ func (c *nfsCollector) Update(ch chan<- prometheus.Metric) error {
stats, err := c.fs.ClientRPCStats() stats, err := c.fs.ClientRPCStats()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "Not collecting NFS metrics", "err", err) c.logger.Debug("Not collecting NFS metrics", "err", err)
return ErrNoData return ErrNoData
} }
return fmt.Errorf("failed to retrieve nfs stats: %w", err) return fmt.Errorf("failed to retrieve nfs stats: %w", err)

@ -19,10 +19,9 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs/nfs" "github.com/prometheus/procfs/nfs"
) )
@ -32,7 +31,7 @@ import (
type nfsdCollector struct { type nfsdCollector struct {
fs nfs.FS fs nfs.FS
requestsDesc *prometheus.Desc requestsDesc *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -44,7 +43,7 @@ const (
) )
// NewNFSdCollector returns a new Collector exposing /proc/net/rpc/nfsd statistics. // NewNFSdCollector returns a new Collector exposing /proc/net/rpc/nfsd statistics.
func NewNFSdCollector(logger log.Logger) (Collector, error) { func NewNFSdCollector(logger *slog.Logger) (Collector, error) {
fs, err := nfs.NewFS(*procPath) fs, err := nfs.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)
@ -66,7 +65,7 @@ func (c *nfsdCollector) Update(ch chan<- prometheus.Metric) error {
stats, err := c.fs.ServerRPCStats() stats, err := c.fs.ServerRPCStats()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "Not collecting NFSd metrics", "err", err) c.logger.Debug("Not collecting NFSd metrics", "err", err)
return ErrNoData return ErrNoData
} }
return fmt.Errorf("failed to retrieve nfsd stats: %w", err) return fmt.Errorf("failed to retrieve nfsd stats: %w", err)

@ -18,14 +18,13 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"net" "net"
"sync" "sync"
"time" "time"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/beevik/ntp" "github.com/beevik/ntp"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -51,7 +50,7 @@ var (
type ntpCollector struct { type ntpCollector struct {
stratum, leap, rtt, offset, reftime, rootDelay, rootDispersion, sanity typedDesc stratum, leap, rtt, offset, reftime, rootDelay, rootDispersion, sanity typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -62,7 +61,7 @@ func init() {
// Default definition of "local" is: // Default definition of "local" is:
// - collector.ntp.server address is a loopback address (or collector.ntp.server-is-mine flag is turned on) // - collector.ntp.server address is a loopback address (or collector.ntp.server-is-mine flag is turned on)
// - the server is reachable with outgoin IP_TTL = 1 // - the server is reachable with outgoin IP_TTL = 1
func NewNtpCollector(logger log.Logger) (Collector, error) { func NewNtpCollector(logger *slog.Logger) (Collector, error) {
ipaddr := net.ParseIP(*ntpServer) ipaddr := net.ParseIP(*ntpServer)
if !*ntpServerIsLocal && (ipaddr == nil || !ipaddr.IsLoopback()) { if !*ntpServerIsLocal && (ipaddr == nil || !ipaddr.IsLoopback()) {
return nil, fmt.Errorf("only IP address of local NTP server is valid for --collector.ntp.server") return nil, fmt.Errorf("only IP address of local NTP server is valid for --collector.ntp.server")
@ -80,7 +79,7 @@ func NewNtpCollector(logger log.Logger) (Collector, error) {
return nil, fmt.Errorf("invalid NTP port number %d; must be between 1 and 65535 inclusive", *ntpServerPort) return nil, fmt.Errorf("invalid NTP port number %d; must be between 1 and 65535 inclusive", *ntpServerPort)
} }
level.Warn(logger).Log("msg", "This collector is deprecated and will be removed in the next major version release.") logger.Warn("This collector is deprecated and will be removed in the next major version release.")
return &ntpCollector{ return &ntpCollector{
stratum: typedDesc{prometheus.NewDesc( stratum: typedDesc{prometheus.NewDesc(
prometheus.BuildFQName(namespace, ntpSubsystem, "stratum"), prometheus.BuildFQName(namespace, ntpSubsystem, "stratum"),

@ -19,17 +19,16 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"github.com/go-kit/log"
"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"
) )
type nvmeCollector struct { type nvmeCollector struct {
fs sysfs.FS fs sysfs.FS
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -37,7 +36,7 @@ func init() {
} }
// NewNVMeCollector returns a new Collector exposing NVMe stats. // NewNVMeCollector returns a new Collector exposing NVMe stats.
func NewNVMeCollector(logger log.Logger) (Collector, error) { func NewNVMeCollector(logger *slog.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)
@ -53,7 +52,7 @@ func (c *nvmeCollector) Update(ch chan<- prometheus.Metric) error {
devices, err := c.fs.NVMeClass() devices, err := c.fs.NVMeClass()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "nvme statistics not found, skipping") c.logger.Debug("nvme statistics not found, skipping")
return ErrNoData return ErrNoData
} }
return fmt.Errorf("error obtaining NVMe class info: %w", err) return fmt.Errorf("error obtaining NVMe class info: %w", err)

@ -17,6 +17,7 @@ import (
"encoding/xml" "encoding/xml"
"errors" "errors"
"io" "io"
"log/slog"
"os" "os"
"regexp" "regexp"
"strconv" "strconv"
@ -24,8 +25,6 @@ import (
"sync" "sync"
"time" "time"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
envparse "github.com/hashicorp/go-envparse" envparse "github.com/hashicorp/go-envparse"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -58,7 +57,7 @@ type osRelease struct {
type osReleaseCollector struct { type osReleaseCollector struct {
infoDesc *prometheus.Desc infoDesc *prometheus.Desc
logger log.Logger logger *slog.Logger
os *osRelease os *osRelease
osMutex sync.RWMutex osMutex sync.RWMutex
osReleaseFilenames []string // all os-release file names to check osReleaseFilenames []string // all os-release file names to check
@ -82,7 +81,7 @@ func init() {
} }
// NewOSCollector returns a new Collector exposing os-release information. // NewOSCollector returns a new Collector exposing os-release information.
func NewOSCollector(logger log.Logger) (Collector, error) { func NewOSCollector(logger *slog.Logger) (Collector, error) {
return &osReleaseCollector{ return &osReleaseCollector{
logger: logger, logger: logger,
infoDesc: prometheus.NewDesc( infoDesc: prometheus.NewDesc(
@ -178,7 +177,7 @@ func (c *osReleaseCollector) Update(ch chan<- prometheus.Metric) error {
} }
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
if i >= (len(c.osReleaseFilenames) - 1) { if i >= (len(c.osReleaseFilenames) - 1) {
level.Debug(c.logger).Log("msg", "no os-release file found", "files", strings.Join(c.osReleaseFilenames, ",")) c.logger.Debug("no os-release file found", "files", strings.Join(c.osReleaseFilenames, ","))
return ErrNoData return ErrNoData
} }
continue continue

@ -14,12 +14,12 @@
package collector package collector
import ( import (
"io"
"log/slog"
"os" "os"
"reflect" "reflect"
"strings" "strings"
"testing" "testing"
"github.com/go-kit/log"
) )
const debianBullseye string = `PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" const debianBullseye string = `PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
@ -129,7 +129,7 @@ func TestUpdateStruct(t *testing.T) {
} }
wantedVersion := 20.04 wantedVersion := 20.04
collector, err := NewOSCollector(log.NewNopLogger()) collector, err := NewOSCollector(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

@ -18,13 +18,12 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/hodgesds/perf-utils" "github.com/hodgesds/perf-utils"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
@ -189,7 +188,7 @@ type perfCollector struct {
perfSwProfilers map[int]*perf.SoftwareProfiler perfSwProfilers map[int]*perf.SoftwareProfiler
perfCacheProfilers map[int]*perf.CacheProfiler perfCacheProfilers map[int]*perf.CacheProfiler
desc map[string]*prometheus.Desc desc map[string]*prometheus.Desc
logger log.Logger logger *slog.Logger
tracepointCollector *perfTracepointCollector tracepointCollector *perfTracepointCollector
} }
@ -199,7 +198,7 @@ type perfTracepointCollector struct {
// collection order is the sorted configured collection order of the profiler. // collection order is the sorted configured collection order of the profiler.
collectionOrder []string collectionOrder []string
logger log.Logger logger *slog.Logger
profilers map[int]perf.GroupProfiler profilers map[int]perf.GroupProfiler
} }
@ -218,7 +217,7 @@ func (c *perfTracepointCollector) updateCPU(cpu int, ch chan<- prometheus.Metric
profiler := c.profilers[cpu] profiler := c.profilers[cpu]
p := &perf.GroupProfileValue{} p := &perf.GroupProfileValue{}
if err := profiler.Profile(p); err != nil { if err := profiler.Profile(p); err != nil {
level.Error(c.logger).Log("msg", "Failed to collect tracepoint profile", "err", err) c.logger.Error("Failed to collect tracepoint profile", "err", err)
return err return err
} }
@ -240,7 +239,7 @@ func (c *perfTracepointCollector) updateCPU(cpu int, ch chan<- prometheus.Metric
// newPerfTracepointCollector returns a configured perfTracepointCollector. // newPerfTracepointCollector returns a configured perfTracepointCollector.
func newPerfTracepointCollector( func newPerfTracepointCollector(
logger log.Logger, logger *slog.Logger,
tracepointsFlag []string, tracepointsFlag []string,
cpus []int, cpus []int,
) (*perfTracepointCollector, error) { ) (*perfTracepointCollector, error) {
@ -301,7 +300,7 @@ func newPerfTracepointCollector(
// NewPerfCollector returns a new perf based collector, it creates a profiler // NewPerfCollector returns a new perf based collector, it creates a profiler
// per CPU. // per CPU.
func NewPerfCollector(logger log.Logger) (Collector, error) { func NewPerfCollector(logger *slog.Logger) (Collector, error) {
collector := &perfCollector{ collector := &perfCollector{
perfHwProfilers: map[int]*perf.HardwareProfiler{}, perfHwProfilers: map[int]*perf.HardwareProfiler{},
perfSwProfilers: map[int]*perf.SoftwareProfiler{}, perfSwProfilers: map[int]*perf.SoftwareProfiler{},

@ -17,13 +17,14 @@
package collector package collector
import ( import (
"io"
"log/slog"
"os" "os"
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
"testing" "testing"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -44,7 +45,7 @@ func canTestPerf(t *testing.T) {
func TestPerfCollector(t *testing.T) { func TestPerfCollector(t *testing.T) {
canTestPerf(t) canTestPerf(t)
collector, err := NewPerfCollector(log.NewNopLogger()) collector, err := NewPerfCollector(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -97,7 +98,7 @@ func TestPerfCollectorStride(t *testing.T) {
} }
} }
perfCPUsFlag = &test.flag perfCPUsFlag = &test.flag
collector, err := NewPerfCollector(log.NewNopLogger()) collector, err := NewPerfCollector(slog.New(slog.NewTextHandler(io.Discard, nil)))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

@ -18,10 +18,10 @@
package collector package collector
import ( import (
"log/slog"
"regexp" "regexp"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
@ -33,14 +33,14 @@ type powerSupplyClassCollector struct {
subsystem string subsystem string
ignoredPattern *regexp.Regexp ignoredPattern *regexp.Regexp
metricDescs map[string]*prometheus.Desc metricDescs map[string]*prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
registerCollector("powersupplyclass", defaultEnabled, NewPowerSupplyClassCollector) registerCollector("powersupplyclass", defaultEnabled, NewPowerSupplyClassCollector)
} }
func NewPowerSupplyClassCollector(logger log.Logger) (Collector, error) { func NewPowerSupplyClassCollector(logger *slog.Logger) (Collector, error) {
pattern := regexp.MustCompile(*powerSupplyClassIgnoredPowerSupplies) pattern := regexp.MustCompile(*powerSupplyClassIgnoredPowerSupplies)
return &powerSupplyClassCollector{ return &powerSupplyClassCollector{
subsystem: "power_supply", subsystem: "power_supply",

@ -19,11 +19,10 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"syscall" "syscall"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -42,7 +41,7 @@ type pressureStatsCollector struct {
fs procfs.FS fs procfs.FS
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -50,7 +49,7 @@ func init() {
} }
// NewPressureStatsCollector returns a Collector exposing pressure stall information // NewPressureStatsCollector returns a Collector exposing pressure stall information
func NewPressureStatsCollector(logger log.Logger) (Collector, error) { func NewPressureStatsCollector(logger *slog.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)
@ -95,15 +94,15 @@ func NewPressureStatsCollector(logger log.Logger) (Collector, error) {
// Update calls procfs.NewPSIStatsForResource for the different resources and updates the values // Update calls procfs.NewPSIStatsForResource for the different resources and updates the values
func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error { func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
for _, res := range psiResources { for _, res := range psiResources {
level.Debug(c.logger).Log("msg", "collecting statistics for resource", "resource", res) c.logger.Debug("collecting statistics for resource", "resource", res)
vals, err := c.fs.PSIStatsForResource(res) vals, err := c.fs.PSIStatsForResource(res)
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel") c.logger.Debug("pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel")
return ErrNoData return ErrNoData
} }
if errors.Is(err, syscall.ENOTSUP) { if errors.Is(err, syscall.ENOTSUP) {
level.Debug(c.logger).Log("msg", "pressure information is disabled, add psi=1 kernel command line to enable it") c.logger.Debug("pressure information is disabled, add psi=1 kernel command line to enable it")
return ErrNoData return ErrNoData
} }
return fmt.Errorf("failed to retrieve pressure stats: %w", err) return fmt.Errorf("failed to retrieve pressure stats: %w", err)
@ -111,11 +110,11 @@ func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
// IRQ pressure does not have 'some' data. // IRQ pressure does not have 'some' data.
// See https://github.com/torvalds/linux/blob/v6.9/include/linux/psi_types.h#L65 // See https://github.com/torvalds/linux/blob/v6.9/include/linux/psi_types.h#L65
if vals.Some == nil && res != "irq" { if vals.Some == nil && res != "irq" {
level.Debug(c.logger).Log("msg", "pressure information returned no 'some' data") c.logger.Debug("pressure information returned no 'some' data")
return ErrNoData return ErrNoData
} }
if vals.Full == nil && res != "cpu" { if vals.Full == nil && res != "cpu" {
level.Debug(c.logger).Log("msg", "pressure information returned no 'full' data") c.logger.Debug("pressure information returned no 'full' data")
return ErrNoData return ErrNoData
} }
switch res { switch res {
@ -130,7 +129,7 @@ func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error {
case "irq": case "irq":
ch <- prometheus.MustNewConstMetric(c.irqFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0) ch <- prometheus.MustNewConstMetric(c.irqFull, prometheus.CounterValue, float64(vals.Full.Total)/1000.0/1000.0)
default: default:
level.Debug(c.logger).Log("msg", "did not account for resource", "resource", res) c.logger.Debug("did not account for resource", "resource", res)
} }
} }

@ -19,14 +19,13 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"path" "path"
"strconv" "strconv"
"strings" "strings"
"syscall" "syscall"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -39,7 +38,7 @@ type processCollector struct {
procsState *prometheus.Desc procsState *prometheus.Desc
pidUsed *prometheus.Desc pidUsed *prometheus.Desc
pidMax *prometheus.Desc pidMax *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -47,7 +46,7 @@ func init() {
} }
// NewProcessStatCollector returns a new Collector exposing process data read from the proc filesystem. // NewProcessStatCollector returns a new Collector exposing process data read from the proc filesystem.
func NewProcessStatCollector(logger log.Logger) (Collector, error) { func NewProcessStatCollector(logger *slog.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)
@ -130,10 +129,10 @@ func (c *processCollector) getAllocatedThreads() (int, map[string]int32, int, ma
if err != nil { if err != nil {
// PIDs can vanish between getting the list and getting stats. // PIDs can vanish between getting the list and getting stats.
if c.isIgnoredError(err) { if c.isIgnoredError(err) {
level.Debug(c.logger).Log("msg", "file not found when retrieving stats for pid", "pid", pid.PID, "err", err) c.logger.Debug("file not found when retrieving stats for pid", "pid", pid.PID, "err", err)
continue continue
} }
level.Debug(c.logger).Log("msg", "error reading stat for pid", "pid", pid.PID, "err", err) c.logger.Debug("error reading stat for pid", "pid", pid.PID, "err", err)
return 0, nil, 0, nil, fmt.Errorf("error reading stat for pid %d: %w", pid.PID, err) return 0, nil, 0, nil, fmt.Errorf("error reading stat for pid %d: %w", pid.PID, err)
} }
pids++ pids++
@ -151,17 +150,17 @@ func (c *processCollector) getThreadStates(pid int, pidStat procfs.ProcStat, thr
fs, err := procfs.NewFS(procFilePath(path.Join(strconv.Itoa(pid), "task"))) fs, err := procfs.NewFS(procFilePath(path.Join(strconv.Itoa(pid), "task")))
if err != nil { if err != nil {
if c.isIgnoredError(err) { if c.isIgnoredError(err) {
level.Debug(c.logger).Log("msg", "file not found when retrieving tasks for pid", "pid", pid, "err", err) c.logger.Debug("file not found when retrieving tasks for pid", "pid", pid, "err", err)
return nil return nil
} }
level.Debug(c.logger).Log("msg", "error reading tasks for pid", "pid", pid, "err", err) c.logger.Debug("error reading tasks for pid", "pid", pid, "err", err)
return fmt.Errorf("error reading task for pid %d: %w", pid, err) return fmt.Errorf("error reading task for pid %d: %w", pid, err)
} }
t, err := fs.AllProcs() t, err := fs.AllProcs()
if err != nil { if err != nil {
if c.isIgnoredError(err) { if c.isIgnoredError(err) {
level.Debug(c.logger).Log("msg", "file not found when retrieving tasks for pid", "pid", pid, "err", err) c.logger.Debug("file not found when retrieving tasks for pid", "pid", pid, "err", err)
return nil return nil
} }
return fmt.Errorf("unable to list all threads for pid: %d %w", pid, err) return fmt.Errorf("unable to list all threads for pid: %d %w", pid, err)
@ -175,10 +174,10 @@ func (c *processCollector) getThreadStates(pid int, pidStat procfs.ProcStat, thr
threadStat, err := thread.Stat() threadStat, err := thread.Stat()
if err != nil { if err != nil {
if c.isIgnoredError(err) { if c.isIgnoredError(err) {
level.Debug(c.logger).Log("msg", "file not found when retrieving stats for thread", "pid", pid, "threadId", thread.PID, "err", err) c.logger.Debug("file not found when retrieving stats for thread", "pid", pid, "threadId", thread.PID, "err", err)
continue continue
} }
level.Debug(c.logger).Log("msg", "error reading stat for thread", "pid", pid, "threadId", thread.PID, "err", err) c.logger.Debug("error reading stat for thread", "pid", pid, "threadId", thread.PID, "err", err)
return fmt.Errorf("error reading stat for pid:%d thread:%d err:%w", pid, thread.PID, err) return fmt.Errorf("error reading stat for pid:%d thread:%d err:%w", pid, thread.PID, err)
} }
threadStates[threadStat.State]++ threadStates[threadStat.State]++

@ -17,10 +17,11 @@
package collector package collector
import ( import (
"io"
"log/slog"
"testing" "testing"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -33,7 +34,7 @@ func TestReadProcessStatus(t *testing.T) {
if err != nil { if err != nil {
t.Errorf("failed to open procfs: %v", err) t.Errorf("failed to open procfs: %v", err)
} }
c := processCollector{fs: fs, logger: log.NewNopLogger()} c := processCollector{fs: fs, logger: slog.New(slog.NewTextHandler(io.Discard, nil))}
pids, states, threads, _, err := c.getAllocatedThreads() pids, states, threads, _, err := c.getAllocatedThreads()
if err != nil { if err != nil {
t.Fatalf("Cannot retrieve data from procfs getAllocatedThreads function: %v ", err) t.Fatalf("Cannot retrieve data from procfs getAllocatedThreads function: %v ", err)

@ -19,18 +19,17 @@ package collector
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/ema/qdisc" "github.com/ema/qdisc"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
type qdiscStatCollector struct { type qdiscStatCollector struct {
logger log.Logger logger *slog.Logger
deviceFilter deviceFilter deviceFilter deviceFilter
bytes typedDesc bytes typedDesc
packets typedDesc packets typedDesc
@ -54,10 +53,10 @@ func init() {
} }
// NewQdiscStatCollector returns a new Collector exposing queuing discipline statistics. // NewQdiscStatCollector returns a new Collector exposing queuing discipline statistics.
func NewQdiscStatCollector(logger log.Logger) (Collector, error) { func NewQdiscStatCollector(logger *slog.Logger) (Collector, error) {
if *oldCollectorQdiskDeviceInclude != "" { if *oldCollectorQdiskDeviceInclude != "" {
if *collectorQdiscDeviceInclude == "" { if *collectorQdiscDeviceInclude == "" {
level.Warn(logger).Log("msg", "--collector.qdisk.device-include is DEPRECATED and will be removed in 2.0.0, use --collector.qdisc.device-include") logger.Warn("--collector.qdisk.device-include is DEPRECATED and will be removed in 2.0.0, use --collector.qdisc.device-include")
*collectorQdiscDeviceInclude = *oldCollectorQdiskDeviceInclude *collectorQdiscDeviceInclude = *oldCollectorQdiskDeviceInclude
} else { } else {
return nil, fmt.Errorf("--collector.qdisk.device-include and --collector.qdisc.device-include are mutually exclusive") return nil, fmt.Errorf("--collector.qdisk.device-include and --collector.qdisc.device-include are mutually exclusive")
@ -66,7 +65,7 @@ func NewQdiscStatCollector(logger log.Logger) (Collector, error) {
if *oldCollectorQdiskDeviceExclude != "" { if *oldCollectorQdiskDeviceExclude != "" {
if *collectorQdiscDeviceExclude == "" { if *collectorQdiscDeviceExclude == "" {
level.Warn(logger).Log("msg", "--collector.qdisk.device-exclude is DEPRECATED and will be removed in 2.0.0, use --collector.qdisc.device-exclude") logger.Warn("--collector.qdisk.device-exclude is DEPRECATED and will be removed in 2.0.0, use --collector.qdisc.device-exclude")
*collectorQdiscDeviceExclude = *oldCollectorQdiskDeviceExclude *collectorQdiscDeviceExclude = *oldCollectorQdiskDeviceExclude
} else { } else {
return nil, fmt.Errorf("--collector.qdisk.device-exclude and --collector.qdisc.device-exclude are mutually exclusive") return nil, fmt.Errorf("--collector.qdisk.device-exclude and --collector.qdisc.device-exclude are mutually exclusive")

@ -19,12 +19,11 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"strconv" "strconv"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"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"
) )
@ -33,7 +32,7 @@ const raplCollectorSubsystem = "rapl"
type raplCollector struct { type raplCollector struct {
fs sysfs.FS fs sysfs.FS
logger log.Logger logger *slog.Logger
joulesMetricDesc *prometheus.Desc joulesMetricDesc *prometheus.Desc
} }
@ -47,7 +46,7 @@ var (
) )
// NewRaplCollector returns a new Collector exposing RAPL metrics. // NewRaplCollector returns a new Collector exposing RAPL metrics.
func NewRaplCollector(logger log.Logger) (Collector, error) { func NewRaplCollector(logger *slog.Logger) (Collector, error) {
fs, err := sysfs.NewFS(*sysPath) fs, err := sysfs.NewFS(*sysPath)
if err != nil { if err != nil {
@ -74,11 +73,11 @@ func (c *raplCollector) Update(ch chan<- prometheus.Metric) error {
zones, err := sysfs.GetRaplZones(c.fs) zones, err := sysfs.GetRaplZones(c.fs)
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "Platform doesn't have powercap files present", "err", err) c.logger.Debug("Platform doesn't have powercap files present", "err", err)
return ErrNoData return ErrNoData
} }
if errors.Is(err, os.ErrPermission) { if errors.Is(err, os.ErrPermission) {
level.Debug(c.logger).Log("msg", "Can't access powercap files", "err", err) c.logger.Debug("Can't access powercap files", "err", err)
return ErrNoData return ErrNoData
} }
return fmt.Errorf("failed to retrieve rapl stats: %w", err) return fmt.Errorf("failed to retrieve rapl stats: %w", err)
@ -88,7 +87,7 @@ func (c *raplCollector) Update(ch chan<- prometheus.Metric) error {
microJoules, err := rz.GetEnergyMicrojoules() microJoules, err := rz.GetEnergyMicrojoules()
if err != nil { if err != nil {
if errors.Is(err, os.ErrPermission) { if errors.Is(err, os.ErrPermission) {
level.Debug(c.logger).Log("msg", "Can't access energy_uj file", "zone", rz, "err", err) c.logger.Debug("Can't access energy_uj file", "zone", rz, "err", err)
return ErrNoData return ErrNoData
} }
return err return err

@ -18,10 +18,9 @@ package collector
import ( import (
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"github.com/go-kit/log"
"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"
"log/slog"
) )
var runitServiceDir = kingpin.Flag("collector.runit.servicedir", "Path to runit service directory.").Default("/etc/service").String() var runitServiceDir = kingpin.Flag("collector.runit.servicedir", "Path to runit service directory.").Default("/etc/service").String()
@ -31,7 +30,7 @@ type runitCollector struct {
stateDesired typedDesc stateDesired typedDesc
stateNormal typedDesc stateNormal typedDesc
stateTimestamp typedDesc stateTimestamp typedDesc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -39,14 +38,14 @@ func init() {
} }
// NewRunitCollector returns a new Collector exposing runit statistics. // NewRunitCollector returns a new Collector exposing runit statistics.
func NewRunitCollector(logger log.Logger) (Collector, error) { func NewRunitCollector(logger *slog.Logger) (Collector, error) {
var ( var (
subsystem = "service" subsystem = "service"
constLabels = prometheus.Labels{"supervisor": "runit"} constLabels = prometheus.Labels{"supervisor": "runit"}
labelNames = []string{"service"} labelNames = []string{"service"}
) )
level.Warn(logger).Log("msg", "This collector is deprecated and will be removed in the next major version release.") logger.Warn("This collector is deprecated and will be removed in the next major version release.")
return &runitCollector{ return &runitCollector{
state: typedDesc{prometheus.NewDesc( state: typedDesc{prometheus.NewDesc(
@ -82,11 +81,11 @@ func (c *runitCollector) Update(ch chan<- prometheus.Metric) error {
for _, service := range services { for _, service := range services {
status, err := service.Status() status, err := service.Status()
if err != nil { if err != nil {
level.Debug(c.logger).Log("msg", "Couldn't get status", "service", service.Name, "err", err) c.logger.Debug("Couldn't get status", "service", service.Name, "err", err)
continue continue
} }
level.Debug(c.logger).Log("msg", "duration", "service", service.Name, "status", status.State, "pid", status.Pid, "duration_seconds", status.Duration) c.logger.Debug("duration", "service", service.Name, "status", status.State, "pid", status.Pid, "duration_seconds", status.Duration)
ch <- c.state.mustNewConstMetric(float64(status.State), service.Name) ch <- c.state.mustNewConstMetric(float64(status.State), service.Name)
ch <- c.stateDesired.mustNewConstMetric(float64(status.Want), service.Name) ch <- c.stateDesired.mustNewConstMetric(float64(status.Want), service.Name)
ch <- c.stateTimestamp.mustNewConstMetric(float64(status.Timestamp.Unix()), service.Name) ch <- c.stateTimestamp.mustNewConstMetric(float64(status.Timestamp.Unix()), service.Name)

@ -19,10 +19,9 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -53,7 +52,7 @@ var (
) )
// NewSchedstatCollector returns a new Collector exposing task scheduler statistics // NewSchedstatCollector returns a new Collector exposing task scheduler statistics
func NewSchedstatCollector(logger log.Logger) (Collector, error) { func NewSchedstatCollector(logger *slog.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)
@ -64,7 +63,7 @@ func NewSchedstatCollector(logger log.Logger) (Collector, error) {
type schedstatCollector struct { type schedstatCollector struct {
fs procfs.FS fs procfs.FS
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -75,7 +74,7 @@ func (c *schedstatCollector) Update(ch chan<- prometheus.Metric) error {
stats, err := c.fs.Schedstat() stats, err := c.fs.Schedstat()
if err != nil { if err != nil {
if errors.Is(err, os.ErrNotExist) { if errors.Is(err, os.ErrNotExist) {
level.Debug(c.logger).Log("msg", "schedstat file does not exist") c.logger.Debug("schedstat file does not exist")
return ErrNoData return ErrNoData
} }
return err return err

@ -17,16 +17,16 @@
package collector package collector
import ( import (
"github.com/go-kit/log"
"github.com/opencontainers/selinux/go-selinux" "github.com/opencontainers/selinux/go-selinux"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"log/slog"
) )
type selinuxCollector struct { type selinuxCollector struct {
configMode *prometheus.Desc configMode *prometheus.Desc
currentMode *prometheus.Desc currentMode *prometheus.Desc
enabled *prometheus.Desc enabled *prometheus.Desc
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -34,7 +34,7 @@ func init() {
} }
// NewSelinuxCollector returns a new Collector exposing SELinux statistics. // NewSelinuxCollector returns a new Collector exposing SELinux statistics.
func NewSelinuxCollector(logger log.Logger) (Collector, error) { func NewSelinuxCollector(logger *slog.Logger) (Collector, error) {
const subsystem = "selinux" const subsystem = "selinux"
return &selinuxCollector{ return &selinuxCollector{

@ -18,9 +18,9 @@ package collector
import ( import (
"fmt" "fmt"
"log/slog"
"github.com/alecthomas/kingpin/v2" "github.com/alecthomas/kingpin/v2"
"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"
) )
@ -32,7 +32,7 @@ var (
type slabinfoCollector struct { type slabinfoCollector struct {
fs procfs.FS fs procfs.FS
logger log.Logger logger *slog.Logger
subsystem string subsystem string
labels []string labels []string
slabNameFilter deviceFilter slabNameFilter deviceFilter
@ -42,7 +42,7 @@ func init() {
registerCollector("slabinfo", defaultDisabled, NewSlabinfoCollector) registerCollector("slabinfo", defaultDisabled, NewSlabinfoCollector)
} }
func NewSlabinfoCollector(logger log.Logger) (Collector, error) { func NewSlabinfoCollector(logger *slog.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,10 +19,9 @@ package collector
import ( import (
"errors" "errors"
"fmt" "fmt"
"log/slog"
"os" "os"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/procfs" "github.com/prometheus/procfs"
) )
@ -35,7 +34,7 @@ const (
var pageSize = os.Getpagesize() var pageSize = os.Getpagesize()
type sockStatCollector struct { type sockStatCollector struct {
logger log.Logger logger *slog.Logger
} }
func init() { func init() {
@ -43,7 +42,7 @@ func init() {
} }
// NewSockStatCollector returns a new Collector exposing socket stats. // NewSockStatCollector returns a new Collector exposing socket stats.
func NewSockStatCollector(logger log.Logger) (Collector, error) { func NewSockStatCollector(logger *slog.Logger) (Collector, error) {
return &sockStatCollector{logger}, nil return &sockStatCollector{logger}, nil
} }
@ -58,7 +57,7 @@ func (c *sockStatCollector) Update(ch chan<- prometheus.Metric) error {
switch { switch {
case err == nil: case err == nil:
case errors.Is(err, os.ErrNotExist): case errors.Is(err, os.ErrNotExist):
level.Debug(c.logger).Log("msg", "IPv4 sockstat statistics not found, skipping") c.logger.Debug("IPv4 sockstat statistics not found, skipping")
default: default:
return fmt.Errorf("failed to get IPv4 sockstat data: %w", err) return fmt.Errorf("failed to get IPv4 sockstat data: %w", err)
} }
@ -67,7 +66,7 @@ func (c *sockStatCollector) Update(ch chan<- prometheus.Metric) error {
switch { switch {
case err == nil: case err == nil:
case errors.Is(err, os.ErrNotExist): case errors.Is(err, os.ErrNotExist):
level.Debug(c.logger).Log("msg", "IPv6 sockstat statistics not found, skipping") c.logger.Debug("IPv6 sockstat statistics not found, skipping")
default: default:
return fmt.Errorf("failed to get IPv6 sockstat data: %w", err) return fmt.Errorf("failed to get IPv6 sockstat data: %w", err)
} }

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save