|
|
/*
|
|
|
*
|
|
|
@author: sre
|
|
|
@date: 2023/11/19 0019
|
|
|
@desc: todo
|
|
|
*
|
|
|
*/
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
// 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
|
|
|
}
|
|
|
// 解析metrics数据
|
|
|
lines := strings.Split(data, "\n")
|
|
|
for _, line := range lines {
|
|
|
//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])
|
|
|
if err != nil {
|
|
|
return 0, 0, err
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
//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])
|
|
|
if err != nil {
|
|
|
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
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
//第二种情况下的输出
|
|
|
if (memFree + memCached + memBuffrs) > 0 {
|
|
|
used := memTotal - memFree - memCached - memBuffrs
|
|
|
return memTotal, used / memTotal, nil
|
|
|
}
|
|
|
|
|
|
//第一种情况
|
|
|
return memTotal, (memTotal - memAvailable) / memTotal, nil
|
|
|
}
|
|
|
|
|
|
//// 解析Node Exporter的响应内容,提取内存使用率指标
|
|
|
//func parseMemoryUsage(response string) float64 {
|
|
|
// // 在响应中找到相关的指标行,例如 "node_memory_MemTotal: 167772160000 149510252888 149510252888"
|
|
|
// lines := strings.Split(response, "\n")
|
|
|
// for _, line := range lines {
|
|
|
// if strings.Contains(line, "node_memory_MemTotal") {
|
|
|
// fields := strings.Fields(line)
|
|
|
// if len(fields) >= 4 {
|
|
|
// // 从指标行中提取内存使用率指标,并将其转换为百分比形式
|
|
|
// memoryUsage := strings.TrimSuffix(fields[2], " ") + "%"
|
|
|
// return getPercentage(memoryUsage)
|
|
|
// }
|
|
|
// }
|
|
|
// }
|
|
|
//
|
|
|
// // 如果找不到相关的指标行,则返回0%
|
|
|
// return 0.0
|
|
|
//}
|
|
|
//
|
|
|
//// 从字符串中提取百分比值,并将其转换为浮点数形式
|
|
|
//func getPercentage(percentage string) float64 {
|
|
|
// // 去掉百分号,并将其转换为浮点数形式
|
|
|
// percentage = strings.ReplaceAll(percentage, "%", "")
|
|
|
// return parseFloat(percentage) * (100.0 / 100) // 将字符串转换为浮点数,并乘以100转换为百分比形式
|
|
|
//}
|