Merge pull request #397 from dominikh/freebsd-cpu

Collect CPU temperatures on FreeBSD
pull/408/head
Johannes 'fish' Ziemke 8 years ago committed by GitHub
commit 3e266e28b9

@ -16,10 +16,13 @@
package collector package collector
import ( import (
"fmt"
"math"
"strconv" "strconv"
"unsafe" "unsafe"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -79,6 +82,7 @@ func getCPUTimes() ([]cputime, error) {
type statCollector struct { type statCollector struct {
cpu typedDesc cpu typedDesc
temp typedDesc
} }
func init() { func init() {
@ -94,6 +98,11 @@ func NewStatCollector() (Collector, error) {
"Seconds the CPU spent in each mode.", "Seconds the CPU spent in each mode.",
[]string{"cpu", "mode"}, nil, []string{"cpu", "mode"}, nil,
), prometheus.CounterValue}, ), prometheus.CounterValue},
temp: typedDesc{prometheus.NewDesc(
prometheus.BuildFQName(Namespace, "cpu", "temperature_celsius"),
"CPU temperature",
[]string{"cpu"}, nil,
), prometheus.GaugeValue},
}, nil }, nil
} }
@ -115,11 +124,26 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) {
return err return err
} }
for cpu, t := range cpuTimes { for cpu, t := range cpuTimes {
ch <- c.cpu.mustNewConstMetric(float64(t.user), strconv.Itoa(cpu), "user") lcpu := strconv.Itoa(cpu)
ch <- c.cpu.mustNewConstMetric(float64(t.nice), strconv.Itoa(cpu), "nice") ch <- c.cpu.mustNewConstMetric(float64(t.user), lcpu, "user")
ch <- c.cpu.mustNewConstMetric(float64(t.sys), strconv.Itoa(cpu), "system") ch <- c.cpu.mustNewConstMetric(float64(t.nice), lcpu, "nice")
ch <- c.cpu.mustNewConstMetric(float64(t.intr), strconv.Itoa(cpu), "interrupt") ch <- c.cpu.mustNewConstMetric(float64(t.sys), lcpu, "system")
ch <- c.cpu.mustNewConstMetric(float64(t.idle), strconv.Itoa(cpu), "idle") ch <- c.cpu.mustNewConstMetric(float64(t.intr), lcpu, "interrupt")
ch <- c.cpu.mustNewConstMetric(float64(t.idle), lcpu, "idle")
temp, err := unix.SysctlUint32(fmt.Sprintf("dev.cpu.%d.temperature", cpu))
if err != nil {
if err == unix.ENOENT {
// No temperature information for this CPU
log.Debugf("no temperature information for CPU %d", cpu)
} else {
// Unexpected error
ch <- c.temp.mustNewConstMetric(math.NaN(), lcpu)
log.Errorf("failed to query CPU temperature for CPU %d: %s", cpu, err)
}
continue
}
ch <- c.temp.mustNewConstMetric(float64(temp-2732)/10, lcpu)
} }
return err return err
} }

Loading…
Cancel
Save