You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
*
@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转换为百分比形式
//}