on main help sign in
chore(metrics): have a better identifier fallback (#1130)
9fd7f48Andrey Nering
internal/event/event.go+2−10
@@ -9,7 +9,6 @@ import (
9 "runtime"
9 "runtime"
10
10
11 "github.com/charmbracelet/crush/internal/version"
11 "github.com/charmbracelet/crush/internal/version"
12− "github.com/denisbrodbeck/machineid"
13 "github.com/posthog/posthog-go"
12 "github.com/posthog/posthog-go"
14)
13)
15
14
@@ -39,6 +38,7 @@ func Init() {
39 slog.Error("Failed to initialize PostHog client", "error", err)
38 slog.Error("Failed to initialize PostHog client", "error", err)
40 }
39 }
41 client = c
40 client = c
41+ distinctId = getDistinctId()
42}
42}
43
43
44// send logs an event to PostHog with the given event name and properties.
44// send logs an event to PostHog with the given event name and properties.
@@ -47,7 +47,7 @@ func send(event string, props ...any) {
47 return
47 return
48 }
48 }
49 err := client.Enqueue(posthog.Capture{
49 err := client.Enqueue(posthog.Capture{
50− DistinctId: distinctId(),
50+ DistinctId: distinctId,
51 Event: event,
51 Event: event,
52 Properties: pairsToProps(props...).Merge(baseProps),
52 Properties: pairsToProps(props...).Merge(baseProps),
53 })
53 })
@@ -105,11 +105,3 @@ func pairsToProps(props ...any) posthog.Properties {
105func isEven(n int) bool {
105func isEven(n int) bool {
106 return n%2 == 0
106 return n%2 == 0
107}
107}
108−
109−func distinctId() string {
110− id, err := machineid.ProtectedID("charm")
111− if err != nil {
112− return "crush-cli"
113− }
114− return id
115−}
internal/event/identifier.gonew file+49
@@ -0,0 +1,49 @@
1+package event
2+
3+import (
4+ "crypto/hmac"
5+ "crypto/sha256"
6+ "encoding/hex"
7+ "fmt"
8+ "net"
9+
10+ "github.com/denisbrodbeck/machineid"
11+)
12+
13+var distinctId string
14+
15+const (
16+ hashKey = "charm"
17+ fallbackId = "unknown"
18+)
19+
20+func getDistinctId() string {
21+ if id, err := machineid.ProtectedID(hashKey); err == nil {
22+ return id
23+ }
24+ if macAddr, err := getMacAddr(); err == nil {
25+ return hashString(macAddr)
26+ }
27+ return fallbackId
28+}
29+
30+func getMacAddr() (string, error) {
31+ interfaces, err := net.Interfaces()
32+ if err != nil {
33+ return "", err
34+ }
35+ for _, iface := range interfaces {
36+ if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 && len(iface.HardwareAddr) > 0 {
37+ if addrs, err := iface.Addrs(); err == nil && len(addrs) > 0 {
38+ return iface.HardwareAddr.String(), nil
39+ }
40+ }
41+ }
42+ return "", fmt.Errorf("no active interface with mac address found")
43+}
44+
45+func hashString(str string) string {
46+ hash := hmac.New(sha256.New, []byte(str))
47+ hash.Write([]byte(hashKey))
48+ return hex.EncodeToString(hash.Sum(nil))
49+}