Skip to content

Commit 0ab9c40

Browse files
authored
Merge pull request #177 from vermavis/vverma/v1-add-memory-oom-control-fields
v1/stats: add all fields of memory.oom_control
2 parents 318312a + 48a1f2e commit 0ab9c40

File tree

5 files changed

+381
-9
lines changed

5 files changed

+381
-9
lines changed

memory.go

+36-3
Original file line numberDiff line numberDiff line change
@@ -248,18 +248,28 @@ func (m *memoryController) Update(path string, resources *specs.LinuxResources)
248248
}
249249

250250
func (m *memoryController) Stat(path string, stats *v1.Metrics) error {
251-
f, err := os.Open(filepath.Join(m.Path(path), "memory.stat"))
251+
fMemStat, err := os.Open(filepath.Join(m.Path(path), "memory.stat"))
252252
if err != nil {
253253
return err
254254
}
255-
defer f.Close()
255+
defer fMemStat.Close()
256256
stats.Memory = &v1.MemoryStat{
257257
Usage: &v1.MemoryEntry{},
258258
Swap: &v1.MemoryEntry{},
259259
Kernel: &v1.MemoryEntry{},
260260
KernelTCP: &v1.MemoryEntry{},
261261
}
262-
if err := m.parseStats(f, stats.Memory); err != nil {
262+
if err := m.parseStats(fMemStat, stats.Memory); err != nil {
263+
return err
264+
}
265+
266+
fMemOomControl, err := os.Open(filepath.Join(m.Path(path), "memory.oom_control"))
267+
if err != nil {
268+
return err
269+
}
270+
defer fMemOomControl.Close()
271+
stats.MemoryOomControl = &v1.MemoryOomControl{}
272+
if err := m.parseOomControlStats(fMemOomControl, stats.MemoryOomControl); err != nil {
263273
return err
264274
}
265275
for _, t := range []struct {
@@ -374,6 +384,29 @@ func (m *memoryController) parseStats(r io.Reader, stat *v1.MemoryStat) error {
374384
return nil
375385
}
376386

387+
func (m *memoryController) parseOomControlStats(r io.Reader, stat *v1.MemoryOomControl) error {
388+
var (
389+
raw = make(map[string]uint64)
390+
sc = bufio.NewScanner(r)
391+
line int
392+
)
393+
for sc.Scan() {
394+
key, v, err := parseKV(sc.Text())
395+
if err != nil {
396+
return fmt.Errorf("%d: %v", line, err)
397+
}
398+
raw[key] = v
399+
line++
400+
}
401+
if err := sc.Err(); err != nil {
402+
return err
403+
}
404+
stat.OomKillDisable = raw["oom_kill_disable"]
405+
stat.UnderOom = raw["under_oom"]
406+
stat.OomKill = raw["oom_kill"]
407+
return nil
408+
}
409+
377410
func (m *memoryController) set(path string, settings []memorySettings) error {
378411
for _, t := range settings {
379412
if t.value != nil {

memory_test.go

+29
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ total_active_file 31
6161
total_unevictable 32
6262
`
6363

64+
const memoryOomControlData = `oom_kill_disable 1
65+
under_oom 2
66+
oom_kill 3
67+
`
68+
6469
func TestParseMemoryStats(t *testing.T) {
6570
var (
6671
c = &memoryController{}
@@ -111,6 +116,27 @@ func TestParseMemoryStats(t *testing.T) {
111116
}
112117
}
113118

119+
func TestParseMemoryOomControl(t *testing.T) {
120+
var (
121+
c = &memoryController{}
122+
m = &v1.MemoryOomControl{}
123+
r = strings.NewReader(memoryOomControlData)
124+
)
125+
if err := c.parseOomControlStats(r, m); err != nil {
126+
t.Fatal(err)
127+
}
128+
index := []uint64{
129+
m.OomKillDisable,
130+
m.UnderOom,
131+
m.OomKill,
132+
}
133+
for i, v := range index {
134+
if v != uint64(i)+1 {
135+
t.Errorf("expected value at index %d to be %d but received %d", i, i+1, v)
136+
}
137+
}
138+
}
139+
114140
func TestMemoryController_Stat(t *testing.T) {
115141
// GIVEN a cgroups folder with all the memory metrics
116142
modules := []string{"", "memsw", "kmem", "kmem.tcp"}
@@ -244,6 +270,9 @@ func buildMemoryMetrics(t *testing.T, modules []string, metrics []string) string
244270
if err := ioutil.WriteFile(path.Join(tmpDir, "memory.stat"), []byte(memoryData), defaultFilePerm); err != nil {
245271
t.Fatal(err)
246272
}
273+
if err := ioutil.WriteFile(path.Join(tmpDir, "memory.oom_control"), []byte(memoryOomControlData), defaultFilePerm); err != nil {
274+
t.Fatal(err)
275+
}
247276
cnt := 0
248277
for _, mod := range modules {
249278
for _, metric := range metrics {

0 commit comments

Comments
 (0)