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文檔獲取對應(yīng)的項(xiàng)即可。

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

這里需要注意的幾點(diǎn)是:

  1. client.Stats()是一個阻塞函數(shù),不會返回,需要在獨(dú)立的goroutine里面運(yùn)行。
  2. client.Stats的返回需要給StatsOptions.Done chan丟消息進(jìn)去。
  3. 然后從StatsOptions.Stats chan取出stats數(shù)據(jù)結(jié)構(gòu)。注意要判斷取出的stats是否為空。
  4. time.Sleep(2 * time.Second)貌似是必須的,如果設(shè)置成1s,經(jīng)測試拿不到正確的返回值。
  5. 關(guān)于CPU Percent的計(jì)算方法是參考下面文檔的:
    https://github.com/moby/moby/blob/c0699cd4a43ccc3b1e3624379e46e9ed94f7428c/cli/command/container/stats_helpers.go

運(yùn)行結(jié)果如下:

$ go build && ./main
CPU Percent= 0
Memory Usage: 294912
Memory Limit: 63634374656
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容