prometheus/node_exporter · error
error obtaining sysctl info
Error message
error obtaining sysctl info: %w
What it means
newMetrics reads a numeric sysctl via c.fs.SysctlInts(s.name); any procfs read failure (missing file, permission, parse error) is wrapped as 'error obtaining sysctl info'. It is returned per-sysctl and surfaces in Update's error output, skipping that sysctl's metrics.
Solutions
- Verify the sysctl exists: `sysctl <name>` or `cat /proc/sys/<path>`
- Remove/adjust the include filter entry for sysctls absent on this kernel
- Run the exporter with permission to read the file (or relax the file's perms)
- Check procfs can parse it; if not, extend prometheus/procfs upstream
Example fix
// before --collector.sysctl.include='vm.fake_stat' // after --collector.sysctl.include='vm.stat'
Defensive patterns
Strategy: validation
Validate before calling
if _, err := os.Stat(filepath.Join("/proc/sys", strings.ReplaceAll(name, ".", "/"))); err != nil { /* skip this sysctl */ } Try / catch
if err := coll.Update(ch); err != nil {
if strings.Contains(err.Error(), "error obtaining sysctl info") {
logger.Warn("sysctl unavailable on this kernel", "err", err)
}
} Prevention
- Generate the include list from the actual host: `sysctl -a | cut -d' ' -f1`
- Re-verify include lists after kernel upgrades
- Keep prometheus/procfs up to date
When it happens
Trigger: A configured --collector.sysctl --collector.sysctl.include=<name> references a sysctl that does not exist on this kernel, or exists but cannot be read as integers by procfs (permissions, or value not parseable as []int).
Common situations: Include list copied from another kernel version where the sysctl was renamed/removed; hardened kernels restricting /proc/sys reads to root; sysctl whose content procfs cannot parse.
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
- failed to open procfs
- failed to open procfs
- failed to open procfs
- failed to open procfs
- unable to retrieve limit number of threads
AI-assisted analysis of prometheus/node_exporter@17ddd77c59 (2026-09-07).
Data as JSON: /api/errors/8af68fbdfd26ce1a.
Report an issue: GitHub.
Appendix: source
Thrown at collector/sysctl_linux.go:97
for _, metric := range metrics {
ch <- metric
}
}
return nil
}
func (c *sysctlCollector) newMetrics(s *sysctl) ([]prometheus.Metric, error) {
var (
values any
length int
err error
)
if s.numeric {
values, err = c.fs.SysctlInts(s.name)
if err != nil {
return nil, fmt.Errorf("error obtaining sysctl info: %w", err)
}
length = len(values.([]int))
} else {
values, err = c.fs.SysctlStrings(s.name)
if err != nil {
return nil, fmt.Errorf("error obtaining sysctl info: %w", err)
}
length = len(values.([]string))
}
switch length {
case 0:
return nil, fmt.Errorf("sysctl %s has no values", s.name)
case 1:
if len(s.keys) > 0 {
return nil, fmt.Errorf("sysctl %s has only one value, but expected %v", s.name, s.keys)
}
return []prometheus.Metric{s.newConstMetric(values)}, nilView on GitHub (pinned to 17ddd77c59)