prometheus/node_exporter · error
couldn't get softirqs
Error message
couldn't get softirqs: %w
What it means
Update failed because procfs could not read or parse the softirqs data (from /proc/softirqs via fs.Softirqs()). A missing or malformed /proc/softirqs makes the whole softirqs scrape fail for the cycle.
Solutions
- Verify /proc/softirqs exists and is readable: `cat /proc/softirqs`.
- Ensure the kernel exposes the expected format; very old kernels may lack fields procfs expects — upgrade kernel or procfs.
- Retry the scrape; transient failures resolve on the next cycle.
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at collector/softirqs_linux.go:32 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of prometheus/node_exporter@17ddd77c59 (2026-09-07).
Data as JSON: /api/errors/3721052213533225.
Report an issue: GitHub.
Appendix: source
Thrown at collector/softirqs_linux.go:32
//go:build !nosoftirqs
package collector
import (
"fmt"
"strconv"
"github.com/prometheus/client_golang/prometheus"
)
var (
softirqLabelNames = []string{"cpu", "type"}
)
func (c *softirqsCollector) Update(ch chan<- prometheus.Metric) (err error) {
softirqs, err := c.fs.Softirqs()
if err != nil {
return fmt.Errorf("couldn't get softirqs: %w", err)
}
for cpuNo, value := range softirqs.Hi {
ch <- c.desc.mustNewConstMetric(float64(value), strconv.Itoa(cpuNo), "HI")
}
for cpuNo, value := range softirqs.Timer {
ch <- c.desc.mustNewConstMetric(float64(value), strconv.Itoa(cpuNo), "TIMER")
}
for cpuNo, value := range softirqs.NetTx {
ch <- c.desc.mustNewConstMetric(float64(value), strconv.Itoa(cpuNo), "NET_TX")
}
for cpuNo, value := range softirqs.NetRx {
ch <- c.desc.mustNewConstMetric(float64(value), strconv.Itoa(cpuNo), "NET_RX")
}
for cpuNo, value := range softirqs.Block {
ch <- c.desc.mustNewConstMetric(float64(value), strconv.Itoa(cpuNo), "BLOCK")
}
for cpuNo, value := range softirqs.IRQPoll {View on GitHub (pinned to 17ddd77c59)