Browse Source

remove cgo dependency

by hardcoding `USER_HZ` (aka. `_SC_CLK_TCK`) to 100, which it is for all
platforms Go supports. See prometheus/node_exporter#52 for discussion around this too.

Closes prometheus/node_exporter#52.
pull/68/head
Matthias Rampke 10 years ago
parent
commit
2ee8470004
  1. 10
      collector/stat.go

10
collector/stat.go

@ -11,11 +11,9 @@ import (
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
// #include <unistd.h>
import "C"
const ( const (
procStat = "/proc/stat" procStat = "/proc/stat"
userHz = 100
) )
type statCollector struct { type statCollector struct {
@ -102,17 +100,17 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) {
// Only some of these may be present, depending on kernel version. // Only some of these may be present, depending on kernel version.
cpuFields := []string{"user", "nice", "system", "idle", "iowait", "irq", "softirq", "steal", "guest"} cpuFields := []string{"user", "nice", "system", "idle", "iowait", "irq", "softirq", "steal", "guest"}
// OpenVZ guests lack the "guest" CPU field, which needs to be ignored. // OpenVZ guests lack the "guest" CPU field, which needs to be ignored.
expectedFieldNum := len(cpuFields)+1 expectedFieldNum := len(cpuFields) + 1
if expectedFieldNum > len(parts) { if expectedFieldNum > len(parts) {
expectedFieldNum = len(parts) expectedFieldNum = len(parts)
} }
for i, v := range parts[1 : expectedFieldNum] { for i, v := range parts[1:expectedFieldNum] {
value, err := strconv.ParseFloat(v, 64) value, err := strconv.ParseFloat(v, 64)
if err != nil { if err != nil {
return err return err
} }
// Convert from ticks to seconds // Convert from ticks to seconds
value /= float64(C.sysconf(C._SC_CLK_TCK)) value /= userHz
c.cpu.With(prometheus.Labels{"cpu": parts[0], "mode": cpuFields[i]}).Set(value) c.cpu.With(prometheus.Labels{"cpu": parts[0], "mode": cpuFields[i]}).Set(value)
} }
case parts[0] == "intr": case parts[0] == "intr":

Loading…
Cancel
Save