prometheus/node_exporter · error

couldn't get udp6 queued bytes

Error message

couldn't get udp6 queued bytes: %w

What it means

The IPv6 counterpart of the udp queues read: fs.NetUDP6Summary() errors that are not os.ErrNotExist become 'couldn't get udp6 queued bytes: %w'. If BOTH v4 and v6 files are missing (ErrNotExist), the collector returns ErrNoData so the scrape is skipped rather than failing — this error only fires for genuine v6 read/parse problems.

Solutions

  1. Verify /proc/net/udp6 exists and is readable.
  2. Check the wrapped error to see if it is a parse or permission failure.
  3. Disable IPv6 collection (or the udp_queues collector) if the host has no usable udp6 support.
  4. File an upstream procfs issue if the kernel's udp6 format differs from the parser.
Defensive patterns

Strategy: try-catch

Validate before calling

if _, err := os.Stat("/proc/net/udp6"); errors.Is(err, os.ErrNotExist) {
    // no ipv6 udp support; expect ErrNoData skips instead of metrics
}

Try / catch

if err := c.Update(ch); err != nil {
    if errors.Is(err, ErrNoData) { return }
    if strings.Contains(err.Error(), "couldn't get udp6 queued bytes") {
        logger.Warn("udp v6 queue metrics unavailable", "err", err)
        return
    }
    return err
}

Prevention

When it happens

Trigger: udpQueuesCollector.Update when NetUDP6Summary() returns a non-ErrNotExist error while reading /proc/net/udp6 — parse failures or permission errors on hosts with IPv6 enabled.

Common situations: Kernels/configs exposing a malformed or partially readable /proc/net/udp6, security modules blocking the read, and parser mismatches after kernel upgrades.

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/a9450c3f25233ca1. Report an issue: GitHub.

Appendix: source

Thrown at collector/udp_queues_linux.go:79

		ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s4.TxQueueLength), "tx", "v4")
		ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s4.RxQueueLength), "rx", "v4")
	} else {
		if errors.Is(errIPv4, os.ErrNotExist) {
			c.logger.Debug("not collecting ipv4 based metrics")
		} else {
			return fmt.Errorf("couldn't get udp queued bytes: %w", errIPv4)
		}
	}

	s6, errIPv6 := c.fs.NetUDP6Summary()
	if errIPv6 == nil {
		ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s6.TxQueueLength), "tx", "v6")
		ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s6.RxQueueLength), "rx", "v6")
	} else {
		if errors.Is(errIPv6, os.ErrNotExist) {
			c.logger.Debug("not collecting ipv6 based metrics")
		} else {
			return fmt.Errorf("couldn't get udp6 queued bytes: %w", errIPv6)
		}
	}

	if errors.Is(errIPv4, os.ErrNotExist) && errors.Is(errIPv6, os.ErrNotExist) {
		return ErrNoData
	}
	return nil
}

View on GitHub (pinned to 17ddd77c59)