diff --git a/utils/oomparser/oomexample/main.go b/utils/oomparser/oomexample/main.go index ff8fbe5e7f..432433427b 100644 --- a/utils/oomparser/oomexample/main.go +++ b/utils/oomparser/oomexample/main.go @@ -25,11 +25,19 @@ import ( // demonstrates how to run oomparser.OomParser to get OomInstance information func main() { klog.InitFlags(nil) + ignoreOldOOMs := flag.Bool("ignore_old", false, "Read only new OOM events, ignoring old. ") flag.Parse() // out is a user-provided channel from which the user can read incoming // OomInstance objects outStream := make(chan *oomparser.OomInstance) - oomLog, err := oomparser.New() + + var oomLog *oomparser.OomParser + var err error + if *ignoreOldOOMs { + oomLog, err = oomparser.NewFromNow() + } else { + oomLog, err = oomparser.New() + } if err != nil { klog.Infof("Couldn't make a new oomparser. %v", err) } else { diff --git a/utils/oomparser/oomparser.go b/utils/oomparser/oomparser.go index 32dc838fb9..e15a24cd21 100644 --- a/utils/oomparser/oomparser.go +++ b/utils/oomparser/oomparser.go @@ -149,6 +149,21 @@ func (p *OomParser) StreamOoms(outStream chan<- *OomInstance) { klog.Errorf("exiting analyzeLines. OOM events will not be reported.") } +// NewFromNow initializes an OomParser object that returns current OOM events only. In this mode the OomParser object +// will not send OOM events that occurred before the OomParser object was constructed. +func NewFromNow() (*OomParser, error) { + parser, err := New() + if err != nil { + return nil, err + } + + // seek to and set the offset at the end of /dev/kmsg to avoid reporting old OOM events + if err := parser.parser.SeekEnd(); err != nil { + return nil, err + } + return parser, nil +} + // initializes an OomParser object. Returns an OomParser object and an error. func New() (*OomParser, error) { parser, err := kmsgparser.NewParser()