summaryrefslogtreecommitdiff
path: root/internal/streamrow
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-20 14:37:41 +0300
committerPaul Buetow <paul@buetow.org>2026-05-20 14:37:41 +0300
commit96355c79a38032ab4bd880b3b3ff4192ae709795 (patch)
tree7a395706e3db680f6e695c8602501741eed6ad45 /internal/streamrow
parentf063e626a28339735da583142e5af864a60c2111 (diff)
task 27: add KindSleep and requested sleep metric
Diffstat (limited to 'internal/streamrow')
-rw-r--r--internal/streamrow/row.go9
-rw-r--r--internal/streamrow/row_test.go23
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) {