// Package collector 的 FD 句柄采集器。 // 读取 /proc/sys/fs/file-nr 和 /proc/sys/fs/file-max 获取系统级文件句柄使用情况。 // // 署名 Logan.Li package collector import ( "fmt" "os" "ezops/agent/model" ) // FDCollector 系统文件句柄采集器 type FDCollector struct{} // NewFDCollector 创建采集器实例 func NewFDCollector() *FDCollector { return &FDCollector{} } // Collect 读取 /proc/sys/fs/file-nr 和 file-max func (c *FDCollector) Collect() (*model.SocketFDStat, error) { alloc, err := os.ReadFile("/proc/sys/fs/file-nr") if err != nil { return nil, fmt.Errorf("读取 file-nr 失败: %w", err) } var allocated, _unused1, _unused2 int fmt.Sscanf(string(alloc), "%d %d %d", &allocated, &_unused1, &_unused2) max, err := os.ReadFile("/proc/sys/fs/file-max") if err != nil { return nil, fmt.Errorf("读取 file-max 失败: %w", err) } var maxFD int64 fmt.Sscanf(string(max), "%d", &maxFD) stat := &model.SocketFDStat{ Allocated: allocated, Max: maxFD, } if maxFD > 100_000_000 { stat.Max = -1 stat.UsagePct = 0 } else if maxFD > 0 { stat.UsagePct = float64(allocated) / float64(maxFD) * 100.0 } return stat, nil }