Files
monitor/backend/internal/collector/snmp.go
2025-12-02 23:20:10 +08:00

90 lines
2.2 KiB
Go

package collector
import (
"github.com/gosnmp/gosnmp"
)
// SNMPCollector SNMP采集器
type SNMPCollector struct {
client *gosnmp.GoSNMP
}
// NewSNMPCollector 创建新的SNMP采集器
func NewSNMPCollector(target, community string, version gosnmp.SnmpVersion) (*SNMPCollector, error) {
client := &gosnmp.GoSNMP{
Target: target,
Community: community,
Version: version,
Port: 161,
}
// 连接SNMP设备
if err := client.Connect(); err != nil {
return nil, err
}
return &SNMPCollector{
client: client,
}, nil
}
// Close 关闭SNMP连接
func (c *SNMPCollector) Close() error {
return c.client.Conn.Close()
}
// GetCPUUsage 获取CPU使用率
func (c *SNMPCollector) GetCPUUsage() (float64, error) {
// 这里使用UCD-SNMP-MIB::ssCpuIdle.0 OID来获取CPU空闲率
// 实际使用时需要根据设备类型和SNMP MIB进行调整
oids := []string{"1.3.6.1.4.1.2021.11.11.0"}
result, err := c.client.Get(oids)
if err != nil {
return 0, err
}
// CPU使用率 = 100 - 空闲率
idle := float64(result.Variables[0].Value.(uint))
return 100 - idle, nil
}
// GetMemoryUsage 获取内存使用率
func (c *SNMPCollector) GetMemoryUsage() (float64, error) {
// 这里使用UCD-SNMP-MIB::memTotalReal.0和memAvailReal.0 OID来获取内存使用情况
oids := []string{
"1.3.6.1.4.1.2021.4.5.0", // 总内存
"1.3.6.1.4.1.2021.4.6.0", // 可用内存
}
result, err := c.client.Get(oids)
if err != nil {
return 0, err
}
total := float64(result.Variables[0].Value.(uint))
available := float64(result.Variables[1].Value.(uint))
return ((total - available) / total) * 100, nil
}
// GetDiskUsage 获取磁盘使用率
func (c *SNMPCollector) GetDiskUsage(partition string) (float64, error) {
// 这里使用UCD-SNMP-MIB::dskTotal和dskAvail OID来获取磁盘使用情况
// 实际使用时需要根据分区索引进行调整
oids := []string{
"1.3.6.1.4.1.2021.9.1.6.1", // 总磁盘空间
"1.3.6.1.4.1.2021.9.1.7.1", // 可用磁盘空间
}
result, err := c.client.Get(oids)
if err != nil {
return 0, err
}
total := float64(result.Variables[0].Value.(uint))
available := float64(result.Variables[1].Value.(uint))
return ((total - available) / total) * 100, nil
}