prometheus/node_exporter · error
getifaddrs() failed
Error message
getifaddrs() failed
What it means
On OpenBSD, getNetDevStats calls the C getifaddrs() via cgo; if it returns -1 the collector cannot enumerate network interfaces and returns this error. It wraps the underlying errno case in a plain error without the errno detail.
Solutions
- Retry collection; getifaddrs failures are often transient (ENOMEM under load).
- Check host memory availability and raise limits if ENOMEM is the cause.
- Ensure the exporter runs with sufficient privileges/sandbox allowances to query the kernel interface list.
- Upgrade node_exporter in case a newer release reports errno for better diagnosis.
Defensive patterns
Strategy: retry
Try / catch
stats, err := getNetDevStats(filter, logger)
if err != nil {
logger.Warn("interface enumeration failed, retrying", "err", err)
time.Sleep(time.Second)
stats, err = getNetDevStats(filter, logger)
} Prevention
- Monitor host memory; ENOMEM is the usual getifaddrs cause.
- Avoid over-restrictive sandboxes around the exporter.
- Retry scrape failures before alerting.
When it happens
Trigger: getNetDevStats on OpenBSD when C.getifaddrs(&ifap) == -1 — typically memory exhaustion (ENOMEM) or a kernel/network stack issue at the moment of the call.
Common situations: Low-memory OpenBSD hosts or restricted environments (e.g., seccomp/pledge-like restrictions or chroot lacking access to kernel interface tables) where getifaddrs cannot allocate the interface list.
Related errors
- getifaddrs() failed
- sysctl CTL_VM VM_UVMEXP failed
- sysctl CTL_VFS VFS_GENERIC VFS_BCACHESTAT failed
- could not retrieve CPU times
- getdevs() failed
AI-assisted analysis of prometheus/node_exporter@17ddd77c59 (2026-09-07).
Data as JSON: /api/errors/65013d71dd7c47cb.
Report an issue: GitHub.
Appendix: source
Thrown at collector/netdev_openbsd.go:36
import (
"errors"
"log/slog"
)
/*
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if.h>
*/
import "C"
func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) {
netDev := netDevStats{}
var ifap, ifa *C.struct_ifaddrs
if C.getifaddrs(&ifap) == -1 {
return nil, errors.New("getifaddrs() failed")
}
defer C.freeifaddrs(ifap)
for ifa = ifap; ifa != nil; ifa = ifa.ifa_next {
if ifa.ifa_addr.sa_family != C.AF_LINK {
continue
}
dev := C.GoString(ifa.ifa_name)
if filter.ignored(dev) {
logger.Debug("Ignoring device", "device", dev)
continue
}
data := (*C.struct_if_data)(ifa.ifa_data)
// https://github.com/openbsd/src/blob/master/sys/net/if.h#L101-L126
netDev[dev] = map[string]uint64{View on GitHub (pinned to 17ddd77c59)