From 86a546c88dfd74abcf41d6db70ea700dc767fe94 Mon Sep 17 00:00:00 2001 From: Joshua Powers Date: Fri, 8 Sep 2023 03:41:48 -0600 Subject: [PATCH] fix(inputs.procstat): Collect swap via /proc/$pid/smaps (#13779) --- plugins/inputs/procstat/README.md | 11 ++++++++--- plugins/inputs/procstat/memmap.go | 19 +++++++++++++++++++ plugins/inputs/procstat/memmap_notlinux.go | 5 +++++ plugins/inputs/procstat/process.go | 1 + plugins/inputs/procstat/procstat.go | 7 +++---- plugins/inputs/procstat/procstat_test.go | 4 ++++ 6 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 plugins/inputs/procstat/memmap.go create mode 100644 plugins/inputs/procstat/memmap_notlinux.go diff --git a/plugins/inputs/procstat/README.md b/plugins/inputs/procstat/README.md index 425b15f5b..55cf8d615 100644 --- a/plugins/inputs/procstat/README.md +++ b/plugins/inputs/procstat/README.md @@ -111,10 +111,15 @@ the `win_perf_counters` input plugin as a more mature alternative. - cpu_usage (float) - involuntary_context_switches (int) - major_faults (int) - - memory_data (int) - - memory_locked (int) + - memory_anonymous (int) + - memory_private_clean (int) + - memory_private_dirty (int) + - memory_pss (int) + - memory_referenced (int) - memory_rss (int) - - memory_stack (int) + - memory_shared_clean (int) + - memory_shared_dirty (int) + - memory_size (int) - memory_swap (int) - memory_usage (float) - memory_vms (int) diff --git a/plugins/inputs/procstat/memmap.go b/plugins/inputs/procstat/memmap.go new file mode 100644 index 000000000..e3e0dee4d --- /dev/null +++ b/plugins/inputs/procstat/memmap.go @@ -0,0 +1,19 @@ +//go:build linux + +package procstat + +func collectMemmap(proc Process, prefix string, fields map[string]any) { + memMapStats, err := proc.MemoryMaps(true) + if err == nil && len(*memMapStats) == 1 { + memMap := (*memMapStats)[0] + fields[prefix+"memory_size"] = memMap.Size + fields[prefix+"memory_pss"] = memMap.Pss + fields[prefix+"memory_shared_clean"] = memMap.SharedClean + fields[prefix+"memory_shared_dirty"] = memMap.SharedDirty + fields[prefix+"memory_private_clean"] = memMap.PrivateClean + fields[prefix+"memory_private_dirty"] = memMap.PrivateDirty + fields[prefix+"memory_referenced"] = memMap.Referenced + fields[prefix+"memory_anonymous"] = memMap.Anonymous + fields[prefix+"memory_swap"] = memMap.Swap + } +} diff --git a/plugins/inputs/procstat/memmap_notlinux.go b/plugins/inputs/procstat/memmap_notlinux.go new file mode 100644 index 000000000..5d8733a76 --- /dev/null +++ b/plugins/inputs/procstat/memmap_notlinux.go @@ -0,0 +1,5 @@ +//go:build !linux + +package procstat + +func collectMemmap(Process, string, map[string]any) {} diff --git a/plugins/inputs/procstat/process.go b/plugins/inputs/procstat/process.go index 543d36c4f..7d7509af2 100644 --- a/plugins/inputs/procstat/process.go +++ b/plugins/inputs/procstat/process.go @@ -16,6 +16,7 @@ type Process interface { PageFaults() (*process.PageFaultsStat, error) IOCounters() (*process.IOCountersStat, error) MemoryInfo() (*process.MemoryInfoStat, error) + MemoryMaps(bool) (*[]process.MemoryMapsStat, error) Name() (string, error) Cmdline() (string, error) NumCtxSwitches() (*process.NumCtxSwitchesStat, error) diff --git a/plugins/inputs/procstat/procstat.go b/plugins/inputs/procstat/procstat.go index fef649504..3ee3c1f3a 100644 --- a/plugins/inputs/procstat/procstat.go +++ b/plugins/inputs/procstat/procstat.go @@ -225,16 +225,15 @@ func (p *Procstat) addMetric(proc Process, acc telegraf.Accumulator, t time.Time } } + // This only returns values for RSS and VMS mem, err := proc.MemoryInfo() if err == nil { fields[prefix+"memory_rss"] = mem.RSS fields[prefix+"memory_vms"] = mem.VMS - fields[prefix+"memory_swap"] = mem.Swap - fields[prefix+"memory_data"] = mem.Data - fields[prefix+"memory_stack"] = mem.Stack - fields[prefix+"memory_locked"] = mem.Locked } + collectMemmap(proc, prefix, fields) + memPerc, err := proc.MemoryPercent() if err == nil { fields[prefix+"memory_usage"] = memPerc diff --git a/plugins/inputs/procstat/procstat_test.go b/plugins/inputs/procstat/procstat_test.go index 0b35d3d1f..5f77cb813 100644 --- a/plugins/inputs/procstat/procstat_test.go +++ b/plugins/inputs/procstat/procstat_test.go @@ -129,6 +129,10 @@ func (p *testProc) MemoryInfo() (*process.MemoryInfoStat, error) { return &process.MemoryInfoStat{}, nil } +func (p *testProc) MemoryMaps(bool) (*[]process.MemoryMapsStat, error) { + return &[]process.MemoryMapsStat{}, nil +} + func (p *testProc) Name() (string, error) { return "test_proc", nil }