X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/41911de2ad09ab8f7621805bc199d77ca76f391b..f2788dd5fc3ef725969d6c0fcc4ddee3754829fc:/lib/crunchrun/logging.go diff --git a/lib/crunchrun/logging.go b/lib/crunchrun/logging.go index 050894383d..76a55c4992 100644 --- a/lib/crunchrun/logging.go +++ b/lib/crunchrun/logging.go @@ -7,6 +7,7 @@ package crunchrun import ( "bufio" "bytes" + "encoding/json" "fmt" "io" "log" @@ -404,3 +405,53 @@ func loadLogThrottleParams(clnt IArvadosClient) { loadDuration(&crunchLogUpdatePeriod, "crunchLogUpdatePeriod") } + +type filterKeepstoreErrorsOnly struct { + io.WriteCloser + buf []byte +} + +func (f *filterKeepstoreErrorsOnly) Write(p []byte) (int, error) { + log.Printf("filterKeepstoreErrorsOnly: write %q", p) + f.buf = append(f.buf, p...) + start := 0 + for i := len(f.buf) - len(p); i < len(f.buf); i++ { + if f.buf[i] == '\n' { + if f.check(f.buf[start:i]) { + _, err := f.WriteCloser.Write(f.buf[start : i+1]) + if err != nil { + return 0, err + } + } + start = i + 1 + } + } + if start > 0 { + copy(f.buf, f.buf[start:]) + f.buf = f.buf[:len(f.buf)-start] + } + return len(p), nil +} + +func (f *filterKeepstoreErrorsOnly) check(line []byte) bool { + if len(line) == 0 { + return false + } + if line[0] != '{' { + return true + } + var m map[string]interface{} + err := json.Unmarshal(line, &m) + if err != nil { + return true + } + if m["msg"] == "request" { + return false + } + if m["msg"] == "response" { + if code, _ := m["respStatusCode"].(float64); code >= 200 && code < 300 { + return false + } + } + return true +}