diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-21 08:16:08 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-21 08:16:08 +0300 |
| commit | be8735fe701f7398c19c17c394f4827614eab875 (patch) | |
| tree | aba59890563edb6e03f2eb82fee5d89b49fa2c81 /internal/flags/flags.go | |
| parent | 3a5706f21d30258577a5934efb93c400dad723db (diff) | |
p7 add attach-time trace dimension gating
Diffstat (limited to 'internal/flags/flags.go')
| -rw-r--r-- | internal/flags/flags.go | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/internal/flags/flags.go b/internal/flags/flags.go index 3a6456a..547ba8e 100644 --- a/internal/flags/flags.go +++ b/internal/flags/flags.go @@ -148,12 +148,12 @@ func Parse() (Config, error) { // fresh FlagSet and custom argument slices without touching global state. func parseFromFlagSet(fs *flag.FlagSet, args []string) (Config, error) { cfg := NewFlags() - tpsAttach, tpsExclude, fields, familySampling, syscallSampling := registerFlags(fs, &cfg) + tpsAttach, tpsExclude, fields, familySampling, syscallSampling, dims := registerFlags(fs, &cfg) if err := fs.Parse(args); err != nil { return Config{}, err } - if err := resolvePostParseFields(&cfg, tpsAttach, tpsExclude, fields); err != nil { + if err := resolvePostParseFields(&cfg, tpsAttach, tpsExclude, fields, dims); err != nil { return Config{}, err } if err := resolveSamplingRates(&cfg, familySampling, syscallSampling); err != nil { @@ -167,9 +167,10 @@ func parseFromFlagSet(fs *flag.FlagSet, args []string) (Config, error) { // registerFlags binds all CLI flags to cfg and returns the string pointers for // fields that require post-parse resolution (tracepoint regexes, collapse fields). -func registerFlags(fs *flag.FlagSet, cfg *Config) (tpsAttach, tpsExclude, fields, familySampling, syscallSampling *string) { +func registerFlags(fs *flag.FlagSet, cfg *Config) (tpsAttach, tpsExclude, fields, familySampling, syscallSampling *string, dims *tracepoints.DimensionSelectorConfig) { validFields := collapse.ValidFields() validCounts := collapse.ValidCountFields() + dimensionCfg := &tracepoints.DimensionSelectorConfig{} fs.IntVar(&cfg.PidFilter, "pid", cfg.PidFilter, "Filter for processes ID") fs.IntVar(&cfg.TidFilter, "tid", cfg.TidFilter, "Filter for thread ID") @@ -182,6 +183,18 @@ func registerFlags(fs *flag.FlagSet, cfg *Config) (tpsAttach, tpsExclude, fields tpsAttach = fs.String("tps", "", "Comma separated list regexes for tracepoints to load") tpsExclude = fs.String("tpsExclude", "", "Comma separated list regexes for tracepoints to exclude") + fs.StringVar(&dimensionCfg.TraceFamilies, "trace-families", "", + "Comma separated syscall families to attach (for example FS,Time,Network)") + fs.StringVar(&dimensionCfg.TraceKinds, "trace-kinds", "", + "Comma separated tracepoint kinds to attach (for example fd,open,sleep,epoll-ctl)") + fs.StringVar(&dimensionCfg.TraceSyscalls, "trace-syscalls", "", + "Comma separated syscall names to attach (for example openat,read,nanosleep)") + fs.StringVar(&dimensionCfg.NoTraceFamilies, "no-trace-families", "", + "Comma separated syscall families to exclude from attachment") + fs.StringVar(&dimensionCfg.NoTraceKinds, "no-trace-kinds", "", + "Comma separated tracepoint kinds to exclude from attachment") + fs.StringVar(&dimensionCfg.NoTraceSyscalls, "no-trace-syscalls", "", + "Comma separated syscall names to exclude from attachment") fs.BoolVar(&cfg.PlainMode, "plain", false, "Enable plain CSV output mode (disable TUI)") fs.BoolVar(&cfg.FlamegraphOutput, "flamegraph", false, "Write aggregated .ior.zst output for trace/integration workflows") @@ -204,15 +217,18 @@ func registerFlags(fs *flag.FlagSet, cfg *Config) (tpsAttach, tpsExclude, fields fmt.Sprintf("Comma separated list of fields to collapse, valid are: %v", validFields)) fs.StringVar(&cfg.CountField, "count", cfg.CountField, fmt.Sprintf("Count field to collapse, valid are: %v", validCounts)) - return tpsAttach, tpsExclude, fields, familySampling, syscallSampling + return tpsAttach, tpsExclude, fields, familySampling, syscallSampling, dimensionCfg } // resolvePostParseFields compiles the tracepoint selector and collapse field // list from the raw string flags that cannot be bound directly to cfg fields. -func resolvePostParseFields(cfg *Config, tpsAttach, tpsExclude, fields *string) error { +func resolvePostParseFields(cfg *Config, tpsAttach, tpsExclude, fields *string, dims *tracepoints.DimensionSelectorConfig) error { // Parse the tracepoint include/exclude regex lists into a Selector. // The Selector owns all matching logic; Config is purely a data carrier. - sel, err := tracepoints.ParseSelector(*tpsAttach, *tpsExclude) + if dims == nil { + dims = &tracepoints.DimensionSelectorConfig{} + } + sel, err := tracepoints.ParseSelectorWithDimensions(*tpsAttach, *tpsExclude, *dims) if err != nil { return err } |
