|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
// +build !nostat
|
|
|
|
|
// +build !cpu
|
|
|
|
|
|
|
|
|
|
package collector
|
|
|
|
|
|
|
|
|
@ -21,8 +21,6 @@ import (
|
|
|
|
|
*/
|
|
|
|
|
import "C"
|
|
|
|
|
|
|
|
|
|
const ()
|
|
|
|
|
|
|
|
|
|
type statCollector struct {
|
|
|
|
|
cpu *prometheus.CounterVec
|
|
|
|
|
}
|
|
|
|
@ -31,30 +29,31 @@ func init() {
|
|
|
|
|
Factories["cpu"] = NewStatCollector
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// cpu stats.
|
|
|
|
|
// Takes a prometheus registry and returns a new Collector exposing
|
|
|
|
|
// CPU stats.
|
|
|
|
|
func NewStatCollector() (Collector, error) {
|
|
|
|
|
return &statCollector{
|
|
|
|
|
cpu: prometheus.NewCounterVec(
|
|
|
|
|
prometheus.CounterOpts{
|
|
|
|
|
Namespace: Namespace,
|
|
|
|
|
Name: "cpu",
|
|
|
|
|
Help: "Seconds the cpus spent in each mode.",
|
|
|
|
|
Name: "cpu_seconds_total",
|
|
|
|
|
Help: "Seconds the CPU spent in each mode.",
|
|
|
|
|
},
|
|
|
|
|
[]string{"cpu", "mode"},
|
|
|
|
|
),
|
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Expose cpu stats using kvm
|
|
|
|
|
// Expose CPU stats using KVM.
|
|
|
|
|
func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) {
|
|
|
|
|
if os.Geteuid() != 0 && os.Getegid() != 2 {
|
|
|
|
|
return errors.New("Caller should be either root user or kmem group to access /dev/mem")
|
|
|
|
|
return errors.New("caller should be either root user or kmem group to access /dev/mem")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var errbuf *C.char
|
|
|
|
|
kd := C.kvm_open(nil, nil, nil, C.O_RDONLY, errbuf)
|
|
|
|
|
if errbuf != nil {
|
|
|
|
|
return errors.New("Failed to call kvm_open().")
|
|
|
|
|
return errors.New("failed to call kvm_open().")
|
|
|
|
|
}
|
|
|
|
|
defer C.kvm_close(kd)
|
|
|
|
|
|
|
|
|
|