Skip to content

Commit 426adc8

Browse files
feat(time): normalize all time to epoch
Remove all timeNormalizer object logic. Instead use simple normalization functions and normalize all timestamps in events asap: 1. Context timestamp normalization moved to decode stage 2. Relevant timestamp arguments normalized in processing stage, registered to run first.
1 parent dcfa4b4 commit 426adc8

14 files changed

+75
-131
lines changed

pkg/ebpf/capture.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/aquasecurity/tracee/pkg/bufferdecoder"
1313
"github.com/aquasecurity/tracee/pkg/errfmt"
1414
"github.com/aquasecurity/tracee/pkg/logger"
15+
"github.com/aquasecurity/tracee/pkg/time"
1516
"github.com/aquasecurity/tracee/pkg/utils"
1617
)
1718

@@ -109,7 +110,7 @@ func (t *Tracee) handleFileCaptures(ctx context.Context) {
109110
continue
110111
}
111112
// note: size of buffer will determine maximum extracted file size! (as writes from kernel are immediate)
112-
mprotectMeta.Ts = uint64(t.timeNormalizer.NormalizeTime(int(mprotectMeta.Ts)))
113+
mprotectMeta.Ts = time.BootToEpochNS(uint64(mprotectMeta.Ts))
113114
filename = fmt.Sprintf("bin.pid-%d.ts-%d", mprotectMeta.Pid, mprotectMeta.Ts)
114115
} else if meta.BinType == bufferdecoder.SendKernelModule {
115116
err = metaBuffDecoder.DecodeKernelModuleMeta(&kernelModuleMeta)

pkg/ebpf/controlplane/controller.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/aquasecurity/tracee/pkg/events"
1212
"github.com/aquasecurity/tracee/pkg/logger"
1313
"github.com/aquasecurity/tracee/pkg/proctree"
14-
traceetime "github.com/aquasecurity/tracee/pkg/time"
1514
)
1615

1716
// TODO: With the introduction of signal events, the control plane can now have a generic argument
@@ -29,7 +28,6 @@ type Controller struct {
2928
cgroupManager *containers.Containers
3029
processTree *proctree.ProcessTree
3130
enrichDisabled bool
32-
timeNormalizer traceetime.TimeNormalizer
3331
}
3432

3533
// NewController creates a new controller.
@@ -38,7 +36,6 @@ func NewController(
3836
cgroupManager *containers.Containers,
3937
enrichDisabled bool,
4038
procTree *proctree.ProcessTree,
41-
timeNormalizer traceetime.TimeNormalizer,
4239
) (*Controller, error) {
4340
var err error
4441

@@ -49,7 +46,6 @@ func NewController(
4946
cgroupManager: cgroupManager,
5047
processTree: procTree,
5148
enrichDisabled: enrichDisabled,
52-
timeNormalizer: timeNormalizer,
5349
}
5450

5551
p.signalBuffer, err = bpfModule.InitPerfBuf("signals", p.signalChan, p.lostSignalChan, 1024)

pkg/ebpf/controlplane/processes.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package controlplane
33
import (
44
"github.com/aquasecurity/tracee/pkg/events/parse"
55
"github.com/aquasecurity/tracee/pkg/proctree"
6+
"github.com/aquasecurity/tracee/pkg/time"
67
"github.com/aquasecurity/tracee/pkg/utils"
78
"github.com/aquasecurity/tracee/types/trace"
89
)
@@ -73,25 +74,25 @@ func (ctrl *Controller) procTreeForkProcessor(args []trace.Argument) error {
7374

7475
return ctrl.processTree.FeedFromFork(
7576
proctree.ForkFeed{
76-
TimeStamp: uint64(ctrl.timeNormalizer.NormalizeTime(int(timestamp))),
77+
TimeStamp: time.BootToEpochNS(timestamp),
7778
ChildHash: childHash,
7879
ParentHash: parentHash,
7980
LeaderHash: leaderHash,
8081
ParentTid: parentTid,
8182
ParentNsTid: parentNsTid,
8283
ParentPid: parentPid,
8384
ParentNsPid: parentNsPid,
84-
ParentStartTime: uint64(ctrl.timeNormalizer.NormalizeTime(int(parentStartTime))),
85+
ParentStartTime: time.BootToEpochNS(parentStartTime),
8586
LeaderTid: leaderTid,
8687
LeaderNsTid: leaderNsTid,
8788
LeaderPid: leaderPid,
8889
LeaderNsPid: leaderNsPid,
89-
LeaderStartTime: uint64(ctrl.timeNormalizer.NormalizeTime(int(leaderStartTime))),
90+
LeaderStartTime: time.BootToEpochNS(leaderStartTime),
9091
ChildTid: childTid,
9192
ChildNsTid: childNsTid,
9293
ChildPid: childPid,
9394
ChildNsPid: childNsPid,
94-
ChildStartTime: uint64(ctrl.timeNormalizer.NormalizeTime(int(childStartTime))),
95+
ChildStartTime: time.BootToEpochNS(childStartTime),
9596
},
9697
)
9798
}
@@ -154,7 +155,7 @@ func (ctrl *Controller) procTreeExecProcessor(args []trace.Argument) error {
154155

155156
return ctrl.processTree.FeedFromExec(
156157
proctree.ExecFeed{
157-
TimeStamp: uint64(ctrl.timeNormalizer.NormalizeTime(int(timestamp))),
158+
TimeStamp: time.BootToEpochNS(timestamp),
158159
TaskHash: taskHash,
159160
ParentHash: parentHash,
160161
LeaderHash: leaderHash,
@@ -208,7 +209,7 @@ func (ctrl *Controller) procTreeExitProcessor(args []trace.Argument) error {
208209

209210
return ctrl.processTree.FeedFromExit(
210211
proctree.ExitFeed{
211-
TimeStamp: uint64(ctrl.timeNormalizer.NormalizeTime(int(timestamp))), // time of exit is already a timestamp
212+
TimeStamp: time.BootToEpochNS(timestamp), // time of exit is already a times)p
212213
TaskHash: taskHash,
213214
ParentHash: parentHash,
214215
LeaderHash: leaderHash,

pkg/ebpf/events_pipeline.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/aquasecurity/tracee/pkg/errfmt"
1414
"github.com/aquasecurity/tracee/pkg/events"
1515
"github.com/aquasecurity/tracee/pkg/logger"
16+
"github.com/aquasecurity/tracee/pkg/time"
1617
"github.com/aquasecurity/tracee/pkg/utils"
1718
"github.com/aquasecurity/tracee/types/trace"
1819
)
@@ -227,8 +228,8 @@ func (t *Tracee) decodeEvents(ctx context.Context, sourceChan chan []byte) (<-ch
227228

228229
// populate all the fields of the event used in this stage, and reset the rest
229230

230-
evt.Timestamp = int(eCtx.Ts)
231-
evt.ThreadStartTime = int(eCtx.StartTime)
231+
evt.Timestamp = int(time.BootToEpochNS(eCtx.Ts)) // set normalized to epoch
232+
evt.ThreadStartTime = int(time.BootToEpochNS(eCtx.StartTime)) // set normalized to epoch
232233
evt.ProcessorID = int(eCtx.ProcessorId)
233234
evt.ProcessID = int(eCtx.Pid)
234235
evt.ThreadID = int(eCtx.Tid)
@@ -239,8 +240,8 @@ func (t *Tracee) decodeEvents(ctx context.Context, sourceChan chan []byte) (<-ch
239240
evt.UserID = int(eCtx.Uid)
240241
evt.MountNS = int(eCtx.MntID)
241242
evt.PIDNS = int(eCtx.PidID)
242-
evt.ProcessName = string(bytes.TrimRight(eCtx.Comm[:], "\x00"))
243-
evt.HostName = string(bytes.TrimRight(eCtx.UtsName[:], "\x00"))
243+
evt.ProcessName = string(bytes.TrimRight(eCtx.Comm[:], "\x00")) // set and clean potential trailing null
244+
evt.HostName = string(bytes.TrimRight(eCtx.UtsName[:], "\x00")) // set and clean potential trailing null
244245
evt.CgroupID = uint(eCtx.CgroupID)
245246
evt.ContainerID = containerData.ID
246247
evt.Container = containerData
@@ -727,7 +728,7 @@ func (t *Tracee) parseArguments(e *trace.Event) error {
727728
}
728729

729730
if t.config.Output.ParseArgumentsFDs {
730-
return events.ParseArgsFDs(e, uint64(t.timeNormalizer.GetOriginalTime(e.Timestamp)), t.FDArgPathMap)
731+
return events.ParseArgsFDs(e, uint64(e.Timestamp), t.FDArgPathMap)
731732
}
732733
}
733734

pkg/ebpf/net_capture.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,6 @@ func (t *Tracee) processNetCapEvents(ctx context.Context, in <-chan *trace.Event
5959
select {
6060
case event := <-in:
6161
// TODO: Support captures pipeline in t.processEvent
62-
err := t.normalizeEventCtxTimes(event)
63-
if err != nil {
64-
t.handleError(err)
65-
t.eventsPool.Put(event)
66-
continue
67-
}
6862
t.processNetCapEvent(event)
6963
_ = t.stats.NetCapCount.Increment()
7064
t.eventsPool.Put(event)

pkg/ebpf/processor.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ func init() {
2424
func (t *Tracee) processEvent(event *trace.Event) []error {
2525
var errs []error
2626

27-
processors := t.eventProcessor[events.ID(event.EventID)] // this event processors
28-
processors = append(processors, t.eventProcessor[events.All]...) // all events processors
27+
processors := t.eventProcessor[events.ID(event.EventID)] // this event processors
2928

3029
for _, processor := range processors {
3130
err := processor(event)
@@ -78,6 +77,20 @@ func (t *Tracee) RegisterEventProcessor(id events.ID, proc func(evt *trace.Event
7877

7978
// registerEventProcessors registers all event processors, each to a specific event id.
8079
func (t *Tracee) registerEventProcessors() {
80+
//
81+
// Event Timestamps Normalization
82+
//
83+
84+
// Convert all time relate args to nanoseconds since epoch.
85+
// NOTE: Make sure to convert time related args (of your event) in here, so that
86+
// any later code has access to normalized time arguments.
87+
t.RegisterEventProcessor(events.SchedProcessFork, t.normalizeTimeArg(
88+
"start_time",
89+
"parent_start_time",
90+
"parent_process_start_time",
91+
"leader_start_time",
92+
))
93+
8194
//
8295
// Process Tree Processors
8396
//
@@ -120,15 +133,6 @@ func (t *Tracee) registerEventProcessors() {
120133
t.RegisterEventProcessor(events.PrintMemDump, t.processPrintMemDump)
121134
t.RegisterEventProcessor(events.SharedObjectLoaded, t.processSharedObjectLoaded)
122135

123-
//
124-
// Event Timestamps Normalization Processors
125-
//
126-
127-
// Convert all time relate args to nanoseconds since epoch.
128-
// NOTE: Make sure to convert time related args (of your event) in here.
129-
t.RegisterEventProcessor(events.SchedProcessFork, t.normalizeTimeArg("start_time"))
130-
t.RegisterEventProcessor(events.All, t.normalizeEventCtxTimes)
131-
132136
//
133137
// Uprobe based events processors
134138
//

pkg/ebpf/processor_funcs.go

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/aquasecurity/tracee/pkg/events/parse"
2020
"github.com/aquasecurity/tracee/pkg/filehash"
2121
"github.com/aquasecurity/tracee/pkg/logger"
22+
"github.com/aquasecurity/tracee/pkg/time"
2223
"github.com/aquasecurity/tracee/pkg/utils"
2324
"github.com/aquasecurity/tracee/types/trace"
2425
)
@@ -161,7 +162,11 @@ func (t *Tracee) processSchedProcessExec(event *trace.Event) error {
161162
}
162163
destinationFilePath := filepath.Join(
163164
destinationDirPath,
164-
fmt.Sprintf("exec.%d.%s", event.Timestamp, filepath.Base(filePath)),
165+
fmt.Sprintf(
166+
"exec.%d.%s",
167+
event.Timestamp,
168+
filepath.Base(filePath),
169+
),
165170
)
166171
// don't capture same file twice unless it was modified
167172
lastCtime, ok := t.capturedFiles[capturedFileID]
@@ -346,33 +351,21 @@ func (t *Tracee) processPrintMemDump(event *trace.Event) error {
346351
// Timing related functions
347352
//
348353

349-
// normalizeEventCtxTimes normalizes the event context timings to be relative to tracee start time
350-
// or current time in nanoseconds.
351-
func (t *Tracee) normalizeEventCtxTimes(event *trace.Event) error {
352-
eventId := events.ID(event.EventID)
353-
if eventId > events.MaxCommonID && eventId < events.MaxUserSpace {
354-
// derived events are normalized from their base event, skip the processing
355-
return nil
356-
}
357-
event.Timestamp = t.timeNormalizer.NormalizeTime(event.Timestamp)
358-
event.ThreadStartTime = t.timeNormalizer.NormalizeTime(event.ThreadStartTime)
359-
360-
return nil
361-
}
362-
363354
// normalizeTimeArg returns a processor function for some argument name
364-
// which normalizes said event arg time to be relative to tracee start time or current time.
365-
func (t *Tracee) normalizeTimeArg(argName string) func(event *trace.Event) error {
355+
// which normalizes said event arg time from boot monotonic to epoch
356+
func (t *Tracee) normalizeTimeArg(argNames ...string) func(event *trace.Event) error {
366357
return func(event *trace.Event) error {
367-
arg := events.GetArg(event, argName)
368-
if arg == nil {
369-
return errfmt.Errorf("couldn't find argument %s of event %s", argName, event.EventName)
370-
}
371-
argTime, ok := arg.Value.(uint64)
372-
if !ok {
373-
return errfmt.Errorf("argument %s of event %s is not of type uint64", argName, event.EventName)
358+
for _, argName := range argNames {
359+
arg := events.GetArg(event, argName)
360+
if arg == nil {
361+
return errfmt.Errorf("couldn't find argument %s of event %s", argName, event.EventName)
362+
}
363+
argTime, ok := arg.Value.(uint64)
364+
if !ok {
365+
return errfmt.Errorf("argument %s of event %s is not of type uint64", argName, event.EventName)
366+
}
367+
arg.Value = time.BootToEpochNS(argTime)
374368
}
375-
arg.Value = t.timeNormalizer.NormalizeTime(int(argTime))
376369
return nil
377370
}
378371
}

pkg/ebpf/processor_proctree.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,25 +75,25 @@ func (t *Tracee) procTreeForkProcessor(event *trace.Event) error {
7575

7676
return t.processTree.FeedFromFork(
7777
proctree.ForkFeed{
78-
TimeStamp: uint64(t.timeNormalizer.NormalizeTime(int(childStartTime))), // event timestamp is the same
78+
TimeStamp: childStartTime, // event timestamp is the same
7979
ChildHash: childHash,
8080
ParentHash: parentHash,
8181
LeaderHash: leaderHash,
8282
ParentTid: parentTid,
8383
ParentNsTid: parentNsTid,
8484
ParentPid: parentPid,
8585
ParentNsPid: parentNsPid,
86-
ParentStartTime: uint64(t.timeNormalizer.NormalizeTime(int(parentStartTime))),
86+
ParentStartTime: parentStartTime,
8787
LeaderTid: leaderTid,
8888
LeaderNsTid: leaderNsTid,
8989
LeaderPid: leaderPid,
9090
LeaderNsPid: leaderNsPid,
91-
LeaderStartTime: uint64(t.timeNormalizer.NormalizeTime(int(leaderStartTime))),
91+
LeaderStartTime: leaderStartTime,
9292
ChildTid: childTid,
9393
ChildNsTid: childNsTid,
9494
ChildPid: childPid,
9595
ChildNsPid: childNsPid,
96-
ChildStartTime: uint64(t.timeNormalizer.NormalizeTime(int(childStartTime))),
96+
ChildStartTime: childStartTime,
9797
},
9898
)
9999
}
@@ -153,7 +153,7 @@ func (t *Tracee) procTreeExecProcessor(event *trace.Event) error {
153153

154154
return t.processTree.FeedFromExec(
155155
proctree.ExecFeed{
156-
TimeStamp: uint64(t.timeNormalizer.NormalizeTime(int(timestamp))),
156+
TimeStamp: timestamp,
157157
TaskHash: taskHash,
158158
ParentHash: 0, // regular pipeline does not have parent hash
159159
LeaderHash: 0, // regular pipeline does not have leader hash
@@ -204,7 +204,7 @@ func (t *Tracee) procTreeExitProcessor(event *trace.Event) error {
204204

205205
return t.processTree.FeedFromExit(
206206
proctree.ExitFeed{
207-
TimeStamp: uint64(t.timeNormalizer.NormalizeTime(int(timestamp))), // time of exit is already a timestamp
207+
TimeStamp: timestamp, // time of exit is already a timestamp
208208
TaskHash: taskHash,
209209
ParentHash: 0, // regular pipeline does not have parent hash
210210
LeaderHash: 0, // regular pipeline does not have leader hash
@@ -237,7 +237,7 @@ func (t *Tracee) procTreeAddBinInfo(event *trace.Event) error {
237237
}
238238

239239
// Event timestamp is changed to relative (or not) at the end of all processors only.
240-
eventTimestamp := traceetime.NsSinceEpochToTime(uint64(t.timeNormalizer.NormalizeTime(event.Timestamp)))
240+
eventTimestamp := traceetime.NsSinceEpochToTime(uint64(event.Timestamp))
241241

242242
executable := currentProcess.GetExecutable()
243243

pkg/ebpf/tracee.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,6 @@ type Tracee struct {
128128
// This does not mean they are required for tracee to function.
129129
// TODO: remove this in favor of dependency manager nodes
130130
requiredKsyms []string
131-
// Time for normalization
132-
timeNormalizer traceetime.TimeNormalizer
133131
}
134132

135133
func (t *Tracee) Stats() *metrics.Stats {
@@ -452,11 +450,6 @@ func (t *Tracee) Init(ctx gocontext.Context) error {
452450
return errfmt.WrapError(err)
453451
}
454452

455-
// time in nanoseconds when the system was booted
456-
t.bootTime = uint64(traceetime.GetBootTimeNS())
457-
458-
t.timeNormalizer = traceetime.CreateTimeNormalizerByConfig(t.bootTime)
459-
460453
// Initialize buckets cache
461454

462455
var mntNSProcs map[int]int
@@ -583,7 +576,7 @@ func (t *Tracee) Init(ctx gocontext.Context) error {
583576
proctreeConfig.ProcfsInitialization = false
584577
proctreeConfig.ProcfsQuerying = false
585578
}
586-
t.processTree, err = proctree.NewProcessTree(ctx, proctreeConfig, t.timeNormalizer)
579+
t.processTree, err = proctree.NewProcessTree(ctx, proctreeConfig)
587580
if err != nil {
588581
return errfmt.WrapError(err)
589582
}
@@ -1414,7 +1407,6 @@ func (t *Tracee) initBPF() error {
14141407
t.containers,
14151408
t.config.NoContainersEnrich,
14161409
t.processTree,
1417-
t.timeNormalizer,
14181410
)
14191411
if err != nil {
14201412
return errfmt.WrapError(err)

0 commit comments

Comments
 (0)