-
Notifications
You must be signed in to change notification settings - Fork 0
/
send-cpu-usage.go
125 lines (101 loc) · 2.23 KB
/
send-cpu-usage.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
"time"
"github.com/shirou/gopsutil/v4/cpu"
"github.com/shirou/gopsutil/v4/mem"
)
type Usage struct {
cpu float64
memory float64
}
type SendData struct {
Cpu int `json:"cpu"`
Mem int `json:"mem"`
}
var isSilent bool
var isVerbose bool
var serverHost string
var interval time.Duration
func getUsage() (Usage, error) {
memoryUsage, err := mem.VirtualMemory()
if err != nil {
return Usage{}, err
}
if isVerbose {
log.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", memoryUsage.Total, memoryUsage.Free, memoryUsage.UsedPercent)
}
totalCpuUsage, err := cpu.Percent(time.Millisecond*100, false)
if err != nil {
return Usage{}, err
}
if len(totalCpuUsage) != 1 {
panic("cpu usage is empty")
}
if isVerbose {
log.Printf("CPU: %2f%%\n", totalCpuUsage[0])
}
return Usage{
cpu: totalCpuUsage[0],
memory: memoryUsage.UsedPercent,
}, nil
}
func postUsage(u Usage) error {
data := SendData{Cpu: int(u.cpu), Mem: int(u.memory)}
buf := bytes.NewBuffer(nil)
err := json.NewEncoder(buf).Encode(&data)
if err != nil {
return err
}
if isVerbose {
log.Printf("request %s", serverHost)
}
req, err := http.NewRequest("POST", serverHost+"/values", buf)
if err != nil {
return err
}
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
if res.StatusCode != 200 {
resBody, _ := io.ReadAll(res.Body)
return fmt.Errorf("status code is not 200: %d, body: %s", res.StatusCode, resBody)
}
if isVerbose {
resBody, _ := io.ReadAll(res.Body)
log.Printf("status code is 200: %d, body: %s", res.StatusCode, resBody)
}
return nil
}
func main() {
flag.BoolVar(&isVerbose, "v", false, "verbose")
flag.BoolVar(&isSilent, "s", false, "silent")
flag.StringVar(&serverHost, "h", "", "server host")
flag.DurationVar(&interval, "i", time.Second, "interval")
flag.Parse()
if serverHost == "" {
fmt.Printf("usage -h <server host>\n")
os.Exit(1)
}
for {
time.Sleep(interval)
usage, err := getUsage()
if err != nil && !isSilent {
log.Printf("getUsageError: %s", err)
continue
}
err = postUsage(usage)
if err != nil && !isSilent {
log.Printf("postUsageError: %s", err)
continue
}
}
}