diff --git a/collector/ntp.go b/collector/ntp.go new file mode 100644 index 00000000..3e3ca041 --- /dev/null +++ b/collector/ntp.go @@ -0,0 +1,56 @@ +// +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 +}