{"record":{"id":"e49e782b6b9af3f2","repo":"prometheus/node_exporter","slug":"missing-collector-s","errorCode":null,"errorMessage":"missing collector: %s","messagePattern":"missing collector: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"collector/collector.go","lineNumber":111,"sourceCode":"// collectorFlagAction generates a new action function for the given collector\n// to track whether it has been explicitly enabled or disabled from the command line.\n// A new action function is needed for each collector flag because the ParseContext\n// does not contain information about which flag called the action.\n// See: https://github.com/alecthomas/kingpin/issues/294\nfunc collectorFlagAction(collector string) func(ctx *kingpin.ParseContext) error {\n\treturn func(_ *kingpin.ParseContext) error {\n\t\tforcedCollectors[collector] = true\n\t\treturn nil\n\t}\n}\n\n// NewNodeCollector creates a new NodeCollector.\nfunc NewNodeCollector(logger *slog.Logger, filters ...string) (*NodeCollector, error) {\n\tf := make(map[string]bool)\n\tfor _, filter := range filters {\n\t\tenabled, exist := collectorState[filter]\n\t\tif !exist {\n\t\t\treturn nil, fmt.Errorf(\"missing collector: %s\", filter)\n\t\t}\n\t\tif !*enabled {\n\t\t\treturn nil, fmt.Errorf(\"disabled collector: %s\", filter)\n\t\t}\n\t\tf[filter] = true\n\t}\n\tcollectors := make(map[string]Collector)\n\tinitiatedCollectorsMtx.Lock()\n\tdefer initiatedCollectorsMtx.Unlock()\n\tfor key, enabled := range collectorState {\n\t\tif !*enabled || (len(f) > 0 && !f[key]) {\n\t\t\tcontinue\n\t\t}\n\t\tif collector, ok := initiatedCollectors[key]; ok {\n\t\t\tcollectors[key] = collector\n\t\t} else {\n\t\t\tcollector, err := factories[key](logger.With(\"collector\", key))\n\t\t\tif err != nil {","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/collector.go#L93-L129","documentation":"NewNodeCollector validates every filter name against the collectorState registry and returns \"missing collector: <name>\" when the requested collector name does not exist. This is a pure configuration error: the name was never a known collector (typo, renamed collector, or platform-specific collector absent on this OS/build). NewNodeCollector is called by innerHandler for each scrape, so a bad --collectors.enable/--collectors.disable filter fails the request.","triggerScenarios":"Passing filters such as NewNodeCollector(logger, \"cpu-stats\") (typo for \"cpu\"), enabling a collector removed/renamed in a newer node_exporter version, or requesting a Linux-only collector (e.g. \"bcache\") on non-Linux where collectorState lacks it.","commonSituations":"Typos in prometheus scrape config relabeling of ?collectors.enable[]; upgrade to a node_exporter version where a collector was renamed or deleted; copy-pasting collector lists between OS platforms; e2e scripts matching flags on the wrong OS.","solutions":["Check the spelling against the collector list in `node_exporter --help-long` or README collector table","Remove or correct the unknown name in the scrape URL query (e.g. /metrics?collectors.enable[]=buddyinfo) or enable/disable flags","Diff collector names between the old and new node_exporter version after an upgrade","Guard dynamically-built collector lists by validating each name against collectorState before calling NewNodeCollector"],"exampleFix":"// before\n c, err := collector.NewNodeCollector(logger, filters...) // filter \"memory-stats\" -> missing collector\n// after\n valid := map[string]bool{\"cpu\": true, \"memory\": true, \"diskstats\": true}\n filters = keepIf(filters, func(f string) bool { return valid[f] })\n c, err := collector.NewNodeCollector(logger, filters...)","handlingStrategy":"validation","validationCode":"for _, f := range filters {\n\tif _, ok := knownCollectors[f]; !ok {\n\t\treturn fmt.Errorf(\"unknown collector %q; see node_exporter --help-long\", f)\n\t}\n}","typeGuard":null,"tryCatchPattern":"c, err := collector.NewNodeCollector(logger, filters...)\nif err != nil {\n\tif strings.HasPrefix(err.Error(), \"missing collector:\") {\n\t\treturn fmt.Errorf(\"config error: %w\", err) // fail fast, fix config\n\t}\n\treturn err\n}","preventionTips":["Copy collector names only from --help-long or the README table, never by memory","After upgrading node_exporter, diff collector names before applying scrape configs","Per-OS: validate Linux-only collector names are absent on other platforms","Keep scrape-config collector lists under review/version control"],"tags":["configuration","collector","invalid-argument","node-exporter"],"backgroundTag":"invalid-argument-value","analyzedSha":"17ddd77c59ba27e1508e9f7894b1e55b44d6aed3","analyzedAt":"2026-09-07T17:54:06.211Z","contentChangedAt":"2026-09-07T17:54:06.211Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}