diff --git a/collector/loadavg.go b/collector/loadavg.go index 1b27a68e..d8d580d2 100644 --- a/collector/loadavg.go +++ b/collector/loadavg.go @@ -12,59 +12,56 @@ // limitations under the License. // +build !noloadavg -// +build !linux package collector import ( - "errors" "fmt" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" ) -// #include -import "C" - type loadavgCollector struct { - metric prometheus.Gauge + metric []prometheus.Gauge } func init() { Factories["loadavg"] = NewLoadavgCollector } -// Takes a prometheus registry and returns a new Collector exposing -// load1 stat. +// Take a prometheus registry and return a new Collector exposing load average. func NewLoadavgCollector() (Collector, error) { return &loadavgCollector{ - metric: prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: Namespace, - Name: "load1", - Help: "1m load average.", - }), + metric: []prometheus.Gauge{ + prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "load1", + Help: "1m load average.", + }), + prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "load5", + Help: "5m load average.", + }), + prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "load15", + Help: "15m load average.", + }), + }, }, nil } func (c *loadavgCollector) Update(ch chan<- prometheus.Metric) (err error) { - load, err := getLoad1() + loads, err := getLoad() if err != nil { return fmt.Errorf("couldn't get load: %s", err) } - log.Debugf("Set node_load: %f", load) - c.metric.Set(load) - c.metric.Collect(ch) + for i, load := range loads { + log.Debugf("Set load %d: %f", i, load) + c.metric[i].Set(load) + c.metric[i].Collect(ch) + } return err } - -func getLoad1() (float64, error) { - var loadavg [1]C.double - samples := C.getloadavg(&loadavg[0], 1) - if samples > 0 { - return float64(loadavg[0]), nil - } else { - return 0, errors.New("failed to get load average") - } - -} diff --git a/collector/loadavg_linux.go b/collector/loadavg_linux.go index b03cf02f..668d3eda 100644 --- a/collector/loadavg_linux.go +++ b/collector/loadavg_linux.go @@ -20,55 +20,8 @@ import ( "io/ioutil" "strconv" "strings" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/common/log" ) -type loadavgCollector struct { - metric []prometheus.Gauge -} - -func init() { - Factories["loadavg"] = NewLoadavgCollector -} - -// Take a prometheus registry and return a new Collector exposing load average. -func NewLoadavgCollector() (Collector, error) { - return &loadavgCollector{ - metric: []prometheus.Gauge{ - prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: Namespace, - Name: "load1", - Help: "1m load average.", - }), - prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: Namespace, - Name: "load5", - Help: "5m load average.", - }), - prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: Namespace, - Name: "load15", - Help: "15m load average.", - }), - }, - }, nil -} - -func (c *loadavgCollector) Update(ch chan<- prometheus.Metric) (err error) { - loads, err := getLoad() - if err != nil { - return fmt.Errorf("couldn't get load: %s", err) - } - for i, load := range loads { - log.Debugf("Set load %d: %f", i, load) - c.metric[i].Set(load) - c.metric[i].Collect(ch) - } - return err -} - // Read loadavg from /proc. func getLoad() (loads []float64, err error) { data, err := ioutil.ReadFile(procFilePath("loadavg")) diff --git a/collector/loadavg_unix.go b/collector/loadavg_unix.go new file mode 100644 index 00000000..f121a657 --- /dev/null +++ b/collector/loadavg_unix.go @@ -0,0 +1,34 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build darwin dragonfly freebsd netbsd openbsd solaris +// +build !noloadavg + +package collector + +import ( + "errors" +) + +// #include +import "C" + +func getLoad() ([]float64, error) { + var loadavg [3]C.double + samples := C.getloadavg(&loadavg[0], 3) + if samples > 0 { + return []float64{float64(loadavg[0]), float64(loadavg[1]), float64(loadavg[2])}, nil + } else { + return nil, errors.New("failed to get load average") + } +}