node_exporter/collector/ntp.go
Johannes 'fish' Ziemke 32724a10b0 Add NTP exporter
This exporter gets the time from a NTP server and exposes the offset
between the remote and local system time.
2014-07-28 13:02:46 +02:00

57 lines
1.2 KiB
Go

// +build !nontp
package collector
import (
"flag"
"fmt"
"time"
"github.com/beevik/ntp"
"github.com/golang/glog"
"github.com/prometheus/client_golang/prometheus"
)
var (
ntpServer = flag.String("ntpServer", "", "NTP server to use for ntp collector.")
ntpDrift = prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: Namespace,
Name: "ntp_drift_seconds",
Help: "Time between system time and ntp time.",
})
)
type ntpCollector struct {
}
func init() {
Factories["ntp"] = NewNtpCollector
}
// Takes a config struct and prometheus registry and returns a new Collector exposing
// the offset between ntp and the current system time.
func NewNtpCollector(config Config) (Collector, error) {
if *ntpServer == "" {
return nil, fmt.Errorf("No NTP server specifies, see --ntpServer")
}
c := ntpCollector{}
if _, err := prometheus.RegisterOrGet(ntpDrift); err != nil {
return nil, err
}
return &c, nil
}
func (c *ntpCollector) Update() (updates int, err error) {
t, err := ntp.Time(*ntpServer)
if err != nil {
return updates, fmt.Errorf("Couldn't get ntp drift: %s", err)
}
drift := t.Sub(time.Now())
updates++
glog.V(1).Infof("Set ntp_drift_seconds: %f", drift.Seconds())
ntpDrift.Set(drift.Seconds())
return updates, err
}