golang使用github.com/fsouza/go-dockerclient访问container的stats信息
例子使用/fsouza/go-dockerclient收集一个container的stats信息,包括CPU percent,Memory Usage和Limit;对于其他值,方法类似参阅API文档获取对应的项即可。
package main
import (
"fmt"
"time"
docker "github.com/fsouza/go-dockerclient"
)
func main() {
var endpoint string = "unix:///var/run/docker.sock"
var client *docker.Client
var err error
client, err = docker.NewClient(endpoint)
if err != nil {
panic(err)
}
statsChan := make(chan *docker.Stats)
doneChan := make(chan bool)
statsOpts := docker.StatsOptions{
ID: "352d14882ad2", // Replace container ID here
Stats: statsChan,
Done: doneChan,
Stream: false,
}
go func() {
err := client.Stats(statsOpts)
if err != nil {
// panic: io: read/write on closed pipe
panic(err)
}
}()
time.Sleep(2 * time.Second)
doneChan <- true
stats := <- statsChan
//close(statsChan) // client.Stats() will close it
close(doneChan)
if stats != nil {
// Refer from
// https://github.com/moby/moby/blob/c0699cd4a43ccc3b1e3624379e46e9ed94f7428c/cli/command/container/stats_helpers.go
cpuPercent := 0.0
cpuDelta := float64(stats.CPUStats.CPUUsage.TotalUsage) - float64(stats.PreCPUStats.CPUUsage.TotalUsage)
systemDelta := float64(stats.CPUStats.SystemCPUUsage) - float64(stats.PreCPUStats.SystemCPUUsage)
if systemDelta > 0.0 && cpuDelta > 0.0 {
cpuPercent = (cpuDelta / systemDelta) * float64(len(stats.CPUStats.CPUUsage.PercpuUsage)) * 100.0
}
fmt.Println("CPU Percent=", cpuPercent)
fmt.Println("Memory Usage:", stats.MemoryStats.Usage)
fmt.Println("Memory Limit:", stats.MemoryStats.Limit)
}
}
这里需要注意的几点是:
- client.Stats()是一个阻塞函数,不会返回,需要在独立的goroutine里面运行。
- client.Stats的返回需要给StatsOptions.Done chan丢消息进去。
- 然后从StatsOptions.Stats chan取出stats数据结构。注意要判断取出的stats是否为空。
- time.Sleep(2 * time.Second)貌似是必须的,如果设置成1s,经测试拿不到正确的返回值。
- 关于CPU Percent的计算方法是参考下面文档的:
https://github.com/moby/moby/blob/c0699cd4a43ccc3b1e3624379e46e9ed94f7428c/cli/command/container/stats_helpers.go
运行结果如下:
$ go build && ./main
CPU Percent= 0
Memory Usage: 294912
Memory Limit: 63634374656
网友评论