diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-18 19:13:59 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-18 19:13:59 +0300 |
| commit | 65599ad9b87b1c61cb6d8232200da88952370e96 (patch) | |
| tree | 862e20468835255ed06544a2df2470678d3b97dc /internal/generate | |
| parent | a92cb0283b1ba8735a6697a8f94911397534131f (diff) | |
t6 add syscall family dashboard aggregation
Diffstat (limited to 'internal/generate')
| -rw-r--r-- | internal/generate/typesgo.go | 80 | ||||
| -rw-r--r-- | internal/generate/typesgo_test.go | 8 |
2 files changed, 87 insertions, 1 deletions
diff --git a/internal/generate/typesgo.go b/internal/generate/typesgo.go index 9f91981..d668ba3 100644 --- a/internal/generate/typesgo.go +++ b/internal/generate/typesgo.go @@ -149,6 +149,7 @@ func parseMember(line string) (CMember, bool) { func writeTypeDefsAndMaps(b *strings.Builder, constants []CConstant) { b.WriteString("type EventType uint32\n") b.WriteString("type TraceId uint32\n\n") + writeSyscallFamilyDefs(b) var sysConstants []CConstant for _, c := range constants { @@ -166,12 +167,36 @@ func writeTypeDefsAndMaps(b *strings.Builder, constants []CConstant) { s = strings.TrimPrefix(s, "SYS_EXIT_") return strings.ToLower(s) }) + writeTraceIdFamilyMap(b, sysConstants) writeTraceIdStringMethod(b) writeTraceIdNameMethod(b) + writeTraceIdFamilyMethod(b) b.WriteString("\n") } +func writeSyscallFamilyDefs(b *strings.Builder) { + b.WriteString(`// SyscallFamily is the broad runtime grouping for a syscall tracepoint. +type SyscallFamily string + +const ( + FamilyNetwork SyscallFamily = "Network" + FamilyMemory SyscallFamily = "Memory" + FamilySignals SyscallFamily = "Signals" + FamilySched SyscallFamily = "Sched" + FamilyIPC SyscallFamily = "IPC" + FamilyTime SyscallFamily = "Time" + FamilyProcess SyscallFamily = "Process" + FamilySecurity SyscallFamily = "Security" + FamilyFS SyscallFamily = "FS" + FamilyPolling SyscallFamily = "Polling" + FamilyAIO SyscallFamily = "AIO" + FamilyMisc SyscallFamily = "Misc" +) + +`) +} + func writeTraceIdMap(b *strings.Builder, mapName string, constants []CConstant, transform func(string) string) { fmt.Fprintf(b, "var %s = map[TraceId]string{\n\t", mapName) entries := make([]string, 0, len(constants)) @@ -182,6 +207,48 @@ func writeTraceIdMap(b *strings.Builder, mapName string, constants []CConstant, b.WriteString(",\n}\n\n") } +func writeTraceIdFamilyMap(b *strings.Builder, constants []CConstant) { + b.WriteString("var traceId2Family = map[TraceId]SyscallFamily{\n\t") + entries := make([]string, 0, len(constants)) + for _, c := range constants { + tracepoint := strings.ToLower(c.Name) + tracepoint = strings.TrimPrefix(tracepoint, "sys_") + family := ClassifySyscallFamily("sys_" + tracepoint) + entries = append(entries, fmt.Sprintf("%s: %s", c.Value, syscallFamilyConstName(family))) + } + b.WriteString(strings.Join(entries, ", ")) + b.WriteString(",\n}\n\n") +} + +func syscallFamilyConstName(family SyscallFamily) string { + switch family { + case FamilyNetwork: + return "FamilyNetwork" + case FamilyMemory: + return "FamilyMemory" + case FamilySignals: + return "FamilySignals" + case FamilySched: + return "FamilySched" + case FamilyIPC: + return "FamilyIPC" + case FamilyTime: + return "FamilyTime" + case FamilyProcess: + return "FamilyProcess" + case FamilySecurity: + return "FamilySecurity" + case FamilyFS: + return "FamilyFS" + case FamilyPolling: + return "FamilyPolling" + case FamilyAIO: + return "FamilyAIO" + default: + return "FamilyMisc" + } +} + func writeTraceIdStringMethod(b *strings.Builder) { b.WriteString(`func (s TraceId) String() string { str, ok := traceId2String[s] @@ -206,6 +273,19 @@ func writeTraceIdNameMethod(b *strings.Builder) { `) } +func writeTraceIdFamilyMethod(b *strings.Builder) { + b.WriteString(`// Family returns the broad syscall family for this tracepoint. +func (s TraceId) Family() SyscallFamily { + family, ok := traceId2Family[s] + if !ok { + return FamilyMisc + } + return family +} + +`) +} + func writeGoStruct(b *strings.Builder, s CStruct) { goName := snakeToCamel(s.Name) selfRef := strings.ToLower(goName[:1]) diff --git a/internal/generate/typesgo_test.go b/internal/generate/typesgo_test.go index 76c0521..fcbabec 100644 --- a/internal/generate/typesgo_test.go +++ b/internal/generate/typesgo_test.go @@ -47,6 +47,8 @@ struct fd_event { const testDefines = `#define SYS_ENTER_OPENAT 784 #define SYS_EXIT_OPENAT 783 +#define SYS_ENTER_EPOLL_WAIT 782 +#define SYS_EXIT_EPOLL_WAIT 781 ` func TestParseCTypesInput(t *testing.T) { @@ -72,7 +74,7 @@ func TestParseCTypesInput(t *testing.T) { } // Check constants - expectedConsts := 8 // MAX_FILENAME_LENGTH, MAX_PROGNAME_LENGTH, 2 event types, 2 classified, 2 SYS_ + expectedConsts := 10 // MAX_FILENAME_LENGTH, MAX_PROGNAME_LENGTH, 2 event types, 2 classified, 4 SYS_ if len(constants) != expectedConsts { t.Errorf("constants = %d, want %d", len(constants), expectedConsts) } @@ -232,6 +234,9 @@ func TestGenerateTypesGoTraceIdMaps(t *testing.T) { requireContains(t, output, "var traceId2Name = map[TraceId]string{") requireContains(t, output, `784: "openat"`) requireContains(t, output, `783: "openat"`) + requireContains(t, output, "var traceId2Family = map[TraceId]SyscallFamily{") + requireContains(t, output, `784: FamilyFS`) + requireContains(t, output, `782: FamilyPolling`) } func TestGenerateTypesGoTraceIdMethods(t *testing.T) { @@ -244,6 +249,7 @@ func TestGenerateTypesGoTraceIdMethods(t *testing.T) { requireContains(t, output, "func (s TraceId) String() string") requireContains(t, output, "func (s TraceId) Name() string") + requireContains(t, output, "func (s TraceId) Family() SyscallFamily") requireContains(t, output, `return fmt.Sprintf("unknown_trace_id_%d", s)`) } |
