prometheus/node_exporter · error
invalid tracepoint config
Error message
invalid tracepoint config %v
What it means
perfTracepointFlagToTracepoints parses the --collector.perf.tracepoint flag values, each expected in the form "subsystem:event" (exactly one colon). If a value does not split into exactly 2 fields, it returns "invalid tracepoint config %v" naming the offending value. This is a configuration-format validation error, raised before any perf event is opened.
Solutions
- Write each tracepoint as subsystem:event, e.g. --collector.perf.tracepoint=sched:sched_switch
- Remove extra colons from the value; the format allows exactly one subsystem:event pair
- List valid tracepoints with `perf list` and pick the subsystem:event name
- Check the systemd unit/CLI quoting so the value is passed as a single argument
Example fix
// before --collector.perf.tracepoint=sched:sched_switch:extra // after --collector.perf.tracepoint=sched:sched_switch
Defensive patterns
Strategy: validation
Validate before calling
valid := func(tp string) bool {
parts := strings.Split(tp, ":")
return len(parts) == 2 && parts[0] != "" && parts[1] != ""
}
for _, tp := range tracepointFlags {
if !valid(tp) { return fmt.Errorf("bad --collector.perf.tracepoint %q; want subsystem:event", tp) }
} Type guard
func isWellFormedTracepoint(s string) bool {
parts := strings.Split(s, ":")
return len(parts) == 2 && parts[0] != "" && parts[1] != ""
} Try / catch
tps, err := perfTracepointFlagToTracepoints(*perfTracepointFlag)
if err != nil {
if strings.Contains(err.Error(), "invalid tracepoint config") {
kingpin.Fatalf("%v; expected format subsystem:event (see `perf list`)", err)
}
return err
} Prevention
- Always use subsystem:event format exactly as shown by `perf list`
- Never include extra colons; one separator only
- Quote flag values in systemd units/shell to avoid argument splitting
- Validate tracepoint flags in config tooling before deploying the exporter
When it happens
Trigger: perfTracepointFlagToTracepoints returns this when a tracepoint flag entry lacks the required colon separator or has more than one (len(split) != 2), e.g. "sched" (no event), "sched:sched_switch:extra", or an empty string; called from newPerfTracepointCollector at collector startup.
Common situations: Users typing tracepoint names without the event part (just "sched"); copying kernel perf event names that use '.' or '-' but omitting the required ':' separator; shell/CLI quoting splitting one flag into multiple wrong entries; YAML/systemd unit config mistakes when passing multiple --collector.perf.tracepoint flags.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- invalid flag value
- failed to parse device filter flags
- failed to parse device filter flags
- failed to parse device filter flags
- failed to parse device filter flags
AI-assisted analysis of prometheus/node_exporter@17ddd77c59 (2026-09-07).
Data as JSON: /api/errors/213e9b3e66f4dfe5.
Report an issue: GitHub.
Appendix: source
Thrown at collector/perf_linux.go:106
"DataTLBReadHit": perf.DataTLBReadHitProfiler,
"DataTLBReadMiss": perf.DataTLBReadMissProfiler,
"DataTLBWriteHit": perf.DataTLBWriteHitProfiler,
"DataTLBWriteMiss": perf.DataTLBWriteMissProfiler,
// "NodeCacheReadHit": perf.NodeCacheReadHitProfiler,
// "NodeCacheReadMiss": perf.NodeCacheReadMissProfiler,
// "NodeCacheWriteHit": perf.NodeCacheWriteHitProfiler,
// "NodeCacheWriteMiss": perf.NodeCacheWriteMissProfiler,
}
)
// perfTracepointFlagToTracepoints returns the set of configured tracepoints.
func perfTracepointFlagToTracepoints(tracepointsFlag []string) ([]*perfTracepoint, error) {
tracepoints := make([]*perfTracepoint, len(tracepointsFlag))
for i, tracepoint := range tracepointsFlag {
split := strings.Split(tracepoint, ":")
if len(split) != 2 {
return nil, fmt.Errorf("invalid tracepoint config %v", tracepoint)
}
tracepoints[i] = &perfTracepoint{
subsystem: split[0],
event: split[1],
}
}
return tracepoints, nil
}
// perfCPUFlagToCPUs returns a set of CPUs for the perf collectors to monitor.
func perfCPUFlagToCPUs(cpuFlag string) ([]int, error) {
var err error
cpus := []int{}
for subset := range strings.SplitSeq(cpuFlag, ",") {
// First parse a single CPU.
if !strings.Contains(subset, "-") {
cpu, err := strconv.Atoi(subset)
if err != nil {View on GitHub (pinned to 17ddd77c59)