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

  1. Write each tracepoint as subsystem:event, e.g. --collector.perf.tracepoint=sched:sched_switch
  2. Remove extra colons from the value; the format allows exactly one subsystem:event pair
  3. List valid tracepoints with `perf list` and pick the subsystem:event name
  4. 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

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


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)