Add support for identifying OOM victim.
This commit is contained in:
parent
a59bfbbd5c
commit
32b33b215a
@ -30,7 +30,7 @@ import (
|
||||
)
|
||||
|
||||
var containerRegexp *regexp.Regexp = regexp.MustCompile(
|
||||
`Task in (.*) killed as a result of limit of `)
|
||||
`Task in (.*) killed as a result of limit of (.*)`)
|
||||
var lastLineRegexp *regexp.Regexp = regexp.MustCompile(
|
||||
`(^[A-Z]{1}[a-z]{2} .*[0-9]{1,2} [0-9]{1,2}:[0-9]{2}:[0-9]{2}) .* Killed process ([0-9]+) \(([0-9A-Za-z_]+)\)`)
|
||||
var firstLineRegexp *regexp.Regexp = regexp.MustCompile(
|
||||
@ -52,6 +52,9 @@ type OomInstance struct {
|
||||
TimeOfDeath time.Time
|
||||
// the absolute name of the container that OOMed
|
||||
ContainerName string
|
||||
// the absolute name of the container that was killed
|
||||
// due to the OOM.
|
||||
VictimContainerName string
|
||||
}
|
||||
|
||||
// gets the container name from a line and adds it to the oomInstance.
|
||||
@ -61,6 +64,7 @@ func getContainerName(line string, currentOomInstance *OomInstance) error {
|
||||
return nil
|
||||
}
|
||||
currentOomInstance.ContainerName = path.Join("/", parsedLine[1])
|
||||
currentOomInstance.VictimContainerName = path.Join("/", parsedLine[2])
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -17,13 +17,14 @@ package oomparser
|
||||
import (
|
||||
"bufio"
|
||||
"os"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
const startLine = "Jan 21 22:01:49 localhost kernel: [62278.816267] ruby invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0"
|
||||
const endLine = "Jan 21 22:01:49 localhost kernel: [62279.421192] Killed process 19667 (evilprogram2) total-vm:1460016kB, anon-rss:1414008kB, file-rss:4kB"
|
||||
const containerLine = "Jan 26 14:10:07 kateknister0.mtv.corp.google.com kernel: [1814368.465205] Task in /mem2 killed as a result of limit of /mem2"
|
||||
const containerLine = "Jan 26 14:10:07 kateknister0.mtv.corp.google.com kernel: [1814368.465205] Task in /mem2 killed as a result of limit of /mem3"
|
||||
const containerLogFile = "containerOomExampleLog.txt"
|
||||
const systemLogFile = "systemOomExampleLog.txt"
|
||||
|
||||
@ -39,6 +40,7 @@ func createExpectedContainerOomInstance(t *testing.T) *OomInstance {
|
||||
ProcessName: "memorymonster",
|
||||
TimeOfDeath: deathTime,
|
||||
ContainerName: "/mem2",
|
||||
VictimContainerName: "/mem3",
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,6 +56,7 @@ func createExpectedSystemOomInstance(t *testing.T) *OomInstance {
|
||||
ProcessName: "badsysprogram",
|
||||
TimeOfDeath: deathTime,
|
||||
ContainerName: "/",
|
||||
VictimContainerName: "/",
|
||||
}
|
||||
}
|
||||
|
||||
@ -73,6 +76,9 @@ func TestGetContainerName(t *testing.T) {
|
||||
if currentOomInstance.ContainerName != "/mem2" {
|
||||
t.Errorf("getContainerName should have set containerName to /mem2, not %s", currentOomInstance.ContainerName)
|
||||
}
|
||||
if currentOomInstance.VictimContainerName != "/mem3" {
|
||||
t.Errorf("getContainerName should have set victimContainerName to /mem3, not %s", currentOomInstance.VictimContainerName)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetProcessNamePid(t *testing.T) {
|
||||
@ -139,7 +145,7 @@ func helpTestStreamOoms(oomCheckInstance *OomInstance, sysFile string, t *testin
|
||||
|
||||
select {
|
||||
case oomInstance := <-outStream:
|
||||
if *oomCheckInstance != *oomInstance {
|
||||
if reflect.DeepEqual(*oomCheckInstance, *oomInstance) {
|
||||
t.Errorf("wrong instance returned. Expected %v and got %v",
|
||||
oomCheckInstance, oomInstance)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user