prometheusmetricshost-metricsmachine-metricsnode-metricsprocfsprometheus-exportersystem-informationsystem-metrics
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
6.5 KiB
205 lines
6.5 KiB
// Copyright 2015 The Prometheus Authors |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// http://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
|
|
//go:build !nomeminfo |
|
// +build !nomeminfo |
|
|
|
package collector |
|
|
|
import ( |
|
"fmt" |
|
"log/slog" |
|
|
|
"github.com/prometheus/procfs" |
|
) |
|
|
|
type meminfoCollector struct { |
|
fs procfs.FS |
|
logger *slog.Logger |
|
} |
|
|
|
// NewMeminfoCollector returns a new Collector exposing memory stats. |
|
func NewMeminfoCollector(logger *slog.Logger) (Collector, error) { |
|
fs, err := procfs.NewFS(*procPath) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to open procfs: %w", err) |
|
} |
|
|
|
return &meminfoCollector{ |
|
logger: logger, |
|
fs: fs, |
|
}, nil |
|
} |
|
|
|
func (c *meminfoCollector) getMemInfo() (map[string]float64, error) { |
|
meminfo, err := c.fs.Meminfo() |
|
if err != nil { |
|
return nil, fmt.Errorf("Failed to get memory info: %s", err) |
|
} |
|
|
|
metrics := make(map[string]float64) |
|
|
|
if meminfo.ActiveBytes != nil { |
|
metrics["Active_bytes"] = float64(*meminfo.ActiveBytes) |
|
} |
|
if meminfo.ActiveAnonBytes != nil { |
|
metrics["Active_anon_bytes"] = float64(*meminfo.ActiveAnonBytes) |
|
} |
|
if meminfo.ActiveFileBytes != nil { |
|
metrics["Active_file_bytes"] = float64(*meminfo.ActiveFileBytes) |
|
} |
|
if meminfo.AnonHugePagesBytes != nil { |
|
metrics["AnonHugePages_bytes"] = float64(*meminfo.AnonHugePagesBytes) |
|
} |
|
if meminfo.AnonPagesBytes != nil { |
|
metrics["AnonPages_bytes"] = float64(*meminfo.AnonPagesBytes) |
|
} |
|
if meminfo.BounceBytes != nil { |
|
metrics["Bounce_bytes"] = float64(*meminfo.BounceBytes) |
|
} |
|
if meminfo.BuffersBytes != nil { |
|
metrics["Buffers_bytes"] = float64(*meminfo.BuffersBytes) |
|
} |
|
if meminfo.CachedBytes != nil { |
|
metrics["Cached_bytes"] = float64(*meminfo.CachedBytes) |
|
} |
|
if meminfo.CmaFreeBytes != nil { |
|
metrics["CmaFree_bytes"] = float64(*meminfo.CmaFreeBytes) |
|
} |
|
if meminfo.CmaTotalBytes != nil { |
|
metrics["CmaTotal_bytes"] = float64(*meminfo.CmaTotalBytes) |
|
} |
|
if meminfo.CommitLimitBytes != nil { |
|
metrics["CommitLimit_bytes"] = float64(*meminfo.CommitLimitBytes) |
|
} |
|
if meminfo.CommittedASBytes != nil { |
|
metrics["Committed_AS_bytes"] = float64(*meminfo.CommittedASBytes) |
|
} |
|
if meminfo.DirectMap1GBytes != nil { |
|
metrics["DirectMap1G_bytes"] = float64(*meminfo.DirectMap1GBytes) |
|
} |
|
if meminfo.DirectMap2MBytes != nil { |
|
metrics["DirectMap2M_bytes"] = float64(*meminfo.DirectMap2MBytes) |
|
} |
|
if meminfo.DirectMap4kBytes != nil { |
|
metrics["DirectMap4k_bytes"] = float64(*meminfo.DirectMap4kBytes) |
|
} |
|
if meminfo.DirtyBytes != nil { |
|
metrics["Dirty_bytes"] = float64(*meminfo.DirtyBytes) |
|
} |
|
if meminfo.HardwareCorruptedBytes != nil { |
|
metrics["HardwareCorrupted_bytes"] = float64(*meminfo.HardwareCorruptedBytes) |
|
} |
|
if meminfo.HugepagesizeBytes != nil { |
|
metrics["Hugepagesize_bytes"] = float64(*meminfo.HugepagesizeBytes) |
|
} |
|
if meminfo.InactiveBytes != nil { |
|
metrics["Inactive_bytes"] = float64(*meminfo.InactiveBytes) |
|
} |
|
if meminfo.InactiveAnonBytes != nil { |
|
metrics["Inactive_anon_bytes"] = float64(*meminfo.InactiveAnonBytes) |
|
} |
|
if meminfo.InactiveFileBytes != nil { |
|
metrics["Inactive_file_bytes"] = float64(*meminfo.InactiveFileBytes) |
|
} |
|
if meminfo.KernelStackBytes != nil { |
|
metrics["KernelStack_bytes"] = float64(*meminfo.KernelStackBytes) |
|
} |
|
if meminfo.MappedBytes != nil { |
|
metrics["Mapped_bytes"] = float64(*meminfo.MappedBytes) |
|
} |
|
if meminfo.MemAvailableBytes != nil { |
|
metrics["MemAvailable_bytes"] = float64(*meminfo.MemAvailableBytes) |
|
} |
|
if meminfo.MemFreeBytes != nil { |
|
metrics["MemFree_bytes"] = float64(*meminfo.MemFreeBytes) |
|
} |
|
if meminfo.MemTotalBytes != nil { |
|
metrics["MemTotal_bytes"] = float64(*meminfo.MemTotalBytes) |
|
} |
|
if meminfo.MlockedBytes != nil { |
|
metrics["Mlocked_bytes"] = float64(*meminfo.MlockedBytes) |
|
} |
|
if meminfo.NFSUnstableBytes != nil { |
|
metrics["NFS_Unstable_bytes"] = float64(*meminfo.NFSUnstableBytes) |
|
} |
|
if meminfo.PageTablesBytes != nil { |
|
metrics["PageTables_bytes"] = float64(*meminfo.PageTablesBytes) |
|
} |
|
if meminfo.PercpuBytes != nil { |
|
metrics["Percpu_bytes"] = float64(*meminfo.PercpuBytes) |
|
} |
|
if meminfo.SReclaimableBytes != nil { |
|
metrics["SReclaimable_bytes"] = float64(*meminfo.SReclaimableBytes) |
|
} |
|
if meminfo.SUnreclaimBytes != nil { |
|
metrics["SUnreclaim_bytes"] = float64(*meminfo.SUnreclaimBytes) |
|
} |
|
if meminfo.ShmemBytes != nil { |
|
metrics["Shmem_bytes"] = float64(*meminfo.ShmemBytes) |
|
} |
|
if meminfo.ShmemHugePagesBytes != nil { |
|
metrics["ShmemHugePages_bytes"] = float64(*meminfo.ShmemHugePagesBytes) |
|
} |
|
if meminfo.ShmemPmdMappedBytes != nil { |
|
metrics["ShmemPmdMapped_bytes"] = float64(*meminfo.ShmemPmdMappedBytes) |
|
} |
|
if meminfo.SlabBytes != nil { |
|
metrics["Slab_bytes"] = float64(*meminfo.SlabBytes) |
|
} |
|
if meminfo.SwapCachedBytes != nil { |
|
metrics["SwapCached_bytes"] = float64(*meminfo.SwapCachedBytes) |
|
} |
|
if meminfo.SwapFreeBytes != nil { |
|
metrics["SwapFree_bytes"] = float64(*meminfo.SwapFreeBytes) |
|
} |
|
if meminfo.SwapTotalBytes != nil { |
|
metrics["SwapTotal_bytes"] = float64(*meminfo.SwapTotalBytes) |
|
} |
|
if meminfo.UnevictableBytes != nil { |
|
metrics["Unevictable_bytes"] = float64(*meminfo.UnevictableBytes) |
|
} |
|
if meminfo.VmallocChunkBytes != nil { |
|
metrics["VmallocChunk_bytes"] = float64(*meminfo.VmallocChunkBytes) |
|
} |
|
if meminfo.VmallocTotalBytes != nil { |
|
metrics["VmallocTotal_bytes"] = float64(*meminfo.VmallocTotalBytes) |
|
} |
|
if meminfo.VmallocUsedBytes != nil { |
|
metrics["VmallocUsed_bytes"] = float64(*meminfo.VmallocUsedBytes) |
|
} |
|
if meminfo.WritebackBytes != nil { |
|
metrics["Writeback_bytes"] = float64(*meminfo.WritebackBytes) |
|
} |
|
if meminfo.WritebackTmpBytes != nil { |
|
metrics["WritebackTmp_bytes"] = float64(*meminfo.WritebackTmpBytes) |
|
} |
|
|
|
// These fields are always in bytes and do not have `Bytes` |
|
// suffixed counterparts in the procfs.Meminfo struct, nor do |
|
// they have `_bytes` suffix on the metric names. |
|
if meminfo.HugePagesFree != nil { |
|
metrics["HugePages_Free"] = float64(*meminfo.HugePagesFree) |
|
} |
|
if meminfo.HugePagesRsvd != nil { |
|
metrics["HugePages_Rsvd"] = float64(*meminfo.HugePagesRsvd) |
|
} |
|
if meminfo.HugePagesSurp != nil { |
|
metrics["HugePages_Surp"] = float64(*meminfo.HugePagesSurp) |
|
} |
|
if meminfo.HugePagesTotal != nil { |
|
metrics["HugePages_Total"] = float64(*meminfo.HugePagesTotal) |
|
} |
|
|
|
return metrics, nil |
|
}
|
|
|