summaryrefslogtreecommitdiff
path: root/internal/generate
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-18 19:13:59 +0300
committerPaul Buetow <paul@buetow.org>2026-05-18 19:13:59 +0300
commit65599ad9b87b1c61cb6d8232200da88952370e96 (patch)
tree862e20468835255ed06544a2df2470678d3b97dc /internal/generate
parenta92cb0283b1ba8735a6697a8f94911397534131f (diff)
t6 add syscall family dashboard aggregation
Diffstat (limited to 'internal/generate')
-rw-r--r--internal/generate/typesgo.go80
-rw-r--r--internal/generate/typesgo_test.go8
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)`)
}