1. 程式人生 > 實用技巧 >Go語言通過Docker Go語言SDK獲取docker stats的資訊

Go語言通過Docker Go語言SDK獲取docker stats的資訊

一、Docker stats介紹

docker stats是docker提供的一個監控工具,非常的好用,之前一篇部落格中簡單介紹來了一下,可以先去簡單看看docker stats 介紹

二、程式獲取監控資訊

package main

import (
	"bytes"
	"context"
	"fmt"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"
)

func main() {
	//獲取ctx
	ctx := context.Background()

	//cli客戶端物件
	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		panic(err)
	}

	//獲取容器id 這個其實docker ps那個命令,不過我們只需要容器id
	containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
	if err != nil {
		panic(err)
	}

	//遍歷獲取到的容器
	for _, container := range containers {
		fmt.Println("--------容器ID-------")
		fmt.Println(container.ID)
		fmt.Println(container.Image)
		fmt.Println(container.ImageID)
		fmt.Println("根據容器id獲取容器的stats")
		//通過cli的ContainerStats方法可以獲取到 docker stats命令的詳細資訊,其實是一個容器監控的方法
		//這個方法返回了容器使用CPU 記憶體 網路 磁碟等諸多資訊
		containerStats, err := cli.ContainerStats(ctx, container.ID ,false)
		if err != nil {
			panic(err)
		}
/**
		ContainerStats的返回的結構如下 注意這個Body的型別是io.ReadCloser 好奇怪的型別 下面我們給他轉成json
		type ContainerStats struct {
			Body   io.ReadCloser `json:"body"`
			OSType string        `json:"ostype"`
		}
*/
		fmt.Println(containerStats)
		fmt.Println("containerStats.Body的內容是: ",containerStats.Body)
		buf := new(bytes.Buffer)
		//io.ReadCloser 轉換成 Buffer 然後轉換成json字串
		buf.ReadFrom(containerStats.Body)
		newStr := buf.String()
		fmt.Printf(newStr)
	}
}

執行結果如下:

基本資料全都有,慢慢解析json拿自己想要的資訊吧!