Skip to content

Commit 3bc182c

Browse files
feat: add ability to get individual controller stats
This adds methods to retrieve statistics for individual cgroup controllers (CPU, memory, pids, IO, hugetlb, rdma, misc) instead of requiring all stats to be fetched at once. This enables tools like cadvisor to collect specific metrics with different housekeeping intervals, reducing computational overhead. Fixes: #44 Signed-off-by: Sambhav Jain <jnsmbhv@gmail.com>
1 parent e0c56cb commit 3bc182c

File tree

8 files changed

+1138
-0
lines changed

8 files changed

+1138
-0
lines changed

cgroups.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,27 @@ type Manager interface {
4444
// GetStats returns cgroups statistics.
4545
GetStats() (*Stats, error)
4646

47+
// AddCpuStats adds cpu statistics to the provided stats object.
48+
AddCpuStats(stats *Stats) error
49+
50+
// AddMemoryStats adds memory statistics to the provided stats object.
51+
AddMemoryStats(stats *Stats) error
52+
53+
// AddPidsStats adds pids statistics to the provided stats object.
54+
AddPidsStats(stats *Stats) error
55+
56+
// AddIoStats adds io statistics to the provided stats object.
57+
AddIoStats(stats *Stats) error
58+
59+
// AddHugetlbStats adds hugetlb statistics to the provided stats object.
60+
AddHugetlbStats(stats *Stats) error
61+
62+
// AddRdmaStats adds rdma statistics to the provided stats object.
63+
AddRdmaStats(stats *Stats) error
64+
65+
// AddMiscStats adds misc statistics to the provided stats object.
66+
AddMiscStats(stats *Stats) error
67+
4768
// Freeze sets the freezer cgroup to the specified state.
4869
Freeze(state FreezerState) error
4970

fs/fs.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,138 @@ func (m *Manager) GetStats() (*cgroups.Stats, error) {
196196
return stats, nil
197197
}
198198

199+
func (m *Manager) AddCpuStats(stats *cgroups.Stats) error {
200+
m.mu.Lock()
201+
defer m.mu.Unlock()
202+
203+
if stats == nil {
204+
return errors.New(cgroups.ErrStatsNil)
205+
}
206+
207+
cpuGroup := &CpuGroup{}
208+
if path := m.paths["cpu"]; path != "" {
209+
if err := cpuGroup.GetStats(path, stats); err != nil {
210+
return err
211+
}
212+
}
213+
214+
cpuacctGroup := &CpuacctGroup{}
215+
if path := m.paths["cpuacct"]; path != "" {
216+
if err := cpuacctGroup.GetStats(path, stats); err != nil {
217+
return err
218+
}
219+
}
220+
221+
return nil
222+
}
223+
224+
func (m *Manager) AddMemoryStats(stats *cgroups.Stats) error {
225+
m.mu.Lock()
226+
defer m.mu.Unlock()
227+
228+
if stats == nil {
229+
return errors.New(cgroups.ErrStatsNil)
230+
}
231+
if stats.MemoryStats.Stats == nil {
232+
return errors.New("stats.MemoryStats.Stats must not be nil")
233+
}
234+
235+
memoryGroup := &MemoryGroup{}
236+
if path := m.paths["memory"]; path != "" {
237+
if err := memoryGroup.GetStats(path, stats); err != nil {
238+
return err
239+
}
240+
}
241+
242+
return nil
243+
}
244+
245+
func (m *Manager) AddPidsStats(stats *cgroups.Stats) error {
246+
m.mu.Lock()
247+
defer m.mu.Unlock()
248+
249+
if stats == nil {
250+
return errors.New(cgroups.ErrStatsNil)
251+
}
252+
253+
pidsGroup := &PidsGroup{}
254+
if path := m.paths["pids"]; path != "" {
255+
if err := pidsGroup.GetStats(path, stats); err != nil {
256+
return err
257+
}
258+
}
259+
260+
return nil
261+
}
262+
263+
func (m *Manager) AddIoStats(stats *cgroups.Stats) error {
264+
m.mu.Lock()
265+
defer m.mu.Unlock()
266+
267+
if stats == nil {
268+
return errors.New(cgroups.ErrStatsNil)
269+
}
270+
271+
blkioGroup := &BlkioGroup{}
272+
if path := m.paths["blkio"]; path != "" {
273+
if err := blkioGroup.GetStats(path, stats); err != nil {
274+
return err
275+
}
276+
}
277+
278+
return nil
279+
}
280+
281+
func (m *Manager) AddHugetlbStats(stats *cgroups.Stats) error {
282+
m.mu.Lock()
283+
defer m.mu.Unlock()
284+
285+
if stats == nil {
286+
return errors.New(cgroups.ErrStatsNil)
287+
}
288+
if stats.HugetlbStats == nil {
289+
return errors.New("stats.HugetlbStats must not be nil")
290+
}
291+
292+
hugetlbGroup := &HugetlbGroup{}
293+
if path := m.paths["hugetlb"]; path != "" {
294+
if err := hugetlbGroup.GetStats(path, stats); err != nil {
295+
return err
296+
}
297+
}
298+
299+
return nil
300+
}
301+
302+
func (m *Manager) AddRdmaStats(stats *cgroups.Stats) error {
303+
m.mu.Lock()
304+
defer m.mu.Unlock()
305+
306+
if stats == nil {
307+
return errors.New(cgroups.ErrStatsNil)
308+
}
309+
310+
rdmaGroup := &RdmaGroup{}
311+
if path := m.paths["rdma"]; path != "" {
312+
if err := rdmaGroup.GetStats(path, stats); err != nil {
313+
return err
314+
}
315+
}
316+
317+
return nil
318+
}
319+
320+
func (m *Manager) AddMiscStats(stats *cgroups.Stats) error {
321+
m.mu.Lock()
322+
defer m.mu.Unlock()
323+
324+
if stats == nil {
325+
return errors.New(cgroups.ErrStatsNil)
326+
}
327+
328+
return nil
329+
}
330+
199331
func (m *Manager) Set(r *cgroups.Resources) error {
200332
if r == nil {
201333
return nil

0 commit comments

Comments
 (0)