{"record":{"id":"d032f9a151537ca5","repo":"prometheus/node_exporter","slug":"failed-to-parse-device-filter-flags-w-d032f9","errorCode":null,"errorMessage":"failed to parse device filter flags: %w","messagePattern":"failed to parse device filter flags: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"collector/diskstats_linux.go","lineNumber":97,"sourceCode":"\tgetUdevDeviceProperties func(uint32, uint32) (udevInfo, error)\n}\n\nfunc init() {\n\tregisterCollector(\"diskstats\", defaultEnabled, NewDiskstatsCollector)\n}\n\n// NewDiskstatsCollector returns a new Collector exposing disk device stats.\n// Docs from https://www.kernel.org/doc/Documentation/iostats.txt\nfunc NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {\n\tvar diskLabelNames = []string{\"device\"}\n\tfs, err := blockdevice.NewFS(*procPath, *sysPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to open sysfs: %w\", err)\n\t}\n\n\tdeviceFilter, err := newDiskstatsDeviceFilter(logger)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse device filter flags: %w\", err)\n\t}\n\n\tcollector := diskstatsCollector{\n\t\tdeviceFilter: deviceFilter,\n\t\tfs:           fs,\n\t\tinfoDesc: typedDesc{\n\t\t\tdesc: prometheus.NewDesc(prometheus.BuildFQName(namespace, diskSubsystem, \"info\"),\n\t\t\t\t\"Info of /sys/block/<block_device>.\",\n\t\t\t\t[]string{\"device\", \"major\", \"minor\", \"path\", \"wwn\", \"model\", \"serial\", \"revision\", \"rotational\"},\n\t\t\t\tnil,\n\t\t\t), valueType: prometheus.GaugeValue,\n\t\t},\n\t\tdescs: []typedDesc{\n\t\t\t{\n\t\t\t\tdesc: readsCompletedDesc, valueType: prometheus.CounterValue,\n\t\t\t},\n\t\t\t{\n\t\t\t\tdesc: prometheus.NewDesc(","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/diskstats_linux.go#L79-L115","documentation":"On Linux, after opening proc/sysfs successfully, NewDiskstatsCollector compiles the device include/exclude flag regexes via newDiskstatsDeviceFilter(logger). An invalid regular expression in those flags aborts construction with \"failed to parse device filter flags: %w\".","triggerScenarios":"node_exporter startup on Linux with --collector.diskstats.device-exclude (or include) whose value fails regexp.Compile; same for any direct call of NewDiskstatsCollector with such flags.","commonSituations":"Unquoted regex values altered by the shell (globs like disk* expanded, brackets eaten), unbalanced groups/brackets in hand-written patterns, or patterns copied between tools with different regex syntax.","solutions":["Use the wrapped regexp error (%w) to pinpoint the syntax problem and fix the flag value.","Quote the pattern: --collector.diskstats.device-exclude='^(ram|loop|fd)\\d+$'.","Validate the regex against a Go regexp tester or a quick Go snippet before deploying.","Start without the filter flag to confirm the collector initializes, then re-add a corrected pattern."],"exampleFix":"// before\n--collector.diskstats.device-exclude=(ram|loop\\d+$\n// after\n--collector.diskstats.device-exclude='^(ram|loop)\\d+$'","handlingStrategy":"validation","validationCode":"if _, err := regexp.Compile(deviceExcludeFlag); err != nil {\n    return fmt.Errorf(\"invalid diskstats device filter %q: %w\", deviceExcludeFlag, err)\n}","typeGuard":null,"tryCatchPattern":"if _, err := NewDiskstatsCollector(logger); err != nil {\n    if strings.Contains(err.Error(), \"failed to parse device filter flags\") {\n        log.Fatalf(\"correct the device filter regex: %v\", err)\n    }\n    log.Fatalf(\"diskstats init failed: %v\", err)\n}","preventionTips":["Quote regex flags in shell/JSON launch configs.","Stick to simple anchored RE2 patterns.","Lint launch flags in CI to catch invalid regexes before deploy.","Test the collector locally with the same flags before host rollout."],"tags":["linux","diskstats","regex","cli-flag"],"backgroundTag":"invalid-regex-pattern","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"}