1717package statsutil
1818
1919import (
20+ "bufio"
21+ "os"
22+ "strconv"
23+ "strings"
2024 "time"
2125
2226 "github.com/vishvananda/netlink"
@@ -26,11 +30,10 @@ import (
2630)
2731
2832func SetCgroupStatsFields (previousStats * ContainerStats , data * v1.Metrics , links []netlink.Link ) (StatsEntry , error ) {
29-
3033 cpuPercent := calculateCgroupCPUPercent (previousStats , data )
3134 blkRead , blkWrite := calculateCgroupBlockIO (data )
3235 mem := calculateCgroupMemUsage (data )
33- memLimit := float64 (data .Memory .Usage .Limit )
36+ memLimit := getCgroupMemLimit ( float64 (data .Memory .Usage .Limit ) )
3437 memPercent := calculateMemPercent (memLimit , mem )
3538 pidsStatsCurrent := data .Pids .Current
3639 netRx , netTx := calculateCgroupNetwork (links )
@@ -50,11 +53,10 @@ func SetCgroupStatsFields(previousStats *ContainerStats, data *v1.Metrics, links
5053}
5154
5255func SetCgroup2StatsFields (previousStats * ContainerStats , metrics * v2.Metrics , links []netlink.Link ) (StatsEntry , error ) {
53-
5456 cpuPercent := calculateCgroup2CPUPercent (previousStats , metrics )
5557 blkRead , blkWrite := calculateCgroup2IO (metrics )
5658 mem := calculateCgroup2MemUsage (metrics )
57- memLimit := float64 (metrics .Memory .UsageLimit )
59+ memLimit := getCgroupMemLimit ( float64 (metrics .Memory .UsageLimit ) )
5860 memPercent := calculateMemPercent (memLimit , mem )
5961 pidsStatsCurrent := metrics .Pids .Current
6062 netRx , netTx := calculateCgroupNetwork (links )
@@ -73,6 +75,36 @@ func SetCgroup2StatsFields(previousStats *ContainerStats, metrics *v2.Metrics, l
7375
7476}
7577
78+ func getCgroupMemLimit (memLimit float64 ) float64 {
79+ if memLimit == float64 (^ uint64 (0 )) {
80+ return getHostMemLimit ()
81+ }
82+ return memLimit
83+ }
84+
85+ func getHostMemLimit () float64 {
86+ file , err := os .Open ("/proc/meminfo" )
87+ if err != nil {
88+ return float64 (^ uint64 (0 ))
89+ }
90+ defer file .Close ()
91+
92+ scanner := bufio .NewScanner (file )
93+ for scanner .Scan () {
94+ if strings .HasPrefix (scanner .Text (), "MemTotal:" ) {
95+ fields := strings .Fields (scanner .Text ())
96+ if len (fields ) >= 2 {
97+ memKb , err := strconv .ParseUint (fields [1 ], 10 , 64 )
98+ if err == nil {
99+ return float64 (memKb * 1024 ) // kB to bytes
100+ }
101+ }
102+ break
103+ }
104+ }
105+ return float64 (^ uint64 (0 ))
106+ }
107+
76108func calculateCgroupCPUPercent (previousStats * ContainerStats , metrics * v1.Metrics ) float64 {
77109 var (
78110 cpuPercent = 0.0
0 commit comments