golang使用github.com/fsouza/go-dockerclient访问container的stats信息

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)
    }
}

这里需要注意的几点是:

  1. client.Stats()是一个阻塞函数,不会返回,需要在独立的goroutine里面运行。
  2. client.Stats的返回需要给StatsOptions.Done chan丢消息进去。
  3. 然后从StatsOptions.Stats chan取出stats数据结构。注意要判断取出的stats是否为空。
  4. time.Sleep(2 * time.Second)貌似是必须的,如果设置成1s,经测试拿不到正确的返回值。
  5. 关于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

你可能感兴趣的:(golang使用github.com/fsouza/go-dockerclient访问container的stats信息)