diff --git a/cpu.go b/cpu.go index a54cc46..b9abf2b 100644 --- a/cpu.go +++ b/cpu.go @@ -21,7 +21,8 @@ func getCPUInfo(ip, port string) (int, float64, error) { // 解析metrics数据 lines := strings.Split(data, "\n") for _, line := range lines { - if strings.HasPrefix(line, "node_cpu_seconds_total") { + //有两个版本的Metrics node_cpu_seconds_total and node_cpu + if strings.HasPrefix(line, "node_cpu{cpu=") || strings.HasPrefix(line, "node_cpu_seconds_total") { fields := strings.Fields(line) if len(fields) == 2 { cpuData, err := extractMetricValue(fields[1]) @@ -37,5 +38,5 @@ func getCPUInfo(ip, port string) (int, float64, error) { } } } - return cpuCount, 100 * (1 - cpuIdle/cpuTotal), nil + return cpuCount, (1 - cpuIdle/cpuTotal), nil } diff --git a/csv.go b/csv.go index fa905cf..a56c001 100644 --- a/csv.go +++ b/csv.go @@ -14,16 +14,16 @@ import ( // Monitor for output type Monitor struct { - IP string `csv:"ip"` - Port string `csv:"port"` - CPUCore int `csv:"cpu_core"` - CPUUsage float64 `csv:"cpu_usage"` - MemTotal float64 `csv:"mem_total"` - MemAvailable float64 `csv:"mem_available"` - NodeLoad1 float64 `csv:"node_load1"` - NodeLoad5 float64 `csv:"node_load5"` - NodeLoad15 float64 `csv:"node_load15"` - ERROR string `csv:"error"` + IP string `csv:"ip"` + Port string `csv:"port"` + CPUCore int `csv:"cpu_core"` + CPUUsage float64 `csv:"cpu_usage"` + MemTotal float64 `csv:"mem_total"` + MemUsage float64 `csv:"mem_usage"` + NodeLoad1 float64 `csv:"node_load1"` + NodeLoad5 float64 `csv:"node_load5"` + NodeLoad15 float64 `csv:"node_load15"` + ERROR string `csv:"error"` } // Host for input diff --git a/csv_test.go b/csv_test.go index 847c1d7..4559060 100644 --- a/csv_test.go +++ b/csv_test.go @@ -28,3 +28,28 @@ func TestStrclean(t *testing.T) { fmt.Println(strClean(s1)) } + +//free +//total used free shared buffers cached +//Mem: 8061204 7876624 184580 708 151620 4761748 +//-/+ buffers/cache: 2963256 5097948 +//Swap: 8388604 147000 8241604 + +func TestMemCounts(t *testing.T) { + node_memory_MemFree_bytes := "1.94097152e+08" + node_memory_MemTotal_bytes := "8.254672896e+09" + node_memory_Buffers_bytes := "1.5525888e+08" + node_memory_Cached_bytes := "4.873633792e+09" + free, _ := extractMetricValue(node_memory_MemFree_bytes) + total, _ := extractMetricValue(node_memory_MemTotal_bytes) + buffers, _ := extractMetricValue(node_memory_Buffers_bytes) + cached, _ := extractMetricValue(node_memory_Cached_bytes) + fmt.Println(total) + fmt.Println(free + cached - buffers) + fmt.Println(free + cached + buffers) + // + //fmt.Println(extractMetricValue(node_memory_MemFree_bytes)) + //fmt.Println(extractMetricValue(node_memory_MemTotal_bytes)) + //fmt.Println(extractMetricValue(node_memory_Buffers_bytes)) + //fmt.Println(extractMetricValue(node_memory_Cached_bytes)) +} diff --git a/main.go b/main.go index 05f4967..61d0157 100644 --- a/main.go +++ b/main.go @@ -38,7 +38,7 @@ func main() { continue } cpuCore, cpuUsage, err1 := getCPUInfo(serverIP, host.Port) - memTotal, memAvailable, err2 := getMemoryInfo(serverIP, host.Port) + memTotal, memUsage, err2 := getMemoryInfo(serverIP, host.Port) nodeLoad1, nodeLoad5, nodeLoad15, err3 := getLoadInfo(serverIP, host.Port) if err1 != nil || err2 != nil || err3 != nil { fmt.Println("host error: ", err) @@ -46,16 +46,16 @@ func main() { } monitors = append(monitors, &Monitor{ - IP: serverIP, - Port: host.Port, - CPUCore: cpuCore, - CPUUsage: cpuUsage, - MemTotal: memTotal, - MemAvailable: memAvailable, - NodeLoad1: nodeLoad1, - NodeLoad5: nodeLoad5, - NodeLoad15: nodeLoad15, - ERROR: errorflag, + IP: serverIP, + Port: host.Port, + CPUCore: cpuCore, + CPUUsage: cpuUsage, + MemTotal: memTotal, + MemUsage: memUsage, + NodeLoad1: nodeLoad1, + NodeLoad5: nodeLoad5, + NodeLoad15: nodeLoad15, + ERROR: errorflag, }) count += 1 log.Println(count, "/", totalHosts, " handled: ", serverIP) diff --git a/mem.go b/mem.go index 2df25b2..16ca52d 100644 --- a/mem.go +++ b/mem.go @@ -11,9 +11,10 @@ import ( "strings" ) -// getMemoryInfo 返回总内存 可用内存 +// getMemoryInfo 返回总内存 内存使用率 func getMemoryInfo(ip, port string) (float64, float64, error) { var memTotal, memAvailable float64 + var memFree, memCached, memBuffrs float64 data, err := getMetrics(ip, port) if err != nil { return 0, 0, err @@ -21,8 +22,8 @@ func getMemoryInfo(ip, port string) (float64, float64, error) { // 解析metrics数据 lines := strings.Split(data, "\n") for _, line := range lines { - //memTotal - if strings.HasPrefix(line, "node_memory_MemTotal_bytes ") { + //memTotal 两个版本 node_memory_MemTotal node_memory_MemTotal_bytes + if strings.HasPrefix(line, "node_memory_MemTotal_bytes ") || strings.HasPrefix(line, "node_memory_MemTotal ") { fields := strings.Fields(line) if len(fields) == 2 { memTotal, err = extractMetricValue(fields[1]) @@ -32,8 +33,8 @@ func getMemoryInfo(ip, port string) (float64, float64, error) { } } - //memAvailable - if strings.HasPrefix(line, "node_memory_MemAvailable_bytes ") { + //memAvailable node_memory_MemAvailable node_memory_MemAvailable_bytes + if strings.HasPrefix(line, "node_memory_MemAvailable_bytes ") || strings.HasPrefix(line, "node_memory_MemAvailable ") { fields := strings.Fields(line) if len(fields) == 2 { memAvailable, err = extractMetricValue(fields[1]) @@ -41,11 +42,42 @@ func getMemoryInfo(ip, port string) (float64, float64, error) { return 0, 0, err } } - + } else { + //下面是另外一个版本的情况 没有可用内存数据 需要用原始定义来算 + fields := strings.Fields(line) + switch { + case strings.HasPrefix(line, "node_memory_MemFree_bytes ") || strings.HasPrefix(line, "node_memory_MemFree "): + if len(fields) == 2 { + memFree, err = extractMetricValue(fields[1]) + if err != nil { + return 0, 0, err + } + } + case strings.HasPrefix(line, "node_memory_Buffers_bytes ") || strings.HasPrefix(line, "node_memory_Buffers "): + if len(fields) == 2 { + memCached, err = extractMetricValue(fields[1]) + if err != nil { + return 0, 0, err + } + } + case strings.HasPrefix(line, "node_memory_Cached_bytes ") || strings.HasPrefix(line, "node_memory_Cached "): + if len(fields) == 2 { + memBuffrs, err = extractMetricValue(fields[1]) + if err != nil { + return 0, 0, err + } + } + } } - } - return memTotal, memAvailable, nil + //第二种情况下的输出 + if (memFree + memCached + memBuffrs) > 0 { + used := memTotal - memFree - memCached - memBuffrs + return memTotal, used / memTotal, nil + } + + //第一种情况 + return memTotal, (memTotal - memAvailable) / memTotal, nil } //// 解析Node Exporter的响应内容,提取内存使用率指标 diff --git a/readme.md b/readme.md index cc900be..d1d6dd5 100644 --- a/readme.md +++ b/readme.md @@ -8,9 +8,4 @@ SET GOARCH=amd64 go build ``` -```cmd -SET CGO_ENABLED=0 -SET GOOS=linux -SET GOARCH=arm64 -go build -``` \ No newline at end of file + \ No newline at end of file