-
Notifications
You must be signed in to change notification settings - Fork 3
/
analytics.go
76 lines (67 loc) · 1.49 KB
/
analytics.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
package utils
import (
"bytes"
"fmt"
"net"
"os"
"runtime"
"strings"
"github.com/shirou/gopsutil/v3/host"
)
const (
reportsHost = "kong-hf.konghq.com"
reportsPort = 61829
konnectMode = "konnect"
)
func SendAnalytics(cmd, deckVersion, kongVersion, mode string) error {
if strings.ToLower(os.Getenv("DECK_ANALYTICS")) == "off" {
return nil
}
if cmd == "" {
return fmt.Errorf("invalid argument, 'cmd' cannot be empty")
}
stats := collectStats(cmd, deckVersion, kongVersion, mode)
body := formatStats(stats)
addr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", reportsHost, reportsPort))
if err != nil {
return err
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
return err
}
defer conn.Close()
_, err = conn.Write([]byte(body))
if err != nil {
return err
}
return nil
}
func formatStats(stats map[string]string) string {
var buffer bytes.Buffer
buffer.WriteString("<14>")
for k, v := range stats {
buffer.WriteString(fmt.Sprintf("%s=%s;", k, v))
}
return buffer.String()
}
func collectStats(cmd, deckVersion, kongVersion, mode string) map[string]string {
result := map[string]string{
"signal": "decK",
"v": deckVersion,
"cmd": cmd,
"os": runtime.GOOS,
"arch": runtime.GOARCH,
}
if mode == konnectMode {
result["mode"] = mode
}
if kongVersion != "" && mode != konnectMode {
result["kv"] = kongVersion
}
info, err := host.Info()
if err == nil {
result["osv"] = info.Platform + " " + info.PlatformVersion
}
return result
}