{"record":{"id":"7587f817bbd3d7fb","repo":"prometheus/node_exporter","slug":"failed-to-parse-device-filter-flags-w-7587f8","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.go","lineNumber":54,"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":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/diskstats_openbsd.go#L36-L72","documentation":"On OpenBSD, NewDiskstatsCollector compiles the device include/exclude flag regexes through newDiskstatsDeviceFilter(logger) before constructing the collector. Invalid regex flags cause construction to fail with \"failed to parse device filter flags: %w\".","triggerScenarios":"node_exporter startup on OpenBSD with --collector.diskstats.device-exclude (or include) set to a value regexp.Compile rejects; identical for direct NewDiskstatsCollector calls.","commonSituations":"Shell-mangled unquoted patterns (glob expansion of ? and *), unbalanced brackets/parens, or regexes borrowed from non-Go syntax dialects.","solutions":["Read the wrapped regexp error (%w) to find the bad token and correct the flag value.","Quote the flag value in the shell to protect [ ] ( ) * characters.","Test the pattern in a Go regex validator before deployment.","Run without the filter flag to verify the collector constructs, then add back a valid pattern."],"exampleFix":"// before\n--collector.diskstats.device-exclude=sd[!0-9]\n// after (Go RE2 lacks [!...]; use negated class)\n--collector.diskstats.device-exclude='sd[^0-9]'","handlingStrategy":"validation","validationCode":"if _, err := regexp.Compile(deviceFilterFlag); err != nil {\n    // invalid --collector.diskstats.device-* value; fix before start\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(\"invalid device filter regex: %v\", err)\n    }\n    log.Fatalf(\"diskstats init failed: %v\", err)\n}","preventionTips":["Quote regex flag values on OpenBSD shells (ksh) to avoid expansion.","Use RE2-compatible syntax only.","Validate flags in provisioning scripts before start.","Start simple: exclude patterns like '^(cd\\d+)$' are easy to verify."],"tags":["openbsd","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"}