2021-09-15 05:26:49 +08:00
|
|
|
package internet_speed
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2021-10-20 00:42:15 +08:00
|
|
|
"time"
|
2021-09-15 05:26:49 +08:00
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf"
|
|
|
|
|
"github.com/influxdata/telegraf/plugins/inputs"
|
|
|
|
|
"github.com/showwin/speedtest-go/speedtest"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// InternetSpeed is used to store configuration values.
|
|
|
|
|
type InternetSpeed struct {
|
|
|
|
|
EnableFileDownload bool `toml:"enable_file_download"`
|
2022-02-02 06:12:24 +08:00
|
|
|
Cache bool `toml:"cache"`
|
2021-09-15 05:26:49 +08:00
|
|
|
Log telegraf.Logger `toml:"-"`
|
2022-02-02 06:12:24 +08:00
|
|
|
serverCache *speedtest.Server
|
2021-09-15 05:26:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const measurement = "internet_speed"
|
|
|
|
|
|
|
|
|
|
func (is *InternetSpeed) Gather(acc telegraf.Accumulator) error {
|
|
|
|
|
|
2022-02-02 06:12:24 +08:00
|
|
|
// 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)
|
|
|
|
|
}
|
2022-05-12 23:58:24 +08:00
|
|
|
serverList, err := speedtest.FetchServers(user)
|
2022-02-02 06:12:24 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("fetching server list failed: %v", err)
|
|
|
|
|
}
|
2022-05-12 23:58:24 +08:00
|
|
|
if len(serverList) < 1 {
|
2022-02-02 06:12:24 +08:00
|
|
|
return fmt.Errorf("no servers found")
|
|
|
|
|
}
|
2022-05-12 23:58:24 +08:00
|
|
|
s = serverList[0]
|
2022-02-02 06:12:24 +08:00
|
|
|
is.Log.Debugf("Found server: %v", s)
|
|
|
|
|
if is.Cache {
|
|
|
|
|
is.serverCache = s
|
|
|
|
|
}
|
2021-09-15 05:26:49 +08:00
|
|
|
}
|
2022-02-02 06:12:24 +08:00
|
|
|
|
2021-09-15 05:26:49 +08:00
|
|
|
is.Log.Debug("Starting Speed Test")
|
|
|
|
|
is.Log.Debug("Running Ping...")
|
2022-02-02 06:12:24 +08:00
|
|
|
err := s.PingTest()
|
2021-09-15 05:26:49 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("ping test failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
is.Log.Debug("Running Download...")
|
|
|
|
|
err = s.DownloadTest(is.EnableFileDownload)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("download test failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
is.Log.Debug("Running Upload...")
|
|
|
|
|
err = s.UploadTest(is.EnableFileDownload)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("upload test failed failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
is.Log.Debug("Test finished.")
|
|
|
|
|
|
|
|
|
|
fields := make(map[string]interface{})
|
|
|
|
|
fields["download"] = s.DLSpeed
|
|
|
|
|
fields["upload"] = s.ULSpeed
|
2021-10-20 00:42:15 +08:00
|
|
|
fields["latency"] = timeDurationMillisecondToFloat64(s.Latency)
|
2021-09-15 05:26:49 +08:00
|
|
|
|
|
|
|
|
tags := make(map[string]string)
|
|
|
|
|
|
|
|
|
|
acc.AddFields(measurement, fields, tags)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2022-02-02 06:12:24 +08:00
|
|
|
|
2021-09-15 05:26:49 +08:00
|
|
|
func init() {
|
|
|
|
|
inputs.Add("internet_speed", func() telegraf.Input {
|
|
|
|
|
return &InternetSpeed{}
|
|
|
|
|
})
|
|
|
|
|
}
|
2021-10-20 00:42:15 +08:00
|
|
|
|
|
|
|
|
func timeDurationMillisecondToFloat64(d time.Duration) float64 {
|
|
|
|
|
return float64(d) / float64(time.Millisecond)
|
|
|
|
|
}
|