/*
*
@author: sre
@date: 2024/3/1 0001
@desc: todo
*
*/
package main
import (
"fmt"
"io"
"net/http"
"strconv"
"strings"
"time"
)
// 获取 node_exporter 中的磁盘 IO 指标
func getDiskIOMetrics(url string) (map[string]float64, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
metrics := make(map[string]float64)
lines := strings.Split(string(body), "\n")
//fmt.Println(lines)
for _, line := range lines {
if strings.HasPrefix(line, "node_disk_reads_completed_total") ||
strings.HasPrefix(line, "node_disk_writes_completed_total") {
parts := strings.Split(line, " ")
if len(parts) < 2 {
continue
}
metricName := parts[0]
value, err := strconv.ParseFloat(parts[1], 64)
if err != nil {
continue
}
metrics[metricName] = value
}
}
return metrics, nil
}
// 计算磁盘 IO 速率
func calculateDiskIORate(initialMetrics, finalMetrics map[string]float64, duration time.Duration) map[string]float64 {
rates := make(map[string]float64)
for metricName, initialValue := range initialMetrics {
finalValue, ok := finalMetrics[metricName]
if !ok {
continue
}
rate := (finalValue - initialValue) / duration.Seconds()
rates[metricName] = rate
}
return rates
}
func main() {
// 假设 node_exporter 运行在 localhost:9100 上
nodeExporterURL := "http://localhost:9100/metrics"
// 获取初始的磁盘 IO 指标
initialMetrics, err := getDiskIOMetrics(nodeExporterURL)
if err != nil {
fmt.Println("Error fetching initial metrics:", err)
return
}
// 等待一段时间以便计算速率
time.Sleep(10 * time.Second)
// 获取最终的磁盘 IO 指标
finalMetrics, err := getDiskIOMetrics(nodeExporterURL)
if err != nil {
fmt.Println("Error fetching final metrics:", err)
return
}
// 计算 IO 速率
rates := calculateDiskIORate(initialMetrics, finalMetrics, 10*time.Second)
// 打印结果
for metricName, rate := range rates {
fmt.Printf("%s rate: %.2f/s\n", metricName, rate)
}
}