mirror of
https://github.com/prometheus/node_exporter.git
synced 2024-12-31 16:37:31 -08:00
1c17481a42
Switch to Update using the Collecter Collect interface, due to not knowing all metricnames in all modules beforehand we can't use Describe and thus the full Collecter interface. Remove 'updates', it's meaning varies by module and doesn't add much.
71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
// +build !noloadavg
|
|
|
|
package collector
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/golang/glog"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
const (
|
|
procLoad = "/proc/loadavg"
|
|
)
|
|
|
|
var (
|
|
load1 = prometheus.NewGauge(prometheus.GaugeOpts{
|
|
Namespace: Namespace,
|
|
Name: "load1",
|
|
Help: "1m load average.",
|
|
})
|
|
)
|
|
|
|
type loadavgCollector struct {
|
|
config Config
|
|
}
|
|
|
|
func init() {
|
|
Factories["loadavg"] = NewLoadavgCollector
|
|
}
|
|
|
|
// Takes a config struct and prometheus registry and returns a new Collector exposing
|
|
// load, seconds since last login and a list of tags as specified by config.
|
|
func NewLoadavgCollector(config Config) (Collector, error) {
|
|
c := loadavgCollector{
|
|
config: config,
|
|
}
|
|
return &c, nil
|
|
}
|
|
|
|
func (c *loadavgCollector) Update(ch chan<- prometheus.Metric) (err error) {
|
|
load, err := getLoad1()
|
|
if err != nil {
|
|
return fmt.Errorf("Couldn't get load: %s", err)
|
|
}
|
|
glog.V(1).Infof("Set node_load: %f", load)
|
|
load1.Set(load)
|
|
load1.Collect(ch)
|
|
return err
|
|
}
|
|
|
|
func getLoad1() (float64, error) {
|
|
data, err := ioutil.ReadFile(procLoad)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return parseLoad(string(data))
|
|
}
|
|
|
|
func parseLoad(data string) (float64, error) {
|
|
parts := strings.Fields(data)
|
|
load, err := strconv.ParseFloat(parts[0], 64)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("Could not parse load '%s': %s", parts[0], err)
|
|
}
|
|
return load, nil
|
|
}
|