diff --git a/internal/lib/stats/descriptors.go b/internal/lib/stats/descriptors.go index 40db114a21d..ce1ee0d8805 100644 --- a/internal/lib/stats/descriptors.go +++ b/internal/lib/stats/descriptors.go @@ -63,6 +63,11 @@ var ( Help: "Container swap usage in bytes.", LabelKeys: baseLabelKeys, } + containerSpecMemoryLimitBytes = &types.MetricDescriptor{ + Name: "container_spec_memory_limit_bytes", + Help: "Memory limit for the container in bytes.", + LabelKeys: baseLabelKeys, + } containerMemoryFailcnt = &types.MetricDescriptor{ Name: "container_memory_failcnt", Help: "Number of memory usage hits limits", diff --git a/internal/lib/stats/memory_metrics.go b/internal/lib/stats/memory_metrics.go index e4e670bb1f7..4819ebecf52 100644 --- a/internal/lib/stats/memory_metrics.go +++ b/internal/lib/stats/memory_metrics.go @@ -8,6 +8,10 @@ import ( "github.com/cri-o/cri-o/internal/oci" ) +// Size after which we consider memory to be "unlimited". This is not +// MaxInt64 due to rounding by the kernel. +const maxMemorySize = uint64(1 << 62) + func generateSandboxMemoryMetrics(sb *sandbox.Sandbox, mem *cgmgr.MemoryStats) []*types.Metric { memoryMetrics := []*containerMetric{ { @@ -40,6 +44,19 @@ func generateSandboxMemoryMetrics(sb *sandbox.Sandbox, mem *cgmgr.MemoryStats) [ return metricValues{{value: mem.SwapUsage, metricType: types.MetricType_GAUGE}} }, }, + { + desc: containerSpecMemoryLimitBytes, + valueFunc: func() metricValues { + // For consistency with cAdvisor and Kubernetes, consider memory to be "unlimited" + // when above a certain threshold (2^62) and report it as 0 in the metrics. + // This approach is more useful for monitoring tools than reporting the physical limit. + limit := mem.Limit + if limit > maxMemorySize { + return metricValues{{value: 0, metricType: types.MetricType_GAUGE}} + } + return metricValues{{value: limit, metricType: types.MetricType_GAUGE}} + }, + }, { desc: containerMemoryFailcnt, valueFunc: func() metricValues { diff --git a/internal/lib/stats/metrics.go b/internal/lib/stats/metrics.go index 8fdd4c2dc79..2d44b73c722 100644 --- a/internal/lib/stats/metrics.go +++ b/internal/lib/stats/metrics.go @@ -65,6 +65,7 @@ func (ss *StatsServer) PopulateMetricDescriptors(includedKeys []string) map[stri containerMemoryKernelUsage, containerMemoryMappedFile, containerMemorySwap, + containerSpecMemoryLimitBytes, containerMemoryFailcnt, containerMemoryUsageBytes, containerMemoryMaxUsageBytes,