Skip to content

Commit 25d21e7

Browse files
committed
Added system info
1 parent 34b04e3 commit 25d21e7

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed

docker/docker.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,27 @@ func (cl *Client) ContainerRename(containerID string, newContainerName string) e
640640
return nil
641641
}
642642

643+
func (cl *Client) SystemWideInfo() (types.Info, types.DiskUsage, error) {
644+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
645+
defer cancel()
646+
647+
info, err := cl.client.Info(ctx)
648+
if err != nil {
649+
if cl.log != nil {
650+
cl.log.Error("failed to retrieve docker info", err)
651+
}
652+
return types.Info{}, types.DiskUsage{}, err
653+
}
654+
diskUsage, err := cl.client.DiskUsage(ctx)
655+
if err != nil {
656+
if cl.log != nil {
657+
cl.log.Error("failed to retrieve docker info", err)
658+
}
659+
return types.Info{}, types.DiskUsage{}, err
660+
}
661+
return info, diskUsage, nil
662+
}
663+
643664
func calculateBlockIO(blkio types.BlkioStats) (blkRead uint64, blkWrite uint64) {
644665
for _, bioEntry := range blkio.IoServiceBytesRecursive {
645666
switch strings.ToLower(bioEntry.Op) {

docker/docker_interfaces.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,7 @@ type Docker interface {
5151
ContainerRemove(containerID string) error
5252
ContainerRename(containerID string, newContainerName string) error
5353
ContainerReplace(containerID string, image string, tag string) error
54+
55+
// host system information
56+
SystemWideInfo() (types.Info, types.DiskUsage, error)
5457
}

docker/docker_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
package docker
1616

1717
import (
18+
"fmt"
1819
"io/ioutil"
1920
"strings"
2021
"testing"
2122

2223
mclog "github.com/chryscloud/go-microkit-plugins/log"
24+
"github.com/docker/docker/api/types"
2325
)
2426

2527
var (
@@ -52,6 +54,70 @@ func TestContainerReplace(t *testing.T) {
5254
}
5355
}
5456

57+
func TestSystemWideInfo(t *testing.T) {
58+
cl := NewSocketClient(Log(zl), Host("unix:///var/run/docker.sock"))
59+
systemInfo, diskUsage, err := cl.SystemWideInfo()
60+
if err != nil {
61+
t.Fatal(err)
62+
}
63+
64+
fmt.Printf("Container running: %v\n", systemInfo.ContainersRunning)
65+
fmt.Printf("Container paused: %v\n", systemInfo.ContainersPaused)
66+
fmt.Printf("Container stopped: %v\n", systemInfo.ContainersStopped)
67+
fmt.Printf("Containers total: %v\n", systemInfo.Containers)
68+
69+
imgNum := len(diskUsage.Images)
70+
totalImgSize := int64(0)
71+
activeImages := int64(0)
72+
for _, im := range diskUsage.Images {
73+
activeImages += im.Containers
74+
totalImgSize += im.SharedSize
75+
}
76+
containerTotalSize := int64(0)
77+
for _, c := range diskUsage.Containers {
78+
containerTotalSize += c.SizeRw
79+
}
80+
totalVolumeSize := int64(0)
81+
activeVolumes := int64(0)
82+
for _, v := range diskUsage.Volumes {
83+
activeVolumes += v.UsageData.RefCount
84+
totalVolumeSize += v.UsageData.Size
85+
}
86+
fmt.Printf("disk size images: %v, size: %v, active images: %v\n", imgNum, totalImgSize, activeImages)
87+
fmt.Printf("Containers total disk size: %v, volume size: %v, Active volumes: %v\n", containerTotalSize, totalVolumeSize, activeVolumes)
88+
89+
opts := types.ContainerListOptions{
90+
All: true,
91+
Size: true,
92+
Quiet: false,
93+
}
94+
containers, err := cl.ContainersListWithOptions(opts)
95+
if err != nil {
96+
t.Fatal(err)
97+
}
98+
for _, c := range containers {
99+
if len(c.Names) > 0 {
100+
skip := false
101+
for _, n := range c.Names {
102+
if strings.Contains(n, "chrysedgeportal") || strings.Contains(n, "chrysedgeserver") || strings.Contains(n, "redis") {
103+
skip = true
104+
}
105+
}
106+
if skip {
107+
continue
108+
}
109+
stats, err := cl.ContainerStats(c.ID)
110+
if err != nil {
111+
t.Fatal(err)
112+
}
113+
calculated := cl.CalculateStats(stats)
114+
calculated.Status = c.Status
115+
calculated.State = c.State
116+
fmt.Printf("Stats: %v\n", calculated)
117+
}
118+
}
119+
}
120+
55121
//TODO: tests need to be modified to run without actual docker config
56122
// func TestSocketClient(t *testing.T) {
57123
// cl := NewSocketClient(Log(zl), Host("unix:///var/run/docker.sock"))

0 commit comments

Comments
 (0)