fix mem info

master
dustoair 2 years ago
parent c2f972220e
commit 60e1291d21

@ -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
}

@ -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

@ -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))
}

@ -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)

@ -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的响应内容提取内存使用率指标

@ -8,9 +8,4 @@ SET GOARCH=amd64
go build
```
```cmd
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=arm64
go build
```
Loading…
Cancel
Save