diff --git a/metric/system/cpu/cpu.go b/metric/system/cpu/cpu.go index fe2b85581..f7852de30 100644 --- a/metric/system/cpu/cpu.go +++ b/metric/system/cpu/cpu.go @@ -23,24 +23,33 @@ package cpu import ( "github.com/shirou/gopsutil/v4/load" + "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-system-metrics/metric" "github.com/elastic/elastic-agent-system-metrics/metric/system/numcpu" ) // Load returns CPU load information for the previous 1, 5, and 15 minute // periods. +// Deprecated: use LoadWithLogger func Load() (*LoadMetrics, error) { + return LoadWithLogger(logp.NewLogger("")) +} + +// LoadWithLogger returns CPU load information for the previous 1, 5, and 15 minute +// periods. +func LoadWithLogger(logger *logp.Logger) (*LoadMetrics, error) { avg, err := load.Avg() if err != nil { return nil, err } - return &LoadMetrics{avg}, nil + return &LoadMetrics{avg, logger}, nil } // LoadMetrics stores the sampled load average values of the host. type LoadMetrics struct { sample *load.AvgStat + logger *logp.Logger } // LoadAverages stores the values of load averages of the last 1, 5 and 15 minutes. @@ -63,7 +72,7 @@ func (m *LoadMetrics) Averages() LoadAverages { // NormalizedAverages return the CPU load averages normalized by the NumCPU. // These values should range from 0 to 1. func (m *LoadMetrics) NormalizedAverages() LoadAverages { - cpus := numcpu.NumCPU() + cpus := numcpu.NumCPUWithLogger(m.logger) return LoadAverages{ OneMinute: metric.Round(m.sample.Load1 / float64(cpus)), FiveMinute: metric.Round(m.sample.Load5 / float64(cpus)), diff --git a/metric/system/diskio/diskstat_linux.go b/metric/system/diskio/diskstat_linux.go index 3a19d95d4..912bf72ec 100644 --- a/metric/system/diskio/diskstat_linux.go +++ b/metric/system/diskio/diskstat_linux.go @@ -27,6 +27,7 @@ import ( "github.com/shirou/gopsutil/v4/cpu" "github.com/shirou/gopsutil/v4/disk" + "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-system-metrics/metric" "github.com/elastic/elastic-agent-system-metrics/metric/system/numcpu" ) @@ -39,7 +40,7 @@ func GetCLKTCK() uint32 { } // IOCounters should map functionality to disk package for linux os. -func IOCounters(names ...string) (map[string]disk.IOCountersStat, error) { +func IOCounters(_ *logp.Logger, names ...string) (map[string]disk.IOCountersStat, error) { return disk.IOCounters(names...) } @@ -95,7 +96,7 @@ func (stat *IOStat) CalcIOStatistics(counter disk.IOCountersStat) (IOMetric, err } // calculate the delta ms between the CloseSampling and OpenSampling - deltams := 1000.0 * (float64(uint64(total(stat.curCPU)) - uint64(total(stat.lastCPU)))) / float64(numcpu.NumCPU()) + deltams := 1000.0 * (float64(uint64(total(stat.curCPU)) - uint64(total(stat.lastCPU)))) / float64(numcpu.NumCPUWithLogger(logp.NewLogger(""))) if deltams <= 0 { return IOMetric{}, errors.New("the delta cpu time between close sampling and open sampling is less or equal to 0") } diff --git a/metric/system/diskio/diskstat_other.go b/metric/system/diskio/diskstat_other.go index 758b8ad32..600e85d00 100644 --- a/metric/system/diskio/diskstat_other.go +++ b/metric/system/diskio/diskstat_other.go @@ -24,6 +24,8 @@ import ( "errors" "github.com/shirou/gopsutil/v4/disk" + + "github.com/elastic/elastic-agent-libs/logp" ) // NewDiskIOStat :init DiskIOStat object. @@ -47,6 +49,6 @@ func (stat *IOStat) CalcIOStatistics(rcounter disk.IOCountersStat) (IOMetric, er func (stat *IOStat) CloseSampling() {} // IOCounters should map functionality to disk package for linux os. -func IOCounters(names ...string) (map[string]disk.IOCountersStat, error) { +func IOCounters(_ *logp.Logger, names ...string) (map[string]disk.IOCountersStat, error) { return disk.IOCounters(names...) } diff --git a/metric/system/numcpu/numcpu.go b/metric/system/numcpu/numcpu.go index b9dd1287f..70ec9544b 100644 --- a/metric/system/numcpu/numcpu.go +++ b/metric/system/numcpu/numcpu.go @@ -31,14 +31,20 @@ import ( // this number will not reflect the system config. // Because this is drop-in, it will not return an error. // if it can't fetch the CPU count the "correct" way, it'll fallback to runtime.NumCPU(). +// +// Deprecated: use NumCPUWithLogger func NumCPU() int { + return NumCPUWithLogger(logp.NewLogger("")) +} + +func NumCPUWithLogger(logger *logp.Logger) int { count, exists, err := getCPU() if err != nil { - logp.L().Debugf("Error fetching CPU count: %s", err) + logger.Debugf("Error fetching CPU count: %v", err) return runtime.NumCPU() } if !exists { - logp.L().Debugf("Accurate CPU counts not available on platform, falling back to runtime.NumCPU for metrics") + logger.Debugf("Accurate CPU counts not available on platform, falling back to runtime.NumCPU for metrics") return runtime.NumCPU() } diff --git a/report/report.go b/report/report.go index 300e2bcc0..8489b6eb2 100644 --- a/report/report.go +++ b/report/report.go @@ -41,7 +41,7 @@ import ( func MemStatsReporter(logger *logp.Logger, processStats *process.Stats) func(monitoring.Mode, monitoring.Visitor) { pid, err := process.GetSelfPid(processStats.Hostfs) if err != nil { - logger.Error("Error while retrieving pid: %v", err) + logger.Errorf("Error while retrieving pid: %v", err) return nil } p := psprocess.Process{ @@ -80,7 +80,7 @@ func MemStatsReporter(logger *logp.Logger, processStats *process.Stats) func(mon func InstanceCPUReporter(logger *logp.Logger, processStats *process.Stats) func(monitoring.Mode, monitoring.Visitor) { pid, err := process.GetSelfPid(processStats.Hostfs) if err != nil { - logger.Error("Error while retrieving pid: %v", err) + logger.Errorf("Error while retrieving pid: %v", err) return nil } p := psprocess.Process{ @@ -133,7 +133,7 @@ func ReportSystemLoadAverage(logger *logp.Logger) func(monitoring.Mode, monitori V.OnRegistryStart() defer V.OnRegistryFinished() - load, err := cpu.Load() + load, err := cpu.LoadWithLogger(logger) if err != nil { logger.Errorf("Error retrieving load average: %v", err) return @@ -152,11 +152,13 @@ func ReportSystemLoadAverage(logger *logp.Logger) func(monitoring.Mode, monitori } } -func ReportSystemCPUUsage(_ monitoring.Mode, V monitoring.Visitor) { - V.OnRegistryStart() - defer V.OnRegistryFinished() +func ReportSystemCPUUsage(logger *logp.Logger) func(monitoring.Mode, monitoring.Visitor) { + return func(m monitoring.Mode, V monitoring.Visitor) { + V.OnRegistryStart() + defer V.OnRegistryFinished() - monitoring.ReportInt(V, "cores", int64(numcpu.NumCPU())) + monitoring.ReportInt(V, "cores", int64(numcpu.NumCPUWithLogger(logger))) + } } func ReportRuntime(_ monitoring.Mode, V monitoring.Visitor) { diff --git a/report/setup.go b/report/setup.go index e790d2b65..58fd48ccf 100644 --- a/report/setup.go +++ b/report/setup.go @@ -55,7 +55,11 @@ func SetupMetrics(logger *logp.Logger, name, version string) error { // SetupMetricsOptions performs creation of metrics handlers using specified options. func SetupMetricsOptions(opts MetricOptions) error { - monitoring.NewFunc(opts.SystemMetrics, "cpu", ReportSystemCPUUsage, monitoring.Report) + if opts.Logger == nil { + opts.Logger = logp.NewLogger("") + } + + monitoring.NewFunc(opts.SystemMetrics, "cpu", ReportSystemCPUUsage(opts.Logger), monitoring.Report) opts.Name = processName(opts.Name) processStats = &process.Stats{