-
Notifications
You must be signed in to change notification settings - Fork 7
/
top.go
109 lines (99 loc) · 2.33 KB
/
top.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
package main
import (
"bufio"
"log"
"os/exec"
"regexp"
"strconv"
"strings"
)
// Top struct
type Top struct {
Namespace string
Pod string
Containers []Container
}
// Container struct
type Container struct {
Name string
CPU string
Memory string
}
// GetDeploymentName should work for most of the cases
func (t Top) GetDeploymentName() string {
reg, _ := regexp.Compile(`(.*)-([^-]*)-([^-]*)`)
result := reg.FindStringSubmatch(t.Pod)
return result[1]
}
// GetMilliCPU total pod cpu
func (t Top) GetMilliCPU() int {
total := 0
for _, c := range t.Containers {
str := strings.ReplaceAll(c.CPU, "m", "")
milli, _ := strconv.Atoi(str)
total += milli
}
return total
}
// GetMiMemory returns the memory in Mi
func (t Top) GetMiMemory() int {
total := 0
for _, c := range t.Containers {
reg, _ := regexp.Compile(`(\d*)(.*)`)
groups := reg.FindStringSubmatch(c.Memory)
memory, _ := strconv.Atoi(groups[1])
total += memory
}
return total
}
// RetrieveTopMap executes kubectl get pods command
// if ns is empty, then all namespaces are used
// returns key = namespace + pod name
func RetrieveTopMap(ns string) map[string]Top {
cmd := "kubectl top pods --all-namespaces --containers"
out, err := exec.Command("bash", "-c", cmd).CombinedOutput()
if err != nil {
log.Fatalf("Failed to execute command: %s", cmd)
}
data := string(out)
return buildTopMap(data, ns)
}
func buildTopList(data string, nsFilter string) []Top {
topMap := buildTopMap(data, nsFilter)
var tops []Top
for _, v := range topMap {
tops = append(tops, v)
}
return tops
}
func buildTopMap(data string, nsFilter string) map[string]Top {
r := strings.NewReader(data)
scanner := bufio.NewScanner(r)
top := make(map[string]Top)
for scanner.Scan() {
reg, _ := regexp.Compile(`(\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*`)
groups := reg.FindStringSubmatch(scanner.Text())
mamespace := groups[1]
if nsFilter == "" || nsFilter == mamespace {
key := mamespace + "|" + groups[2]
val, ok := top[key]
if !ok {
val = Top{
Namespace: mamespace,
Pod: groups[2],
Containers: []Container{},
}
}
val.Containers = append(val.Containers, Container{
Name: groups[3],
CPU: groups[4],
Memory: groups[5],
})
top[key] = val
}
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return top
}