{"record":{"id":"a06d426c9bbdbc09","repo":"prometheus/node_exporter","slug":"failed-to-open-procfs-w-a06d42","errorCode":null,"errorMessage":"failed to open procfs: %w","messagePattern":"failed to open procfs: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"collector/sockstat_linux.go","lineNumber":51,"sourceCode":"var pageSize = os.Getpagesize()\n\ntype sockStatCollector struct {\n\tlogger *slog.Logger\n}\n\nfunc init() {\n\tregisterCollector(sockStatSubsystem, defaultEnabled, NewSockStatCollector)\n}\n\n// NewSockStatCollector returns a new Collector exposing socket stats.\nfunc NewSockStatCollector(logger *slog.Logger) (Collector, error) {\n\treturn &sockStatCollector{logger}, nil\n}\n\nfunc (c *sockStatCollector) Update(ch chan<- prometheus.Metric) error {\n\tfs, err := procfs.NewFS(*procPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to open procfs: %w\", err)\n\t}\n\n\t// If IPv4 and/or IPv6 are disabled on this kernel, handle it gracefully.\n\tstat4, err := fs.NetSockstat()\n\tswitch {\n\tcase err == nil:\n\tcase errors.Is(err, os.ErrNotExist):\n\t\tc.logger.Debug(\"IPv4 sockstat statistics not found, skipping\")\n\tdefault:\n\t\treturn fmt.Errorf(\"failed to get IPv4 sockstat data: %w\", err)\n\t}\n\n\tstat6, err := fs.NetSockstat6()\n\tswitch {\n\tcase err == nil:\n\tcase errors.Is(err, os.ErrNotExist):\n\t\tc.logger.Debug(\"IPv6 sockstat statistics not found, skipping\")\n\tdefault:","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/prometheus/node_exporter/blob/17ddd77c59ba27e1508e9f7894b1e55b44d6aed3/collector/sockstat_linux.go#L33-L69","documentation":"sockstatCollector.Update wraps errors from procfs.NewFS(*procPath) with 'failed to open procfs'. Unlike most collectors, this one constructs the procfs handle on every scrape, so a bad proc path makes every scrape of node_sockstat metrics fail.","triggerScenarios":"During Update, --path.procfs points to a nonexistent or invalid directory; every scrape of the sockstat collector returns this error.","commonSituations":"/proc not mounted in containers; --path.procfs misconfigured for chroot/isolated environments; proc mount disappearing at runtime.","solutions":["Correct --path.procfs to a mounted procfs (default /proc)","Mount /proc in the container","Confirm the default path works by running with --path.procfs=/proc"],"exampleFix":"// before\nnode_exporter --path.procfs=/nonexistent/proc\n// after\nnode_exporter --path.procfs=/proc","handlingStrategy":"validation","validationCode":"func ensureProcfs(path string) error {\n\tif _, err := os.Stat(filepath.Join(path, \"net\")); err != nil {\n\t\treturn fmt.Errorf(\"%q is not a mounted procfs: %w\", path, err)\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"if err := collector.Update(ch); err != nil {\n\tif strings.Contains(err.Error(), \"failed to open procfs\") {\n\t\tlogger.Warn(\"sockstat scrape failed: procfs unavailable\", \"err\", err)\n\t} else {\n\t\treturn err\n\t}\n}","preventionTips":["Mount /proc in containers before enabling network-related collectors","Avoid changing --path.procfs at runtime; validate it once at startup","Alert on scrape errors for node_sockstat to catch procfs regressions early"],"tags":["procfs","scrape","linux","sockstat"],"backgroundTag":"file-open-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"}