- v0.31: AlertContact 重构(channel_type下拉+webhook_url替代三分立字段) - v0.32: Agent ProcessTop 增强(cmdline/user/cpu_pct/mem_pct) - v0.33: 端口监控 Tab(监听端口自动发现+down联动告警) - v0.34: 健康探针(Agent本地执行HTTP/TCP/Exec→结果随心跳上报) - Agent新增: ContextSwitch/FD/HealthProbe采集器 - 后端新增: health_probe handler + Agent model扩展 - HostMonitor新增Tab: 健康探针/端口监控
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
// 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
|
|
}
|