-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcontainer.go
110 lines (91 loc) · 2.77 KB
/
container.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package cmd
import (
"context"
"fmt"
"log"
"github.com/docker/docker/client"
containerGraph "github.com/krishpranav/gotop/src/display/container"
"github.com/krishpranav/gotop/src/utils"
"github.com/krishpranav/gotop/src/container"
"github.com/krishpranav/gotop/src/general"
"github.com/spf13/cobra"
"golang.org/x/sync/errgroup"
)
const (
defaultCid = ""
defaultContainerRefreshRate = 1000
)
var containerCmd = &cobra.Command{
Use: "container",
Short: "container command is used to get information related to docker containers",
Long: `container command is used to get information related to docker containers. It provides both overall and per container metrics.`,
Aliases: []string{"containers", "docker"},
RunE: func(cmd *cobra.Command, args []string) error {
if len(args) > 0 {
return fmt.Errorf("the container command should have no arguments, see gotop container --help for further info")
}
cid, _ := cmd.Flags().GetString("container-id")
containerRefreshRate, _ := cmd.Flags().GetUint64("refresh")
if containerRefreshRate < 1000 {
return fmt.Errorf("invalid refresh rate: minimum refresh rate is 1000(ms)")
}
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return err
}
eg, ctx := errgroup.WithContext(context.Background())
if cid != defaultCid {
dataChannel := make(chan container.PerContainerMetrics, 1)
eg.Go(func() error {
return container.ServeContainer(ctx, cli, cid, dataChannel, int64(containerRefreshRate))
})
eg.Go(func() error {
return containerGraph.ContainerVisuals(ctx, dataChannel, containerRefreshRate)
})
if err := eg.Wait(); err != nil {
if err == general.ErrInvalidContainer {
utils.ErrorMsg("cid")
}
if err != general.ErrCanceledByUser {
log.Fatalf("Error: %v\n", err)
}
}
} else {
dataChannel := make(chan container.ContainerMetrics)
allFlag, _ := cmd.Flags().GetBool("all")
eg.Go(func() error {
return container.Serve(ctx, cli, allFlag, dataChannel, int64(containerRefreshRate))
})
eg.Go(func() error {
return containerGraph.OverallVisuals(ctx, cli, allFlag, dataChannel, containerRefreshRate)
})
if err := eg.Wait(); err != nil {
if err != general.ErrCanceledByUser {
log.Fatalf("Error: %v\n", err)
}
}
}
return nil
},
}
func init() {
rootCmd.AddCommand(containerCmd)
containerCmd.Flags().StringP(
"container-id",
"c",
"",
"specify container ID",
)
containerCmd.Flags().Uint64P(
"refresh",
"r",
defaultContainerRefreshRate,
"Container information UI refreshes rate in milliseconds greater than 1000",
)
containerCmd.Flags().BoolP(
"all",
"a",
false,
"Specify to list all containers or only running containers.",
)
}