get container stats synchronously

This commit is contained in:
Henry Dollman
2024-07-23 15:19:04 -04:00
parent c5776541a0
commit 844b95dfd0

View File

@@ -2,7 +2,6 @@ package main
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"io" "io"
"log" "log"
@@ -11,7 +10,6 @@ import (
"net/http" "net/http"
"os" "os"
"strings" "strings"
"sync"
"time" "time"
sshServer "github.com/gliderlabs/ssh" sshServer "github.com/gliderlabs/ssh"
@@ -26,7 +24,8 @@ import (
var Version = "0.0.1-alpha.6" var Version = "0.0.1-alpha.6"
var containerCpuMap = make(map[string][2]uint64) var containerCpuMap = make(map[string][2]uint64)
var containerCpuMutex = &sync.Mutex{}
// var containerCpuMutex = &sync.Mutex{}
var diskIoStats = DiskIoStats{ var diskIoStats = DiskIoStats{
Read: 0, Read: 0,
@@ -44,15 +43,15 @@ var netIoStats = NetIoStats{
// client for docker engine api // client for docker engine api
var client = &http.Client{ var client = &http.Client{
Timeout: time.Second * 5, Timeout: time.Second,
Transport: &http.Transport{ Transport: &http.Transport{
Dial: func(proto, addr string) (net.Conn, error) { Dial: func(proto, addr string) (net.Conn, error) {
return net.Dial("unix", "/var/run/docker.sock") return net.Dial("unix", "/var/run/docker.sock")
}, },
ForceAttemptHTTP2: false, ForceAttemptHTTP2: false,
MaxIdleConns: 100,
MaxIdleConnsPerHost: 100,
IdleConnTimeout: 90 * time.Second, IdleConnTimeout: 90 * time.Second,
DisableCompression: true,
MaxIdleConns: 10,
DisableKeepAlives: false, DisableKeepAlives: false,
}, },
} }
@@ -194,20 +193,19 @@ func getDockerStats() ([]ContainerStats, error) {
panic(err) panic(err)
} }
var wg sync.WaitGroup
var containerStats []ContainerStats var containerStats []ContainerStats
for _, ctr := range containers { for _, ctr := range containers {
wg.Add(1)
go func() {
defer wg.Done()
cstats, err := getContainerStats(ctr) cstats, err := getContainerStats(ctr)
if err != nil {
// retry once
cstats, err = getContainerStats(ctr)
if err != nil { if err != nil {
log.Printf("Error getting container stats: %+v\n", err) log.Printf("Error getting container stats: %+v\n", err)
return continue
}
} }
containerStats = append(containerStats, cstats) containerStats = append(containerStats, cstats)
}()
} }
// clean up old containers from map // clean up old containers from map
@@ -221,8 +219,6 @@ func getDockerStats() ([]ContainerStats, error) {
} }
} }
wg.Wait()
return containerStats, nil return containerStats, nil
} }
@@ -246,8 +242,8 @@ func getContainerStats(ctr Container) (ContainerStats, error) {
// cpu // cpu
// add default values to containerCpu if it doesn't exist // add default values to containerCpu if it doesn't exist
containerCpuMutex.Lock() // containerCpuMutex.Lock()
defer containerCpuMutex.Unlock() // defer containerCpuMutex.Unlock()
if _, ok := containerCpuMap[name]; !ok { if _, ok := containerCpuMap[name]; !ok {
containerCpuMap[name] = [2]uint64{0, 0} containerCpuMap[name] = [2]uint64{0, 0}
} }
@@ -255,7 +251,7 @@ func getContainerStats(ctr Container) (ContainerStats, error) {
systemDelta := statsJson.CPUStats.SystemUsage - containerCpuMap[name][1] systemDelta := statsJson.CPUStats.SystemUsage - containerCpuMap[name][1]
cpuPct := float64(cpuDelta) / float64(systemDelta) * 100 cpuPct := float64(cpuDelta) / float64(systemDelta) * 100
if cpuPct > 100 { if cpuPct > 100 {
return ContainerStats{}, errors.New("cpu pct is greater than 100") return ContainerStats{}, fmt.Errorf("%s cpu pct greater than 100: %+v", name, cpuPct)
} }
containerCpuMap[name] = [2]uint64{statsJson.CPUStats.CPUUsage.TotalUsage, statsJson.CPUStats.SystemUsage} containerCpuMap[name] = [2]uint64{statsJson.CPUStats.CPUUsage.TotalUsage, statsJson.CPUStats.SystemUsage}