Skip to content

Commit

Permalink
chore(events): decrease SO loader error log level to debug (#4041)
Browse files Browse the repository at this point in the history
Errors from the SO loader are pretty frequent because of race conditions.
As the user has nothing to do with it, the log level should be lowered from WARN.
  • Loading branch information
AlonZivony authored May 13, 2024
1 parent 70a0841 commit ea687e2
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 12 deletions.
12 changes: 9 additions & 3 deletions pkg/events/derive/symbols_collision.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package derive

import (
"errors"

"github.com/hashicorp/golang-lru/simplelru"
"golang.org/x/exp/maps"

Expand Down Expand Up @@ -182,15 +184,19 @@ func (gen *SymbolsCollisionArgsGenerator) findShObjsCollisions(
// get exported symbols from the shared object BEING loaded
loadingShObj.exportedSymbols, err = gen.soLoader.GetExportedSymbols(loadingShObj.ObjInfo)
if err != nil {
// High level languages like Java might load non-ELF files
// There is no need to log errors for such cases
var notElfErr *sharedobjs.UnsupportedFileError
if errors.As(err, &notElfErr) {
return nil, nil
}
// TODO: rate limit frequent errors for overloaded envs
_, ok := gen.returnedErrorsMap[err.Error()]
if !ok {
gen.returnedErrorsMap[err.Error()] = true
logger.Warnw("symbols_loaded", "object loaded", loadingShObj.ObjInfo, "error", err.Error())
} else {
logger.Debugw("symbols_loaded", "object loaded", loadingShObj.ObjInfo, "error", err.Error())
}
return nil, errfmt.WrapError(err)
return nil, nil
}
loadingShObj.FilterSymbols(gen.symbolsBlacklistMap) // del symbols NOT in blacklist
loadingShObj.FilterOutSymbols(gen.symbolsWhitelistMap) // del symbols IN the white list
Expand Down
2 changes: 0 additions & 2 deletions pkg/events/derive/symbols_loaded.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,6 @@ func (symbsLoadedGen *symbolsLoadedEventGenerator) deriveArgs(
_, ok := symbsLoadedGen.returnedErrors[err.Error()]
if !ok {
symbsLoadedGen.returnedErrors[err.Error()] = true
logger.Warnw("symbols_loaded", "object loaded", loadingObjectInfo, "error", err.Error())
} else {
logger.Debugw("symbols_loaded", "object loaded", loadingObjectInfo, "error", err.Error())
}
return nil, nil
Expand Down
12 changes: 5 additions & 7 deletions pkg/events/derive/symbols_loaded_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,32 +202,30 @@ func TestDeriveSharedObjectExportWatchedSymbols(t *testing.T) {
mockLoader := initLoaderMock(errors.New("loading error"))
gen := initSymbolsLoadedEventGenerator(mockLoader, nil, nil)

// First error should be always returned
// First error should always be logged for debug
eventArgs, err := gen.deriveArgs(generateSOLoadedEvent(pid, sharedobjs.ObjInfo{Id: sharedobjs.ObjID{Inode: 1}, Path: "1.so"}))
assert.NoError(t, err)
assert.Nil(t, eventArgs)
assert.NotEmpty(t, errChan)
<-errChan
assert.Empty(t, errChan)

// Debug mode should return errors always
// Error should be suppressed
eventArgs, err = gen.deriveArgs(generateSOLoadedEvent(pid, sharedobjs.ObjInfo{Id: sharedobjs.ObjID{Inode: 1}, Path: "1.so"}))
assert.NoError(t, err)
assert.Nil(t, eventArgs)
assert.NotEmpty(t, errChan)
assert.Empty(t, errChan)
})
t.Run("No debug", func(t *testing.T) {
errChan := setMockLogger(logger.WarnLevel)
defer logger.SetLogger(baseLogger)
mockLoader := initLoaderMock(errors.New("loading error"))
gen := initSymbolsLoadedEventGenerator(mockLoader, nil, nil)

// First error should create warning
// First error should create debug log, so we won't see it
eventArgs, err := gen.deriveArgs(generateSOLoadedEvent(pid, sharedobjs.ObjInfo{Id: sharedobjs.ObjID{Inode: 1}, Path: "1.so"}))
assert.NoError(t, err)
assert.Nil(t, eventArgs)
assert.NotEmpty(t, errChan)
<-errChan
assert.Empty(t, errChan)

// Error should be suppressed
Expand All @@ -236,7 +234,7 @@ func TestDeriveSharedObjectExportWatchedSymbols(t *testing.T) {
assert.Nil(t, eventArgs)
assert.Empty(t, errChan)
})
t.Run("Non-ELF", func(t *testing.T) {
t.Run("Non-ELF error", func(t *testing.T) {
errChan := setMockLogger(logger.DebugLevel)
defer logger.SetLogger(baseLogger)
mockLoader := initLoaderMock(sharedobjs.InitUnsupportedFileError(nil))
Expand Down

0 comments on commit ea687e2

Please sign in to comment.