categraf/inputs/system/system.go

82 lines
1.7 KiB
Go
Raw Normal View History

2022-04-14 18:34:27 +08:00
package system
import (
"log"
"os"
"strings"
2022-04-17 12:54:32 +08:00
"flashcat.cloud/categraf/config"
2022-04-14 18:34:27 +08:00
"flashcat.cloud/categraf/inputs"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/host"
"github.com/shirou/gopsutil/v3/load"
2022-04-25 15:34:15 +08:00
"github.com/toolkits/pkg/container/list"
2022-04-14 18:34:27 +08:00
)
2022-04-17 08:02:33 +08:00
const inputName = "system"
2022-04-14 18:34:27 +08:00
type SystemStats struct {
config.Interval
CollectUserNumber bool `toml:"collect_user_number"`
2022-04-14 18:34:27 +08:00
}
2022-04-14 23:10:14 +08:00
func init() {
2022-04-17 08:02:33 +08:00
inputs.Add(inputName, func() inputs.Input {
2022-04-16 16:52:23 +08:00
return &SystemStats{}
2022-04-14 23:10:14 +08:00
})
}
func (s *SystemStats) Prefix() string {
2022-04-17 08:02:33 +08:00
return inputName
2022-04-14 18:34:27 +08:00
}
2022-04-16 16:52:23 +08:00
func (s *SystemStats) Init() error {
return nil
2022-04-15 18:19:15 +08:00
}
2022-04-18 17:35:16 +08:00
func (s *SystemStats) Drop() {}
2022-04-25 15:34:15 +08:00
func (s *SystemStats) Gather(slist *list.SafeList) {
2022-04-14 18:34:27 +08:00
loadavg, err := load.Avg()
if err != nil && !strings.Contains(err.Error(), "not implemented") {
log.Println("E! failed to gather system load:", err)
2022-04-25 15:34:15 +08:00
return
2022-04-14 18:34:27 +08:00
}
numCPUs, err := cpu.Counts(true)
if err != nil {
log.Println("E! failed to gather cpu number:", err)
2022-04-25 15:34:15 +08:00
return
2022-04-14 18:34:27 +08:00
}
2022-04-15 11:00:18 +08:00
fields := map[string]interface{}{
"load1": loadavg.Load1,
"load5": loadavg.Load5,
"load15": loadavg.Load15,
"n_cpus": numCPUs,
"load_norm_1": loadavg.Load1 / float64(numCPUs),
"load_norm_5": loadavg.Load5 / float64(numCPUs),
"load_norm_15": loadavg.Load15 / float64(numCPUs),
}
2022-04-14 18:34:27 +08:00
uptime, err := host.Uptime()
if err != nil {
log.Println("E! failed to get host uptime:", err)
2022-04-15 18:19:15 +08:00
} else {
fields["uptime"] = uptime
2022-04-14 18:34:27 +08:00
}
if s.CollectUserNumber {
users, err := host.Users()
if err == nil {
2022-04-15 11:00:18 +08:00
fields["n_users"] = len(users)
2022-04-14 18:34:27 +08:00
} else if os.IsNotExist(err) {
2022-04-14 23:10:14 +08:00
log.Println("W! reading os users:", err)
2022-04-14 18:34:27 +08:00
} else if os.IsPermission(err) {
2022-04-14 23:10:14 +08:00
log.Println("W! reading os users:", err)
2022-04-14 18:34:27 +08:00
}
}
2022-04-15 11:00:18 +08:00
2022-04-25 15:34:15 +08:00
inputs.PushSamples(slist, fields)
2022-04-14 18:34:27 +08:00
}