prometheus/node_exporter · error
couldn't get ue_noinfo_count for controller
Error message
couldn't get ue_noinfo_count for controller %s: %w
What it means
Final read in the per-controller loop: ue_noinfo_count. A failure from readUintFromFile aborts Update with this wrapped error, meaning the uncorrectable-errors-without-info counter could not be read for the given EDAC memory controller.
Solutions
- Verify the attribute exists and is readable: cat /sys/devices/system/edac/memctlr/mcN/ue_noinfo_count
- Run node_exporter as root or grant read access to EDAC attributes
- Inspect the wrapped cause (%w) for ENOENT/EACCES/parse errors
- If the driver never exposes this counter, disable the edac collector for that host or adapt the collector
Defensive patterns
Strategy: validation
Validate before calling
if _, err := os.ReadFile("/sys/devices/system/edac/memctlr/mc0/ue_noinfo_count"); err != nil {
// final EDAC counter unreadable; expect Update to fail
} Try / catch
if err := c.Update(ch); err != nil {
if strings.Contains(err.Error(), "couldn't get ue_noinfo_count") {
// missing/unreadable attribute; fix access or disable edac collector
}
} Prevention
- Confirm all four EDAC counters are readable by the exporter user before enabling the collector
- Re-run host validation after kernel or EDAC driver upgrades
- Wrap collector construction/scrape in health checks that surface wrapped EDAC read errors early
When it happens
Trigger: readUintFromFile(<controller>/ue_noinfo_count) returns an error: missing attribute, permission denied, or non-numeric content, for any controller matched by the mc[0-9]* glob.
Common situations: EDAC drivers omitting ue_noinfo_count; unprivileged node_exporter in restricted environments; transient sysfs errors while EDAC modules reload.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- couldn't get ce_count for controller
- couldn't get ce_noinfo_count for controller
- couldn't get ue_count for controller
- couldn't get ce_count for controller/csrow
- couldn't get ue_count for controller/csrow
AI-assisted analysis of prometheus/node_exporter@17ddd77c59 (2026-09-07).
Data as JSON: /api/errors/1a82991c29fe0049.
Report an issue: GitHub.
Appendix: source
Thrown at collector/edac_linux.go:135
edacCeCount, prometheus.CounterValue, float64(value), controllerNumber)
value, err = readUintFromFile(filepath.Join(controller, "ce_noinfo_count"))
if err != nil {
return fmt.Errorf("couldn't get ce_noinfo_count for controller %s: %w", controllerNumber, err)
}
ch <- prometheus.MustNewConstMetric(
edacCsRowCECount, prometheus.CounterValue, float64(value), controllerNumber, "unknown")
value, err = readUintFromFile(filepath.Join(controller, "ue_count"))
if err != nil {
return fmt.Errorf("couldn't get ue_count for controller %s: %w", controllerNumber, err)
}
ch <- prometheus.MustNewConstMetric(
edacUeCount, prometheus.CounterValue, float64(value), controllerNumber)
value, err = readUintFromFile(filepath.Join(controller, "ue_noinfo_count"))
if err != nil {
return fmt.Errorf("couldn't get ue_noinfo_count for controller %s: %w", controllerNumber, err)
}
ch <- prometheus.MustNewConstMetric(
edacCsRowUECount, prometheus.CounterValue, float64(value), controllerNumber, "unknown")
// For each controller, walk the csrow directories.
csrows, err := filepath.Glob(controller + "/csrow[0-9]*")
if err != nil {
return err
}
for _, csrow := range csrows {
csrowMatch := edacMemCsrowRE.FindStringSubmatch(csrow)
if csrowMatch == nil {
return fmt.Errorf("csrow string didn't match regexp: %s", csrow)
}
csrowNumber := csrowMatch[1]
value, err = readUintFromFile(filepath.Join(csrow, "ce_count"))
if err != nil {View on GitHub (pinned to 17ddd77c59)