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 }