实时的 CPU 占用显示
预览
流程
- golang 分析
vmstat 1 -n
- publish 到 redis
- subscribe redis 然后通过 SSE push 到 浏览器
代码
performance.go
go get gopkg.in/redis.v2
package main
import (
"bufio"
"fmt"
"log"
"io"
"os/exec"
"strings"
"strconv"
"gopkg.in/redis.v2"
)
var client *redis.Client
func tail(stream io.Reader) {
scanner := bufio.NewScanner(stream)
scanner.Scan() // 跳过header1
scanner.Scan() // 跳过header2
for scanner.Scan() {
text := scanner.Text()
segments := strings.Fields(text)
if ide, err := strconv.ParseInt(segments[14], 10, 32); err == nil {
used := 100 - ide
log.Println(used)
pub := client.Publish("performance", fmt.Sprintf("%d", used))
if err := pub.Err(); err != nil {
log.Println(err)
}
}
}
if err := scanner.Err(); err != nil {
// ...
}
}
func main () {
client = redis.NewClient(&redis.Options{
Network: "tcp",
Addr: "127.0.0.1:6379",
})
outReader, outWriter := io.Pipe()
cmd := exec.Command("vmstat", "1", "-n")
cmd.Stdout = outWriter
go tail(outReader)
cmd.Run()
}
SSE 部分请自行实现 (提示:github上搜一下),使用nginx进行反向代理。
html部分
SmoothieChart
js/widget/performance/main.js
(function ($, SmoothieChart) {
var chart = new SmoothieChart({
minValue:0,
maxValue:100,
grid:{
fillStyle:'#FFFFFF',
strokeStyle:'#CCCCCC',
sharpLines:true
},
labels: {
fillStyle:'#333333',
}
}),
canvas = document.getElementById('performance-widget'),
series = new TimeSeries();
chart.addTimeSeries(series, {lineWidth:2,strokeStyle:'#009A61',fillStyle:'rgba(0,154,97,.1)'});
chart.streamTo(canvas, 500);
if (!!window.EventSource) {
var source = new EventSource('//your/sse/sever/and/path');
source.addEventListener('performance', function (e) {
series.append(+new Date(), +e.data);
}, false);
}
})(jQuery, SmoothieChart);
PS: Chrome的开发工具暂时无法看到浏览器返回的值,调试的话可以访问:chrome://view-http-cache/http(s)://your/sse/sever/and/path