| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package ntp
-
- import (
- "fmt"
- "math/rand"
- "time"
-
- "github.com/9seconds/mtg/config"
- "github.com/beevik/ntp"
- "go.uber.org/zap"
- )
-
- const autoUpdatePeriod = time.Minute
-
- // Fetch fetches the data on time drift.
- func Fetch() (time.Duration, error) {
- url := config.C.NTPServers[rand.Intn(len(config.C.NTPServers))] // nolint: gosec
-
- resp, err := ntp.Query(url)
- if err != nil {
- return 0, fmt.Errorf("cannot fetch NTP server %s: %w", url, err)
- }
-
- offsetInt := int64(resp.ClockOffset)
- if offsetInt < 0 {
- offsetInt = -offsetInt
- }
-
- offset := time.Duration(offsetInt)
-
- return offset, nil
- }
-
- // AutoUpdate runs periodic check of current time .drift state.
- func AutoUpdate() {
- logger := zap.S().Named("ntp")
-
- for range time.Tick(autoUpdatePeriod) {
- diff, err := Fetch()
- if err != nil {
- logger.Debugw("Cannot fetch time from NTP", "error", err)
-
- continue
- }
-
- switch {
- case diff < 400*time.Millisecond:
- logger.Debugw("NTP time drift", "value", diff.String())
- case diff < 600*time.Millisecond:
- logger.Infow("NTP time drift", "value", diff.String())
- case diff < 800*time.Millisecond:
- logger.Warnw("NTP time drift", "value", diff.String())
- default:
- logger.Errorw("NTP time drift", "value", diff.String())
- }
- }
- }
|