Add NTP exporter

This exporter gets the time from a NTP server and exposes the offset
between the remote and local system time.
This commit is contained in:
Johannes 'fish' Ziemke 2014-07-28 12:36:28 +02:00
parent 053db59122
commit 32724a10b0

56
collector/ntp.go Normal file
View File

@ -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
}