以下是一个使用 golang 绘制 CPU 使用率折线图的示例代码:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
"github.com/wcharczuk/go-chart"
)
func main() {
chartValues := make([]float64, 0)
chartTimes := make([]time.Time, 0)
for i := 0; i < 60; i++ {
cpuUsage, err := getCpuUsage()
if err != nil {
fmt.Printf("Failed to get CPU usage: %v\n", err)
break
}
chartValues = append(chartValues, cpuUsage)
chartTimes = append(chartTimes, time.Now())
time.Sleep(time.Second)
}
graph := chart.Chart{
Series: []chart.Series{
chart.TimeSeries{
Name: "CPU Usage",
XValues: chartTimes,
YValues: chartValues,
},
},
}
f, _ := os.Create("cpu_usage.png")
defer f.Close()
graph.Render(chart.PNG, f)
}
func getCpuUsage() (float64, error) {
file, err := os.Open("/proc/stat")
if err != nil {
return 0, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Scan()
fields := strings.Fields(scanner.Text())[1:]
var total, idle uint64
for _, field := range fields {
val, err := strconv.ParseUint(field, 10, 64)
if err != nil {
return 0, err
}
total += val
if field == fields[3] {
idle = val
}
}
idleDelta := float64(idle - prevIdle)
totalDelta := float64(total - prevTotal)
prevIdle = idle
prevTotal = total
return 100 * (totalDelta - idleDelta) / totalDelta, nil
}
var prevIdle, prevTotal uint64
该程序会每秒钟获取一次 CPU 使用率,并将其绘制成折线图。它使用 /proc/stat 文件获取系统的 CPU 统计信息,然后根据公式 (totalDelta - idleDelta) / totalDelta 计算 CPU 使用率。最后,使用 go-chart 库将数据绘制成折线图并保存为 PNG 格式的文件。




