diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-20 14:37:41 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-20 14:37:41 +0300 |
| commit | 96355c79a38032ab4bd880b3b3ff4192ae709795 (patch) | |
| tree | 7a395706e3db680f6e695c8602501741eed6ad45 /internal/streamrow | |
| parent | f063e626a28339735da583142e5af864a60c2111 (diff) | |
task 27: add KindSleep and requested sleep metric
Diffstat (limited to 'internal/streamrow')
| -rw-r--r-- | internal/streamrow/row.go | 9 | ||||
| -rw-r--r-- | internal/streamrow/row_test.go | 23 |
2 files changed, 29 insertions, 3 deletions
diff --git a/internal/streamrow/row.go b/internal/streamrow/row.go index 7497583..a6ccdf7 100644 --- a/internal/streamrow/row.go +++ b/internal/streamrow/row.go @@ -25,9 +25,11 @@ type Row struct { Bytes uint64 // AddressSpaceBytes tracks memory-region extent for memory-management syscalls. AddressSpaceBytes uint64 - RetVal int64 - IsError bool - FD int32 + // RequestedSleepNs stores requested sleep duration metadata for sleep syscalls. + RequestedSleepNs int64 + RetVal int64 + IsError bool + FD int32 } func (r Row) SyscallValue() string { @@ -113,6 +115,7 @@ func New(seq uint64, pair *event.Pair) Row { GapNs: pair.DurationToPrev, Bytes: pair.Bytes, AddressSpaceBytes: pair.AddressSpaceBytes, + RequestedSleepNs: pair.RequestedSleepNs, FD: UnknownFD, } if fd, ok := pair.FileDescriptor(); ok { diff --git a/internal/streamrow/row_test.go b/internal/streamrow/row_test.go index 7573f43..9757722 100644 --- a/internal/streamrow/row_test.go +++ b/internal/streamrow/row_test.go @@ -62,6 +62,7 @@ func TestNewPopulatesFieldsFromPair(t *testing.T) { pair.DurationToPrev = 19 pair.Bytes = 512 pair.AddressSpaceBytes = 2048 + pair.RequestedSleepNs = 987_654 got := New(9, pair) if got.Seq != 9 || got.TimeNs != 1234 { @@ -82,6 +83,9 @@ func TestNewPopulatesFieldsFromPair(t *testing.T) { if got.AddressSpaceBytes != 2048 { t.Fatalf("AddressSpaceBytes = %d, want 2048", got.AddressSpaceBytes) } + if got.RequestedSleepNs != 987_654 { + t.Fatalf("RequestedSleepNs = %d, want 987654", got.RequestedSleepNs) + } if got.RetVal != -2 || !got.IsError { t.Fatalf("RetVal/IsError = %d/%v, want -2/true", got.RetVal, got.IsError) } @@ -140,6 +144,25 @@ func TestNewCarriesReadyCountForPoll(t *testing.T) { } } +func TestNewCarriesRequestedSleepNs(t *testing.T) { + enter := &types.SleepEvent{TraceId: types.SYS_ENTER_NANOSLEEP, Time: 3200, Pid: 31, Tid: 32, RequestedNs: 5_000_000} + exit := &types.RetEvent{TraceId: types.SYS_EXIT_NANOSLEEP, Time: 3300, Ret: 0, Pid: 31, Tid: 32} + pair := event.NewPair(enter) + pair.ExitEv = exit + pair.RequestedSleepNs = enter.RequestedNs + + got := New(25, pair) + if got.Syscall != "nanosleep" || got.FD != UnknownFD { + t.Fatalf("Syscall/FD = %q/%d, want nanosleep/%d", got.Syscall, got.FD, UnknownFD) + } + if got.RequestedSleepNs != 5_000_000 { + t.Fatalf("RequestedSleepNs = %d, want 5000000", got.RequestedSleepNs) + } + if got.Bytes != 0 { + t.Fatalf("Bytes = %d, want 0 for sleep events", got.Bytes) + } +} + // TestRowValueAccessors verifies that all typed accessor methods return the // underlying field values set on a Row. func TestRowValueAccessors(t *testing.T) { |
