diff --git a/cmd_mem.go b/cmd_mem.go index b4a5ce3..8ec2f32 100644 --- a/cmd_mem.go +++ b/cmd_mem.go @@ -10,6 +10,7 @@ import ( "os" "strconv" "strings" + "sync" "text/tabwriter" "github.com/kr/logfmt" @@ -220,6 +221,12 @@ type memRawEvent struct { Type string } +var memRawEventPool = sync.Pool{ + New: func() any { + return &memRawEvent{} + }, +} + var ErrUnknownMemField = errors.New("unknown mem field") func (e *memRawEvent) HandleLogfmt(key []byte, val []byte) (err error) { @@ -271,12 +278,16 @@ func memJSONParseThenAppend(r io.Reader, appendRow memAppendRowFn) error { if err != nil { return errors.Wrap(err, "failed to get 'printf' data as string") } - var e memRawEvent - err = logfmt.Unmarshal(buf, &e) + e := memRawEventPool.Get().(*memRawEvent) + *e = memRawEvent{} + err = logfmt.Unmarshal(buf, e) if err != nil { + memRawEventPool.Put(e) return errors.Wrap(err, "failed to unmarshal logfmt data") } - return appendRow(&e) + err = appendRow(e) + memRawEventPool.Put(e) + return err default: log.Warn().Str("type", msgType).Msg("Unknown message type, skipping") } diff --git a/cmd_net.go b/cmd_net.go index 8973b89..48216e5 100644 --- a/cmd_net.go +++ b/cmd_net.go @@ -10,6 +10,7 @@ import ( "os" "strconv" "strings" + "sync" "text/tabwriter" "github.com/kr/logfmt" @@ -240,6 +241,12 @@ type netRawEvent struct { Protocol string } +var netRawEventPool = sync.Pool{ + New: func() any { + return &netRawEvent{} + }, +} + var ErrUnknownNetField = errors.New("unknown net field") func (e *netRawEvent) HandleLogfmt(key []byte, val []byte) (err error) { @@ -301,12 +308,16 @@ func netJSONParseThenAppend(r io.Reader, appendRow netAppendRowFn) error { if err != nil { return errors.Wrap(err, "failed to get 'printf' data as string") } - var e netRawEvent - err = logfmt.Unmarshal(buf, &e) + e := netRawEventPool.Get().(*netRawEvent) + *e = netRawEvent{} + err = logfmt.Unmarshal(buf, e) if err != nil { + netRawEventPool.Put(e) return errors.Wrap(err, "failed to unmarshal logfmt data") } - return appendRow(&e) + err = appendRow(e) + netRawEventPool.Put(e) + return err default: log.Warn().Str("type", msgType).Msg("Unknown message type, skipping") } diff --git a/cmd_proc.go b/cmd_proc.go index 0f0e3fc..ecaa658 100644 --- a/cmd_proc.go +++ b/cmd_proc.go @@ -10,6 +10,7 @@ import ( "os" "strconv" "strings" + "sync" "text/tabwriter" "github.com/kr/logfmt" @@ -220,6 +221,12 @@ type procRawEvent struct { ExitCode int64 } +var procRawEventPool = sync.Pool{ + New: func() any { + return &procRawEvent{} + }, +} + var ErrUnknownProcField = errors.New("unknown proc field") func (e *procRawEvent) HandleLogfmt(key []byte, val []byte) (err error) { @@ -271,12 +278,16 @@ func procJSONParseThenAppend(r io.Reader, appendRow procAppendRowFn) error { if err != nil { return errors.Wrap(err, "failed to get 'printf' data as string") } - var e procRawEvent - err = logfmt.Unmarshal(buf, &e) + e := procRawEventPool.Get().(*procRawEvent) + *e = procRawEvent{} + err = logfmt.Unmarshal(buf, e) if err != nil { + procRawEventPool.Put(e) return errors.Wrap(err, "failed to unmarshal logfmt data") } - return appendRow(&e) + err = appendRow(e) + procRawEventPool.Put(e) + return err default: log.Warn().Str("type", msgType).Msg("Unknown message type, skipping") } diff --git a/cmd_syscall.go b/cmd_syscall.go index d33feb1..ab35877 100644 --- a/cmd_syscall.go +++ b/cmd_syscall.go @@ -11,6 +11,7 @@ import ( "sort" "strconv" "strings" + "sync" "text/tabwriter" "github.com/kr/logfmt" @@ -230,6 +231,12 @@ type syscallRawEvent struct { ReturnValue int64 } +var syscallRawEventPool = sync.Pool{ + New: func() any { + return &syscallRawEvent{} + }, +} + var ErrUnknownSyscallField = errors.New("unknown syscall field") func (e *syscallRawEvent) HandleLogfmt(key []byte, val []byte) (err error) { @@ -296,12 +303,16 @@ func syscallJSONParseThenAppend(r io.Reader, appendRow syscallAppendRowFn) error if err != nil { return errors.Wrap(err, "failed to get 'printf' data as string") } - var e syscallRawEvent - err = logfmt.Unmarshal(buf, &e) + e := syscallRawEventPool.Get().(*syscallRawEvent) + *e = syscallRawEvent{} + err = logfmt.Unmarshal(buf, e) if err != nil { + syscallRawEventPool.Put(e) return errors.Wrap(err, "failed to unmarshal logfmt data") } - return appendRow(&e) + err = appendRow(e) + syscallRawEventPool.Put(e) + return err default: log.Warn().Str("type", msgType).Msg("Unknown message type, skipping") } diff --git a/cmd_vfs_raw.go b/cmd_vfs_raw.go index 5a0bdb2..39c5a02 100644 --- a/cmd_vfs_raw.go +++ b/cmd_vfs_raw.go @@ -9,6 +9,7 @@ import ( "os" "strconv" "strings" + "sync" "time" "github.com/kr/logfmt" @@ -42,6 +43,12 @@ type vfsEvent struct { Length uint64 } +var vfsEventPool = sync.Pool{ + New: func() any { + return &vfsEvent{} + }, +} + var ErrUnknownField = errors.New("unknown field") func (e *vfsEvent) HandleLogfmt(key []byte, val []byte) (err error) { @@ -104,12 +111,15 @@ func simpleParseThenAppend(r io.Reader, appendRow appendRowFn) error { p := len(printfKeyword) data := line[p : len(line)-len(`"}`)] _ = data - var e vfsEvent - err := logfmt.Unmarshal([]byte(data), &e) + e := vfsEventPool.Get().(*vfsEvent) + *e = vfsEvent{} + err := logfmt.Unmarshal([]byte(data), e) if err != nil { + vfsEventPool.Put(e) return err } - err = appendRow(&e) + err = appendRow(e) + vfsEventPool.Put(e) if err != nil { return err } @@ -213,12 +223,15 @@ func jsonParseThenAppend(r io.Reader, appendRow appendRowFn) error { if err != nil { return errors.Wrap(err, "failed to get 'printf' data as string") } - var e vfsEvent - err = logfmt.Unmarshal(buf, &e) + e := vfsEventPool.Get().(*vfsEvent) + *e = vfsEvent{} + err = logfmt.Unmarshal(buf, e) if err != nil { + vfsEventPool.Put(e) return errors.Wrap(err, "failed to unmarshal logfmt data") } - err = appendRow(&e) + err = appendRow(e) + vfsEventPool.Put(e) if err != nil { return errors.Wrap(err, "failed to append row") }