Skip to content

Commit d088970

Browse files
committed
fix: don't coerce nil Meminfo entries to 0, leave out if nil
Nil entries in procfs.Meminfo fields indicate that the value isn't present on the system. Coercing those nil values to `0` introduces new metrics on systems that should not be present and can break some queries. Addresses PR feedback: #3049 (comment) #3049 (comment) Signed-off-by: TJ Hoplock <t.hoplock@gmail.com>
1 parent 884c684 commit d088970

File tree

2 files changed

+155
-62
lines changed

2 files changed

+155
-62
lines changed

collector/collector.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,3 @@ func pushMetric(ch chan<- prometheus.Metric, fieldDesc *prometheus.Desc, name st
244244

245245
ch <- prometheus.MustNewConstMetric(fieldDesc, valueType, fVal, labelValues...)
246246
}
247-
248-
func uint64PtrToFloat(u *uint64) float64 {
249-
if u == nil {
250-
return float64(0)
251-
}
252-
253-
return float64(*u)
254-
}

collector/meminfo_linux.go

Lines changed: 155 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -47,58 +47,159 @@ func (c *meminfoCollector) getMemInfo() (map[string]float64, error) {
4747
return nil, fmt.Errorf("Failed to get memory info: %s", err)
4848
}
4949

50-
return map[string]float64{
51-
"Active_bytes": uint64PtrToFloat(meminfo.ActiveBytes),
52-
"Active_anon_bytes": uint64PtrToFloat(meminfo.ActiveAnonBytes),
53-
"Active_file_bytes": uint64PtrToFloat(meminfo.ActiveFileBytes),
54-
"AnonHugePages_bytes": uint64PtrToFloat(meminfo.AnonHugePagesBytes),
55-
"AnonPages_bytes": uint64PtrToFloat(meminfo.AnonPagesBytes),
56-
"Bounce_bytes": uint64PtrToFloat(meminfo.BounceBytes),
57-
"Buffers_bytes": uint64PtrToFloat(meminfo.BuffersBytes),
58-
"Cached_bytes": uint64PtrToFloat(meminfo.CachedBytes),
59-
"CmaFree_bytes": uint64PtrToFloat(meminfo.CmaFreeBytes),
60-
"CmaTotal_bytes": uint64PtrToFloat(meminfo.CmaTotalBytes),
61-
"CommitLimit_bytes": uint64PtrToFloat(meminfo.CommitLimitBytes),
62-
"Committed_AS_bytes": uint64PtrToFloat(meminfo.CommittedASBytes),
63-
"DirectMap1G_bytes": uint64PtrToFloat(meminfo.DirectMap1GBytes),
64-
"DirectMap2M_bytes": uint64PtrToFloat(meminfo.DirectMap2MBytes),
65-
"DirectMap4k_bytes": uint64PtrToFloat(meminfo.DirectMap4kBytes),
66-
"Dirty_bytes": uint64PtrToFloat(meminfo.DirtyBytes),
67-
"HardwareCorrupted_bytes": uint64PtrToFloat(meminfo.HardwareCorruptedBytes),
68-
"Hugepagesize_bytes": uint64PtrToFloat(meminfo.HugepagesizeBytes),
69-
"Inactive_bytes": uint64PtrToFloat(meminfo.InactiveBytes),
70-
"Inactive_anon_bytes": uint64PtrToFloat(meminfo.InactiveAnonBytes),
71-
"Inactive_file_bytes": uint64PtrToFloat(meminfo.InactiveFileBytes),
72-
"KernelStack_bytes": uint64PtrToFloat(meminfo.KernelStackBytes),
73-
"Mapped_bytes": uint64PtrToFloat(meminfo.MappedBytes),
74-
"MemAvailable_bytes": uint64PtrToFloat(meminfo.MemAvailableBytes),
75-
"MemFree_bytes": uint64PtrToFloat(meminfo.MemFreeBytes),
76-
"MemTotal_bytes": uint64PtrToFloat(meminfo.MemTotalBytes),
77-
"Mlocked_bytes": uint64PtrToFloat(meminfo.MlockedBytes),
78-
"NFS_Unstable_bytes": uint64PtrToFloat(meminfo.NFSUnstableBytes),
79-
"PageTables_bytes": uint64PtrToFloat(meminfo.PageTablesBytes),
80-
"Percpu_bytes": uint64PtrToFloat(meminfo.PercpuBytes),
81-
"SReclaimable_bytes": uint64PtrToFloat(meminfo.SReclaimableBytes),
82-
"SUnreclaim_bytes": uint64PtrToFloat(meminfo.SUnreclaimBytes),
83-
"Shmem_bytes": uint64PtrToFloat(meminfo.ShmemBytes),
84-
"ShmemHugePages_bytes": uint64PtrToFloat(meminfo.ShmemHugePagesBytes),
85-
"ShmemPmdMapped_bytes": uint64PtrToFloat(meminfo.ShmemPmdMappedBytes),
86-
"Slab_bytes": uint64PtrToFloat(meminfo.SlabBytes),
87-
"SwapCached_bytes": uint64PtrToFloat(meminfo.SwapCachedBytes),
88-
"SwapFree_bytes": uint64PtrToFloat(meminfo.SwapFreeBytes),
89-
"SwapTotal_bytes": uint64PtrToFloat(meminfo.SwapTotalBytes),
90-
"Unevictable_bytes": uint64PtrToFloat(meminfo.UnevictableBytes),
91-
"VmallocChunk_bytes": uint64PtrToFloat(meminfo.VmallocChunkBytes),
92-
"VmallocTotal_bytes": uint64PtrToFloat(meminfo.VmallocTotalBytes),
93-
"VmallocUsed_bytes": uint64PtrToFloat(meminfo.VmallocUsedBytes),
94-
"Writeback_bytes": uint64PtrToFloat(meminfo.WritebackBytes),
95-
"WritebackTmp_bytes": uint64PtrToFloat(meminfo.WritebackTmpBytes),
96-
// These fields are always in bytes and do not have `Bytes`
97-
// suffixed counterparts in the procfs.Meminfo struct, nor do
98-
// they have `_bytes` suffix on the metric names.
99-
"HugePages_Free": uint64PtrToFloat(meminfo.HugePagesFree),
100-
"HugePages_Rsvd": uint64PtrToFloat(meminfo.HugePagesRsvd),
101-
"HugePages_Surp": uint64PtrToFloat(meminfo.HugePagesSurp),
102-
"HugePages_Total": uint64PtrToFloat(meminfo.HugePagesTotal),
103-
}, nil
50+
metrics := make(map[string]float64)
51+
52+
if meminfo.ActiveBytes != nil {
53+
metrics["Active_bytes"] = float64(*meminfo.ActiveBytes)
54+
}
55+
if meminfo.ActiveAnonBytes != nil {
56+
metrics["Active_anon_bytes"] = float64(*meminfo.ActiveAnonBytes)
57+
}
58+
if meminfo.ActiveFileBytes != nil {
59+
metrics["Active_file_bytes"] = float64(*meminfo.ActiveFileBytes)
60+
}
61+
if meminfo.AnonHugePagesBytes != nil {
62+
metrics["AnonHugePages_bytes"] = float64(*meminfo.AnonHugePagesBytes)
63+
}
64+
if meminfo.AnonPagesBytes != nil {
65+
metrics["AnonPages_bytes"] = float64(*meminfo.AnonPagesBytes)
66+
}
67+
if meminfo.BounceBytes != nil {
68+
metrics["Bounce_bytes"] = float64(*meminfo.BounceBytes)
69+
}
70+
if meminfo.BuffersBytes != nil {
71+
metrics["Buffers_bytes"] = float64(*meminfo.BuffersBytes)
72+
}
73+
if meminfo.CachedBytes != nil {
74+
metrics["Cached_bytes"] = float64(*meminfo.CachedBytes)
75+
}
76+
if meminfo.CmaFreeBytes != nil {
77+
metrics["CmaFree_bytes"] = float64(*meminfo.CmaFreeBytes)
78+
}
79+
if meminfo.CmaTotalBytes != nil {
80+
metrics["CmaTotal_bytes"] = float64(*meminfo.CmaTotalBytes)
81+
}
82+
if meminfo.CommitLimitBytes != nil {
83+
metrics["CommitLimit_bytes"] = float64(*meminfo.CommitLimitBytes)
84+
}
85+
if meminfo.CommittedASBytes != nil {
86+
metrics["Committed_AS_bytes"] = float64(*meminfo.CommittedASBytes)
87+
}
88+
if meminfo.DirectMap1GBytes != nil {
89+
metrics["DirectMap1G_bytes"] = float64(*meminfo.DirectMap1GBytes)
90+
}
91+
if meminfo.DirectMap2MBytes != nil {
92+
metrics["DirectMap2M_bytes"] = float64(*meminfo.DirectMap2MBytes)
93+
}
94+
if meminfo.DirectMap4kBytes != nil {
95+
metrics["DirectMap4k_bytes"] = float64(*meminfo.DirectMap4kBytes)
96+
}
97+
if meminfo.DirtyBytes != nil {
98+
metrics["Dirty_bytes"] = float64(*meminfo.DirtyBytes)
99+
}
100+
if meminfo.HardwareCorruptedBytes != nil {
101+
metrics["HardwareCorrupted_bytes"] = float64(*meminfo.HardwareCorruptedBytes)
102+
}
103+
if meminfo.HugepagesizeBytes != nil {
104+
metrics["Hugepagesize_bytes"] = float64(*meminfo.HugepagesizeBytes)
105+
}
106+
if meminfo.InactiveBytes != nil {
107+
metrics["Inactive_bytes"] = float64(*meminfo.InactiveBytes)
108+
}
109+
if meminfo.InactiveAnonBytes != nil {
110+
metrics["Inactive_anon_bytes"] = float64(*meminfo.InactiveAnonBytes)
111+
}
112+
if meminfo.InactiveFileBytes != nil {
113+
metrics["Inactive_file_bytes"] = float64(*meminfo.InactiveFileBytes)
114+
}
115+
if meminfo.KernelStackBytes != nil {
116+
metrics["KernelStack_bytes"] = float64(*meminfo.KernelStackBytes)
117+
}
118+
if meminfo.MappedBytes != nil {
119+
metrics["Mapped_bytes"] = float64(*meminfo.MappedBytes)
120+
}
121+
if meminfo.MemAvailableBytes != nil {
122+
metrics["MemAvailable_bytes"] = float64(*meminfo.MemAvailableBytes)
123+
}
124+
if meminfo.MemFreeBytes != nil {
125+
metrics["MemFree_bytes"] = float64(*meminfo.MemFreeBytes)
126+
}
127+
if meminfo.MemTotalBytes != nil {
128+
metrics["MemTotal_bytes"] = float64(*meminfo.MemTotalBytes)
129+
}
130+
if meminfo.MlockedBytes != nil {
131+
metrics["Mlocked_bytes"] = float64(*meminfo.MlockedBytes)
132+
}
133+
if meminfo.NFSUnstableBytes != nil {
134+
metrics["NFS_Unstable_bytes"] = float64(*meminfo.NFSUnstableBytes)
135+
}
136+
if meminfo.PageTablesBytes != nil {
137+
metrics["PageTables_bytes"] = float64(*meminfo.PageTablesBytes)
138+
}
139+
if meminfo.PercpuBytes != nil {
140+
metrics["Percpu_bytes"] = float64(*meminfo.PercpuBytes)
141+
}
142+
if meminfo.SReclaimableBytes != nil {
143+
metrics["SReclaimable_bytes"] = float64(*meminfo.SReclaimableBytes)
144+
}
145+
if meminfo.SUnreclaimBytes != nil {
146+
metrics["SUnreclaim_bytes"] = float64(*meminfo.SUnreclaimBytes)
147+
}
148+
if meminfo.ShmemBytes != nil {
149+
metrics["Shmem_bytes"] = float64(*meminfo.ShmemBytes)
150+
}
151+
if meminfo.ShmemHugePagesBytes != nil {
152+
metrics["ShmemHugePages_bytes"] = float64(*meminfo.ShmemHugePagesBytes)
153+
}
154+
if meminfo.ShmemPmdMappedBytes != nil {
155+
metrics["ShmemPmdMapped_bytes"] = float64(*meminfo.ShmemPmdMappedBytes)
156+
}
157+
if meminfo.SlabBytes != nil {
158+
metrics["Slab_bytes"] = float64(*meminfo.SlabBytes)
159+
}
160+
if meminfo.SwapCachedBytes != nil {
161+
metrics["SwapCached_bytes"] = float64(*meminfo.SwapCachedBytes)
162+
}
163+
if meminfo.SwapFreeBytes != nil {
164+
metrics["SwapFree_bytes"] = float64(*meminfo.SwapFreeBytes)
165+
}
166+
if meminfo.SwapTotalBytes != nil {
167+
metrics["SwapTotal_bytes"] = float64(*meminfo.SwapTotalBytes)
168+
}
169+
if meminfo.UnevictableBytes != nil {
170+
metrics["Unevictable_bytes"] = float64(*meminfo.UnevictableBytes)
171+
}
172+
if meminfo.VmallocChunkBytes != nil {
173+
metrics["VmallocChunk_bytes"] = float64(*meminfo.VmallocChunkBytes)
174+
}
175+
if meminfo.VmallocTotalBytes != nil {
176+
metrics["VmallocTotal_bytes"] = float64(*meminfo.VmallocTotalBytes)
177+
}
178+
if meminfo.VmallocUsedBytes != nil {
179+
metrics["VmallocUsed_bytes"] = float64(*meminfo.VmallocUsedBytes)
180+
}
181+
if meminfo.WritebackBytes != nil {
182+
metrics["Writeback_bytes"] = float64(*meminfo.WritebackBytes)
183+
}
184+
if meminfo.WritebackTmpBytes != nil {
185+
metrics["WritebackTmp_bytes"] = float64(*meminfo.WritebackTmpBytes)
186+
}
187+
188+
// These fields are always in bytes and do not have `Bytes`
189+
// suffixed counterparts in the procfs.Meminfo struct, nor do
190+
// they have `_bytes` suffix on the metric names.
191+
if meminfo.HugePagesFree != nil {
192+
metrics["HugePages_Free"] = float64(*meminfo.HugePagesFree)
193+
}
194+
if meminfo.HugePagesRsvd != nil {
195+
metrics["HugePages_Rsvd"] = float64(*meminfo.HugePagesRsvd)
196+
}
197+
if meminfo.HugePagesSurp != nil {
198+
metrics["HugePages_Surp"] = float64(*meminfo.HugePagesSurp)
199+
}
200+
if meminfo.HugePagesTotal != nil {
201+
metrics["HugePages_Total"] = float64(*meminfo.HugePagesTotal)
202+
}
203+
204+
return metrics, nil
104205
}

0 commit comments

Comments
 (0)