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

  1. Verify the attribute exists and is readable: cat /sys/devices/system/edac/memctlr/mcN/ue_noinfo_count
  2. Run node_exporter as root or grant read access to EDAC attributes
  3. Inspect the wrapped cause (%w) for ENOENT/EACCES/parse errors
  4. 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

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


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)