diff --git a/collector/cpu_freebsd.go b/collector/cpu_freebsd.go index 11a9b33e..adbdfcf7 100644 --- a/collector/cpu_freebsd.go +++ b/collector/cpu_freebsd.go @@ -16,10 +16,13 @@ package collector import ( + "fmt" + "math" "strconv" "unsafe" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/log" "golang.org/x/sys/unix" ) @@ -78,7 +81,8 @@ func getCPUTimes() ([]cputime, error) { } type statCollector struct { - cpu typedDesc + cpu typedDesc + temp typedDesc } func init() { @@ -94,6 +98,11 @@ func NewStatCollector() (Collector, error) { "Seconds the CPU spent in each mode.", []string{"cpu", "mode"}, nil, ), prometheus.CounterValue}, + temp: typedDesc{prometheus.NewDesc( + prometheus.BuildFQName(Namespace, "cpu", "temperature_celsius"), + "CPU temperature", + []string{"cpu"}, nil, + ), prometheus.GaugeValue}, }, nil } @@ -115,11 +124,26 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) { return err } for cpu, t := range cpuTimes { - ch <- c.cpu.mustNewConstMetric(float64(t.user), strconv.Itoa(cpu), "user") - ch <- c.cpu.mustNewConstMetric(float64(t.nice), strconv.Itoa(cpu), "nice") - ch <- c.cpu.mustNewConstMetric(float64(t.sys), strconv.Itoa(cpu), "system") - ch <- c.cpu.mustNewConstMetric(float64(t.intr), strconv.Itoa(cpu), "interrupt") - ch <- c.cpu.mustNewConstMetric(float64(t.idle), strconv.Itoa(cpu), "idle") + lcpu := strconv.Itoa(cpu) + ch <- c.cpu.mustNewConstMetric(float64(t.user), lcpu, "user") + ch <- c.cpu.mustNewConstMetric(float64(t.nice), lcpu, "nice") + ch <- c.cpu.mustNewConstMetric(float64(t.sys), lcpu, "system") + 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 }