美文网首页Go语言用例
golang使用github.com/fsouza/go-doc

golang使用github.com/fsouza/go-doc

作者: CodingCode | 来源:发表于2019-04-13 14:10 被阅读0次

    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-doc

        本文链接:https://www.haomeiwen.com/subject/tailwqtx.html