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