func (_ *SystemStats) Gather(acc telegraf.Accumulator) error { loadavg, err := load.Avg() if err != nil { return err } hostinfo, err := host.Info() if err != nil { return err } users, err := host.Users() if err != nil { return err } acc.AddGauge("system", map[string]interface{}{ "load1": loadavg.Load1, "load5": loadavg.Load5, "load15": loadavg.Load15, "n_users": len(users), "n_cpus": runtime.NumCPU(), }, nil) acc.AddCounter("system", map[string]interface{}{ "uptime": hostinfo.Uptime, "uptime_format": format_uptime(hostinfo.Uptime), }, nil) return nil }
func (k *Kernel) Gather(acc telegraf.Accumulator) error { data, err := k.getProcStat() if err != nil { return err } fields := make(map[string]interface{}) dataFields := bytes.Fields(data) for i, field := range dataFields { switch { case bytes.Equal(field, interrupts): m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64) if err != nil { return err } fields["interrupts"] = int64(m) case bytes.Equal(field, context_switches): m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64) if err != nil { return err } fields["context_switches"] = int64(m) case bytes.Equal(field, processes_forked): m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64) if err != nil { return err } fields["processes_forked"] = int64(m) case bytes.Equal(field, boot_time): m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64) if err != nil { return err } fields["boot_time"] = int64(m) case bytes.Equal(field, disk_pages): in, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64) if err != nil { return err } out, err := strconv.ParseInt(string(dataFields[i+2]), 10, 64) if err != nil { return err } fields["disk_pages_in"] = int64(in) fields["disk_pages_out"] = int64(out) } } acc.AddCounter("kernel", fields, map[string]string{}) return nil }
func (s *DiskIOStats) Gather(acc telegraf.Accumulator) error { diskio, err := s.ps.DiskIO() if err != nil { return fmt.Errorf("error getting disk io info: %s", err) } var restrictDevices bool devices := make(map[string]bool) if len(s.Devices) != 0 { restrictDevices = true for _, dev := range s.Devices { devices[dev] = true } } for _, io := range diskio { _, member := devices[io.Name] if restrictDevices && !member { continue } tags := map[string]string{} tags["name"] = io.Name if !s.SkipSerialNumber { if len(io.SerialNumber) != 0 { tags["serial"] = io.SerialNumber } else { tags["serial"] = "unknown" } } fields := map[string]interface{}{ "reads": io.ReadCount, "writes": io.WriteCount, "read_bytes": io.ReadBytes, "write_bytes": io.WriteBytes, "read_time": io.ReadTime, "write_time": io.WriteTime, "io_time": io.IoTime, } acc.AddCounter("diskio", fields, tags) } return nil }
func (s *SwapStats) Gather(acc telegraf.Accumulator) error { swap, err := s.ps.SwapStat() if err != nil { return fmt.Errorf("error getting swap memory info: %s", err) } fieldsG := map[string]interface{}{ "total": swap.Total, "used": swap.Used, "free": swap.Free, "used_percent": swap.UsedPercent, } fieldsC := map[string]interface{}{ "in": swap.Sin, "out": swap.Sout, } acc.AddGauge("swap", fieldsG, nil) acc.AddCounter("swap", fieldsC, nil) return nil }
func (s *MemStats) Gather(acc telegraf.Accumulator) error { vm, err := s.ps.VMStat() if err != nil { return fmt.Errorf("error getting virtual memory info: %s", err) } fields := map[string]interface{}{ "total": vm.Total, "available": vm.Available, "used": vm.Used, "free": vm.Free, "cached": vm.Cached, "buffered": vm.Buffers, "active": vm.Active, "inactive": vm.Inactive, "used_percent": 100 * float64(vm.Used) / float64(vm.Total), "available_percent": 100 * float64(vm.Available) / float64(vm.Total), } acc.AddCounter("mem", fields, nil) return nil }
func (s *NetIOStats) Gather(acc telegraf.Accumulator) error { netio, err := s.ps.NetIO() if err != nil { return fmt.Errorf("error getting net io info: %s", err) } for _, io := range netio { if len(s.Interfaces) != 0 { var found bool for _, name := range s.Interfaces { if name == io.Name { found = true break } } if !found { continue } } else if !s.skipChecks { iface, err := net.InterfaceByName(io.Name) if err != nil { continue } if iface.Flags&net.FlagLoopback == net.FlagLoopback { continue } if iface.Flags&net.FlagUp == 0 { continue } } tags := map[string]string{ "interface": io.Name, } fields := map[string]interface{}{ "bytes_sent": io.BytesSent, "bytes_recv": io.BytesRecv, "packets_sent": io.PacketsSent, "packets_recv": io.PacketsRecv, "err_in": io.Errin, "err_out": io.Errout, "drop_in": io.Dropin, "drop_out": io.Dropout, } acc.AddCounter("net", fields, tags) } // Get system wide stats for different network protocols // (ignore these stats if the call fails) netprotos, _ := s.ps.NetProto() fields := make(map[string]interface{}) for _, proto := range netprotos { for stat, value := range proto.Stats { name := fmt.Sprintf("%s_%s", strings.ToLower(proto.Protocol), strings.ToLower(stat)) fields[name] = value } } tags := map[string]string{ "interface": "all", } acc.AddFields("net", fields, tags) return nil }
func (s *CPUStats) Gather(acc telegraf.Accumulator) error { times, err := s.ps.CPUTimes(s.PerCPU, s.TotalCPU) if err != nil { return fmt.Errorf("error getting CPU info: %s", err) } now := time.Now() for i, cts := range times { tags := map[string]string{ "cpu": cts.CPU, } total := totalCpuTime(cts) if s.CollectCPUTime { // Add cpu time metrics fieldsC := map[string]interface{}{ "time_user": cts.User, "time_system": cts.System, "time_idle": cts.Idle, "time_nice": cts.Nice, "time_iowait": cts.Iowait, "time_irq": cts.Irq, "time_softirq": cts.Softirq, "time_steal": cts.Steal, "time_guest": cts.Guest, "time_guest_nice": cts.GuestNice, } acc.AddCounter("cpu", fieldsC, tags, now) } // Add in percentage if len(s.lastStats) == 0 { // If it's the 1st gather, can't get CPU Usage stats yet continue } lastCts := s.lastStats[i] lastTotal := totalCpuTime(lastCts) totalDelta := total - lastTotal if totalDelta < 0 { s.lastStats = times return fmt.Errorf("Error: current total CPU time is less than previous total CPU time") } if totalDelta == 0 { continue } fieldsG := map[string]interface{}{ "usage_user": 100 * (cts.User - lastCts.User) / totalDelta, "usage_system": 100 * (cts.System - lastCts.System) / totalDelta, "usage_idle": 100 * (cts.Idle - lastCts.Idle) / totalDelta, "usage_nice": 100 * (cts.Nice - lastCts.Nice) / totalDelta, "usage_iowait": 100 * (cts.Iowait - lastCts.Iowait) / totalDelta, "usage_irq": 100 * (cts.Irq - lastCts.Irq) / totalDelta, "usage_softirq": 100 * (cts.Softirq - lastCts.Softirq) / totalDelta, "usage_steal": 100 * (cts.Steal - lastCts.Steal) / totalDelta, "usage_guest": 100 * (cts.Guest - lastCts.Guest) / totalDelta, "usage_guest_nice": 100 * (cts.GuestNice - lastCts.GuestNice) / totalDelta, } acc.AddGauge("cpu", fieldsG, tags, now) } s.lastStats = times return nil }