{"record":{"id":"24717a94e88ec5ae","repo":"prometheus/node_exporter","slug":"failed-to-parse-device-filter-flags-w-24717a","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_openbsd_amd64.go","lineNumber":65,"sourceCode":"\trxfer  typedDesc\n\trbytes typedDesc\n\twxfer  typedDesc\n\twbytes typedDesc\n\ttime   typedDesc\n\n\tdeviceFilter deviceFilter\n\tlogger       *slog.Logger\n}\n\nfunc init() {\n\tregisterCollector(\"diskstats\", defaultEnabled, NewDiskstatsCollector)\n}\n\n// NewDiskstatsCollector returns a new Collector exposing disk device stats.\nfunc NewDiskstatsCollector(logger *slog.Logger) (Collector, error) {\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\treturn &diskstatsCollector{\n\t\trxfer:  typedDesc{readsCompletedDesc, prometheus.CounterValue},\n\t\trbytes: typedDesc{readBytesDesc, prometheus.CounterValue},\n\t\twxfer:  typedDesc{writesCompletedDesc, prometheus.CounterValue},\n\t\twbytes: typedDesc{writtenBytesDesc, prometheus.CounterValue},\n\t\ttime:   typedDesc{ioTimeSecondsDesc, prometheus.CounterValue},\n\n\t\tdeviceFilter: deviceFilter,\n\t\tlogger:       logger,\n\t}, nil\n}\n\nfunc (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) (err error) {\n\tdiskstatsb, err := unix.SysctlRaw(\"hw.diskstats\")\n\tif err != nil {\n\t\treturn err","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/diskstats_openbsd_amd64.go#L47-L83","documentation":"On OpenBSD/amd64 (platform-specific file diskstats_openbsd_amd64.go), NewDiskstatsCollector likewise compiles the device filter regex flags via newDiskstatsDeviceFilter(logger). A regexp.Compile failure in the flags aborts construction with \"failed to parse device filter flags: %w\".","triggerScenarios":"node_exporter startup on OpenBSD amd64 with a device include/exclude flag value that fails regexp.Compile; same for direct invocation of this NewDiskstatsCollector variant.","commonSituations":"Unquoted regex values altered by the shell, typos creating invalid syntax (e.g. missing closing bracket), or patterns using syntax unsupported by Go's RE2 engine.","solutions":["Inspect the wrapped regexp error (%w) for the exact position of the syntax error and fix the flag value.","Quote the pattern on the command line: --collector.diskstats.device-exclude='^(wd|sd)\\d+$'.","Validate with a Go RE2-compatible regex tester before deploying.","Remove the filter flag to confirm the collector otherwise starts, then reintroduce a corrected pattern."],"exampleFix":"// before\n--collector.diskstats.device-exclude=^(wd|sd\\d+$\n// after\n--collector.diskstats.device-exclude='^(wd|sd)\\d+$'","handlingStrategy":"validation","validationCode":"if _, err := regexp.Compile(deviceExcludeFlag); err != nil {\n    // reject before passing to NewDiskstatsCollector\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(\"fix device filter regex: %v\", err)\n    }\n    log.Fatalf(\"diskstats init failed: %v\", err)\n}","preventionTips":["Quote flag values containing regex metacharacters.","Check balanced groups/brackets in every pattern.","Test patterns with a Go RE2 tester before deployment.","Keep platform-specific launch configs in version control with flag linting."],"tags":["openbsd","amd64","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"}