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