/*
*
@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)
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code