1717package statsutil
1818
1919import (
20+ "bufio"
21+ "os"
22+ "strconv"
23+ "strings"
2024 "time"
2125
2226 "github.com/vishvananda/netlink"
@@ -35,11 +39,10 @@ func calculateMemPercent(limit float64, usedNo float64) float64 {
3539}
3640
3741func SetCgroupStatsFields (previousStats * ContainerStats , data * v1.Metrics , links []netlink.Link ) (StatsEntry , error ) {
38-
3942 cpuPercent := calculateCgroupCPUPercent (previousStats , data )
4043 blkRead , blkWrite := calculateCgroupBlockIO (data )
4144 mem := calculateCgroupMemUsage (data )
42- memLimit := float64 (data .Memory .Usage .Limit )
45+ memLimit := getCgroupMemLimit ( float64 (data .Memory .Usage .Limit ) )
4346 memPercent := calculateMemPercent (memLimit , mem )
4447 pidsStatsCurrent := data .Pids .Current
4548 netRx , netTx := calculateCgroupNetwork (links )
@@ -59,11 +62,10 @@ func SetCgroupStatsFields(previousStats *ContainerStats, data *v1.Metrics, links
5962}
6063
6164func SetCgroup2StatsFields (previousStats * ContainerStats , metrics * v2.Metrics , links []netlink.Link ) (StatsEntry , error ) {
62-
6365 cpuPercent := calculateCgroup2CPUPercent (previousStats , metrics )
6466 blkRead , blkWrite := calculateCgroup2IO (metrics )
6567 mem := calculateCgroup2MemUsage (metrics )
66- memLimit := float64 (metrics .Memory .UsageLimit )
68+ memLimit := getCgroupMemLimit ( float64 (metrics .Memory .UsageLimit ) )
6769 memPercent := calculateMemPercent (memLimit , mem )
6870 pidsStatsCurrent := metrics .Pids .Current
6971 netRx , netTx := calculateCgroupNetwork (links )
@@ -82,6 +84,36 @@ func SetCgroup2StatsFields(previousStats *ContainerStats, metrics *v2.Metrics, l
8284
8385}
8486
87+ func getCgroupMemLimit (memLimit float64 ) float64 {
88+ if memLimit == float64 (^ uint64 (0 )) {
89+ return getHostMemLimit ()
90+ }
91+ return memLimit
92+ }
93+
94+ func getHostMemLimit () float64 {
95+ file , err := os .Open ("/proc/meminfo" )
96+ if err != nil {
97+ return float64 (^ uint64 (0 ))
98+ }
99+ defer file .Close ()
100+
101+ scanner := bufio .NewScanner (file )
102+ for scanner .Scan () {
103+ if strings .HasPrefix (scanner .Text (), "MemTotal:" ) {
104+ fields := strings .Fields (scanner .Text ())
105+ if len (fields ) >= 2 {
106+ memKb , err := strconv .ParseUint (fields [1 ], 10 , 64 )
107+ if err == nil {
108+ return float64 (memKb * 1024 ) // kB to bytes
109+ }
110+ }
111+ break
112+ }
113+ }
114+ return float64 (^ uint64 (0 ))
115+ }
116+
85117func calculateCgroupCPUPercent (previousStats * ContainerStats , metrics * v1.Metrics ) float64 {
86118 var (
87119 cpuPercent = 0.0
0 commit comments