Skip to content

Commit 9a446c9

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 9a446c9

File tree

7 files changed

+1147
-0
lines changed

7 files changed

+1147
-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: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import (
1414
"github.com/opencontainers/cgroups/fscommon"
1515
)
1616

17+
const (
18+
ErrStatsNil = "stats must not be nil"
19+
)
20+
1721
var subsystems = []subsystem{
1822
&CpusetGroup{},
1923
&DevicesGroup{},
@@ -196,6 +200,138 @@ func (m *Manager) GetStats() (*cgroups.Stats, error) {
196200
return stats, nil
197201
}
198202

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

0 commit comments

Comments
 (0)