-
Notifications
You must be signed in to change notification settings - Fork 1
/
view.go
105 lines (90 loc) · 2.27 KB
/
view.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
package view
import (
"fmt"
"github.com/strategicpause/cgstat/stats"
"github.com/strategicpause/cgstat/stats/common"
"github.com/strategicpause/cgstat/writer"
"time"
"github.com/urfave/cli"
)
// CgroupStatsProviderFn controls which set of CgroupStats are returned for a user request.
type CgroupStatsProviderFn func() (common.CgroupStatsCollection, error)
type Command struct {
writers []writer.StatsWriter
statsProviderFn CgroupStatsProviderFn
followMode bool
ticker *time.Ticker
}
func Register() cli.Command {
return cli.Command{
Name: "view",
Aliases: []string{"v"},
Usage: "usage of view",
UsageText: "Usage text",
Description: "Description",
Action: action,
Flags: flags(),
}
}
func action(cCtx *cli.Context) error {
viewArgs, err := parseArgs(cCtx)
if err != nil {
return err
}
cmd := Command{
writers: getWriters(viewArgs),
statsProviderFn: getStatsProvider(viewArgs),
followMode: viewArgs.FollowMode,
ticker: time.NewTicker(viewArgs.GetRefreshInterval()),
}
return cmd.Run()
}
func getWriters(args *Args) []writer.StatsWriter {
var options []writer.ViewWriterOptions
if args.HasOutputFile() {
options = append(options, writer.WithCSVWriter(args.OutputFile))
}
displayVerbosity := writer.Normal
if args.VerboseOutput {
displayVerbosity = writer.Verbose
}
options = append(options, writer.WithDisplayWriter(displayVerbosity))
return writer.NewViewWriters(options)
}
func getStatsProvider(args *Args) CgroupStatsProviderFn {
provider := stats.NewCgroupStatsProvider()
if args.HasPrefix() {
return func() (common.CgroupStatsCollection, error) {
return provider.GetCgroupStatsByPrefix(args.CgroupPrefix)
}
}
return func() (common.CgroupStatsCollection, error) {
return provider.GetCgroupStatsByName(args.CgroupName)
}
}
func (c *Command) Run() error {
for range c.ticker.C {
// Clear Screen
fmt.Print("\033[H\033[2J")
err := c.writeStats()
if err != nil {
return err
}
if !c.followMode {
return nil
}
}
return nil
}
func (c *Command) writeStats() error {
cgroupStats, err := c.statsProviderFn()
if err != nil {
return err
}
for _, w := range c.writers {
if err = w.Write(cgroupStats); err != nil {
return err
}
}
return nil
}