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

  1. Retry collection; getifaddrs failures are often transient (ENOMEM under load).
  2. Check host memory availability and raise limits if ENOMEM is the cause.
  3. Ensure the exporter runs with sufficient privileges/sandbox allowances to query the kernel interface list.
  4. 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

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


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)