Files
aiops/agent/collector/fd.go
T
Logan.Li e0d652d211 feat: 完善堡垒机与 Agent 智能运维能力
- 支持 Windows Agent 构建、安装脚本和统一上报协议

- 增强 RDP 剪贴板、虚拟盘和文件传输能力

- 新增 AIOps 上下文工具、告警 RCA trace 落库和回放接口

- 重构 docs 模块文档并补充终端、堡垒机、监控、AI Agent 设计
2026-07-05 23:49:36 +08:00

52 lines
1.2 KiB
Go

//go:build !windows
// 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
}