{"record":{"id":"810ac20b48cc5057","repo":"prometheus/node_exporter","slug":"couldn-t-get-ce-count-for-controller-csrow-s-s","errorCode":null,"errorMessage":"couldn't get ce_count for controller/csrow %s/%s: %w","messagePattern":"couldn't get ce_count for controller/csrow (.+?)/(.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"collector/edac_linux.go","lineNumber":154,"sourceCode":"\t\t}\n\t\tch <- prometheus.MustNewConstMetric(\n\t\t\tedacCsRowUECount, prometheus.CounterValue, float64(value), controllerNumber, \"unknown\")\n\n\t\t// For each controller, walk the csrow directories.\n\t\tcsrows, err := filepath.Glob(controller + \"/csrow[0-9]*\")\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, csrow := range csrows {\n\t\t\tcsrowMatch := edacMemCsrowRE.FindStringSubmatch(csrow)\n\t\t\tif csrowMatch == nil {\n\t\t\t\treturn fmt.Errorf(\"csrow string didn't match regexp: %s\", csrow)\n\t\t\t}\n\t\t\tcsrowNumber := csrowMatch[1]\n\n\t\t\tvalue, err = readUintFromFile(filepath.Join(csrow, \"ce_count\"))\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"couldn't get ce_count for controller/csrow %s/%s: %w\", controllerNumber, csrowNumber, err)\n\t\t\t}\n\t\t\tch <- prometheus.MustNewConstMetric(\n\t\t\t\tedacCsRowCECount, prometheus.CounterValue, float64(value), controllerNumber, csrowNumber)\n\n\t\t\tvalue, err = readUintFromFile(filepath.Join(csrow, \"ue_count\"))\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"couldn't get ue_count for controller/csrow %s/%s: %w\", controllerNumber, csrowNumber, err)\n\t\t\t}\n\t\t\tch <- prometheus.MustNewConstMetric(\n\t\t\t\tedacCsRowUECount, prometheus.CounterValue, float64(value), controllerNumber, csrowNumber)\n\n\t\t\tchannelFiles, err := filepath.Glob(csrow + \"/ch*_ce_count\")\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tfor _, chFile := range channelFiles {\n\t\t\t\tmatch := edacMemChannelRE.FindStringSubmatch(filepath.Base(chFile))\n\t\t\t\tif match == nil {","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/edac_linux.go#L136-L172","documentation":"After matching a csrow path, the EDAC collector reads <csrow>/ce_count with readUintFromFile and wraps any failure with this message, naming the controller and csrow numbers. The wrapped error carries the underlying reason (missing file, permission, non-numeric content). A failed read aborts the whole scrape of the EDAC collector.","triggerScenarios":"readUintFromFile(filepath.Join(csrow, \"ce_count\")) fails during Update: file absent, unreadable, or containing a non-integer value.","commonSituations":"Kernel EDAC driver exposing csrow dirs without ce_count (some drivers omit it); restrictive permissions after hardening; proc/sys fs mounted oddly in containers; transient removal of the csrow dir on module unload mid-scrape.","solutions":["Verify the file exists: `cat /sys/devices/system/edac/mc/mc0/csrow0/ce_count`.","Check permissions/ownership of the sysfs csrow directories for the node_exporter user.","Ensure the correct EDAC kernel module is loaded for your memory controller (e.g. amd64_edac, i7core_edac) so all standard attributes are exposed.","Check for mid-scrape module unload races; pin module loading via modprobe config."],"exampleFix":"// before: any read error aborts the collector\nif err != nil {\n\treturn fmt.Errorf(\"couldn't get ce_count for controller/csrow %s/%s: %w\", controllerNumber, csrowNumber, err)\n}\n\n// after (caller-side guard): pre-check the attribute\nif _, err := os.Stat(csrowPath + \"/ce_count\"); os.IsNotExist(err) {\n\t// disable edac collector or expect partial data\n}","handlingStrategy":"try-catch","validationCode":"const fs = require('fs');\nfor (const d of fs.existsSync('/sys/devices/system/edac/mc') ? fs.readdirSync('/sys/devices/system/edac/mc') : []) {\n  for (const c of fs.readdirSync(`/sys/devices/system/edac/mc/${d}`).filter(x => x.startsWith('csrow'))) {\n    const f = `/sys/devices/system/edac/mc/${d}/${c}/ce_count`;\n    if (!fs.existsSync(f) || isNaN(parseInt(fs.readFileSync(f, 'utf8'), 10))) {\n      console.warn(`edac ce_count unreadable: ${f} — disable --collector.edac`);\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  await scrapeNodeExporter();\n} catch (e) {\n  if (String(e).includes('couldn\\'t get ce_count')) {\n    console.warn('EDAC ce_count unreadable; disabling edac collector: --collector.edac=false');\n  } else throw e;\n}","preventionTips":["Pre-check ce_count readability before enabling the edac collector.","Ensure the exporter user can read /sys/devices/system/edac (deploy with read-only host /sys).","Avoid unloading EDAC modules while node_exporter is scraping."],"tags":["linux","edac","sysfs","file-read"],"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"}