90 lines
2.2 KiB
Go
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
|
|
}
|