{"record":{"id":"38ee42751e3731b2","repo":"prometheus/node_exporter","slug":"couldn-t-get-numa-meminfo-w","errorCode":null,"errorMessage":"couldn't get NUMA meminfo: %w","messagePattern":"couldn't get NUMA meminfo: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"collector/meminfo_numa_linux.go","lineNumber":65,"sourceCode":"\tlogger      *slog.Logger\n}\n\nfunc init() {\n\tregisterCollector(\"meminfo_numa\", defaultDisabled, NewMeminfoNumaCollector)\n}\n\n// NewMeminfoNumaCollector returns a new Collector exposing memory stats.\nfunc NewMeminfoNumaCollector(logger *slog.Logger) (Collector, error) {\n\treturn &meminfoNumaCollector{\n\t\tmetricDescs: map[string]*prometheus.Desc{},\n\t\tlogger:      logger,\n\t}, nil\n}\n\nfunc (c *meminfoNumaCollector) Update(ch chan<- prometheus.Metric) error {\n\tmetrics, err := getMemInfoNuma()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"couldn't get NUMA meminfo: %w\", err)\n\t}\n\tfor _, v := range metrics {\n\t\tdesc, ok := c.metricDescs[v.metricName]\n\t\tif !ok {\n\t\t\tdesc = prometheus.NewDesc(\n\t\t\t\tprometheus.BuildFQName(namespace, memInfoNumaSubsystem, v.metricName),\n\t\t\t\tfmt.Sprintf(\"Memory information field %s.\", v.metricName),\n\t\t\t\t[]string{\"node\"}, nil)\n\t\t\tc.metricDescs[v.metricName] = desc\n\t\t}\n\t\tch <- prometheus.MustNewConstMetric(desc, v.metricType, v.value, v.numaNode)\n\t}\n\treturn nil\n}\n\nfunc getMemInfoNuma() ([]meminfoMetric, error) {\n\tvar (\n\t\tmetrics []meminfoMetric","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/meminfo_numa_linux.go#L47-L83","documentation":"The meminfo_numa collector's Update wraps any failure from getMemInfoNuma in this error. getMemInfoNuma walks /sys/devices/system/node/node*/ and reads each node's meminfo and numastat files; a failure anywhere in that walk (glob error, file open error, parse error, regexp mismatch) aborts the whole NUMA collection for that scrape. It is the collector-level wrapper, so the root cause is always in the wrapped inner error.","triggerScenarios":"Update -> getMemInfoNuma fails because filepath.Glob on sys/devices/system/node/node[0-9]* errored, a node's meminfo or numastat file could not be opened or parsed, or a node path did not match meminfoNodeRE.","commonSituations":"Non-NUMA or unusual kernels where /sys/devices/system/node is absent or nodes are exposed with unexpected naming; read-restricted /sys mounts in containers; corrupted or truncated sysfs files during hotplug events (CPU/memory hotplug changing node topology mid-scrape).","solutions":["Inspect the wrapped inner error in the log to find the specific failing file/node, then verify that node's meminfo/numastat files are readable (`cat /sys/devices/system/node/node0/meminfo`)","Confirm NUMA topology is valid: check /sys/devices/system/node exists and node paths match node[0-9]+ after hotplug events","Fix /sys read permissions or mount /sys read-only into containers: -v /sys:/host/sys:ro and set --path.sysfs=/host/sys","If the host has no NUMA support, leave this collector disabled (it is disabled by default; enable only with --collector.meminfo_numa)"],"exampleFix":"// before (container start)\ndocker run --rm my-node-exporter --collector.meminfo_numa\n// after\ndocker run --rm -v /sys:/host/sys:ro my-node-exporter --collector.meminfo_numa --path.sysfs=/host/sys","handlingStrategy":"validation","validationCode":"const sysPath = \"/sys/devices/system/node\"\nnodes, err := filepath.Glob(filepath.Join(sysPath, \"node[0-9]*\"))\nif err != nil || len(nodes) == 0 {\n    log.Printf(\"NUMA sysfs unavailable at %s; leave collector.meminfo_numa disabled\", sysPath)\n}","typeGuard":null,"tryCatchPattern":"// Only enable the NUMA collector when the topology is present:\nif _, err := os.Stat(\"/sys/devices/system/node\"); err == nil {\n    if err := registry.Register(collector); err != nil {\n        log.Printf(\"numa collector registration failed: %v\", err)\n    }\n}","preventionTips":["Mount /sys read-only into containers before enabling meminfo_numa","Remember meminfo_numa is disabled by default — only enable it on hosts with NUMA topology","Re-check node topology after CPU/memory hotplug events"],"tags":["linux","numa","sysfs","scrape"],"backgroundTag":"file-read-failed","analyzedSha":"17ddd77c59ba27e1508e9f7894b1e55b44d6aed3","analyzedAt":"2026-09-07T17:54:06.211Z","contentChangedAt":"2026-09-07T17:54:06.211Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}