diff --git a/plugins/inputs/internet_speed/README.md b/plugins/inputs/internet_speed/README.md index 0d10cc7d2..4600ab473 100644 --- a/plugins/inputs/internet_speed/README.md +++ b/plugins/inputs/internet_speed/README.md @@ -8,8 +8,10 @@ The `Internet Speed Monitor` collects data about the internet speed on the syste # Monitors internet speed in the network [[inputs.internet_speed]] ## Sets if runs file download test - ## Default: false - enable_file_download = false + # enable_file_download = false + + ## Caches the closest server location + # cache = false ``` ## Metrics diff --git a/plugins/inputs/internet_speed/internet_speed.go b/plugins/inputs/internet_speed/internet_speed.go index 58fb29c59..bacbe3ce4 100644 --- a/plugins/inputs/internet_speed/internet_speed.go +++ b/plugins/inputs/internet_speed/internet_speed.go @@ -12,13 +12,17 @@ import ( // InternetSpeed is used to store configuration values. type InternetSpeed struct { EnableFileDownload bool `toml:"enable_file_download"` + Cache bool `toml:"cache"` Log telegraf.Logger `toml:"-"` + serverCache *speedtest.Server } const sampleConfig = ` ## Sets if runs file download test - ## Default: false - enable_file_download = false + # enable_file_download = false + + ## Caches the closest server location + # cache = false ` // Description returns information about the plugin. @@ -34,22 +38,31 @@ func (is *InternetSpeed) SampleConfig() string { const measurement = "internet_speed" func (is *InternetSpeed) Gather(acc telegraf.Accumulator) error { - user, err := speedtest.FetchUserInfo() - if err != nil { - return fmt.Errorf("fetching user info failed: %v", err) - } - serverList, err := speedtest.FetchServerList(user) - if err != nil { - return fmt.Errorf("fetching server list failed: %v", err) + + // Get closest server + s := is.serverCache + if s == nil { + user, err := speedtest.FetchUserInfo() + if err != nil { + return fmt.Errorf("fetching user info failed: %v", err) + } + serverList, err := speedtest.FetchServerList(user) + if err != nil { + return fmt.Errorf("fetching server list failed: %v", err) + } + if len(serverList.Servers) < 1 { + return fmt.Errorf("no servers found") + } + s = serverList.Servers[0] + is.Log.Debugf("Found server: %v", s) + if is.Cache { + is.serverCache = s + } } - if len(serverList.Servers) < 1 { - return fmt.Errorf("no servers found") - } - s := serverList.Servers[0] is.Log.Debug("Starting Speed Test") is.Log.Debug("Running Ping...") - err = s.PingTest() + err := s.PingTest() if err != nil { return fmt.Errorf("ping test failed: %v", err) } @@ -76,6 +89,7 @@ func (is *InternetSpeed) Gather(acc telegraf.Accumulator) error { acc.AddFields(measurement, fields, tags) return nil } + func init() { inputs.Add("internet_speed", func() telegraf.Input { return &InternetSpeed{}