// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package hoststats import ( "time" "github.com/armon/go-metrics" ) var hostStatsCollectionInterval = 10 * time.Second // HostStats represents resource usage hoststats of the host running a Consul agent type HostStats struct { Memory *MemoryStats CPU []*CPUStats DataDirStats *DiskStats Uptime uint64 Timestamp int64 } func (hs *HostStats) Clone() *HostStats { clone := &HostStats{} *clone = *hs return clone } func (hs *HostStats) Emit(sink Metrics, baseLabels []metrics.Label) { if hs.Memory != nil { sink.SetGaugeWithLabels([]string{"host", "memory", "total"}, float32(hs.Memory.Total), baseLabels) sink.SetGaugeWithLabels([]string{"host", "memory", "available"}, float32(hs.Memory.Available), baseLabels) sink.SetGaugeWithLabels([]string{"host", "memory", "used"}, float32(hs.Memory.Used), baseLabels) sink.SetGaugeWithLabels([]string{"host", "memory", "used_percent"}, float32(hs.Memory.UsedPercent), baseLabels) sink.SetGaugeWithLabels([]string{"host", "memory", "free"}, float32(hs.Memory.Free), baseLabels) } for _, cpu := range hs.CPU { labels := append(baseLabels, metrics.Label{ Name: "cpu", Value: cpu.CPU, }) sink.SetGaugeWithLabels([]string{"host", "cpu", "total"}, float32(cpu.Total), labels) sink.SetGaugeWithLabels([]string{"host", "cpu", "user"}, float32(cpu.User), labels) sink.SetGaugeWithLabels([]string{"host", "cpu", "idle"}, float32(cpu.Idle), labels) sink.SetGaugeWithLabels([]string{"host", "cpu", "iowait"}, float32(cpu.Iowait), labels) sink.SetGaugeWithLabels([]string{"host", "cpu", "system"}, float32(cpu.System), labels) } if hs.DataDirStats != nil { diskLabels := append(baseLabels, metrics.Label{ Name: "path", Value: hs.DataDirStats.Path, }) sink.SetGaugeWithLabels([]string{"host", "disk", "size"}, float32(hs.DataDirStats.Size), diskLabels) sink.SetGaugeWithLabels([]string{"host", "disk", "used"}, float32(hs.DataDirStats.Used), diskLabels) sink.SetGaugeWithLabels([]string{"host", "disk", "available"}, float32(hs.DataDirStats.Available), diskLabels) sink.SetGaugeWithLabels([]string{"host", "disk", "used_percent"}, float32(hs.DataDirStats.UsedPercent), diskLabels) sink.SetGaugeWithLabels([]string{"host", "disk", "inodes_percent"}, float32(hs.DataDirStats.InodesUsedPercent), diskLabels) } sink.SetGaugeWithLabels([]string{"host", "uptime"}, float32(hs.Uptime), baseLabels) } // CPUStats represents hoststats related to cpu usage type CPUStats struct { CPU string User float64 System float64 Idle float64 Iowait float64 Total float64 } // MemoryStats represents hoststats related to virtual memory usage type MemoryStats struct { Total uint64 Available uint64 Used uint64 UsedPercent float64 Free uint64 } // DiskStats represents hoststats related to disk usage type DiskStats struct { Path string Size uint64 Used uint64 Available uint64 UsedPercent float64 InodesUsedPercent float64 }