Skip to content

Commit

Permalink
Optionally track analytics for hardware versions of providers (#5)
Browse files Browse the repository at this point in the history
* Optionally track analytics for hardware versions of providers

* Run pre-commit
  • Loading branch information
bradtgmurray authored Jan 9, 2024
1 parent 4481f07 commit c00b355
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 4 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
.idea

/registration_relay
15 changes: 15 additions & 0 deletions cmd/registration_relay/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (

"github.com/beeper/libserv/pkg/flagenv"

"github.com/beeper/registration-relay/internal/analytics"
"github.com/beeper/registration-relay/internal/api"
"github.com/beeper/registration-relay/internal/config"
"github.com/beeper/registration-relay/internal/metrics"
Expand Down Expand Up @@ -46,6 +47,17 @@ func main() {
"Validate auth header URL",
)

analyticsURL := flag.String(
"analyticsURL",
flagenv.StringEnvWithDefault("ANALYTICS_URL", ""),
"URL to send analytics to, disabled by default",
)
analyticsToken := flag.String(
"analyticsToken",
flagenv.StringEnvWithDefault("ANALYTICS_TOKEN", ""),
"Write key to auth analytics with, disabled by default",
)

flag.Parse()

if *prettyLogs {
Expand All @@ -67,6 +79,9 @@ func main() {
}
cfg.API.ValidateAuthURL = *validateAuthURL

analytics.ConfigURL = *analyticsURL
analytics.ConfigToken = *analyticsToken

log.Info().Str("commit", Commit).Str("build_time", BuildTime).Msg("registration-relay starting")

metricsSrv := metrics.NewPrometheusMetricsHandler(*metricsListenAddr)
Expand Down
58 changes: 58 additions & 0 deletions internal/analytics/analytics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package analytics

import (
"bytes"
"encoding/json"
"net/http"

"github.com/rs/zerolog/log"
)

var ConfigURL = ""
var ConfigToken = ""
var client http.Client

var logger = log.With().Str("component", "analytics").Logger()

func trackImplementation(userId string, event string, properties map[string]any) {
var buf bytes.Buffer
err := json.NewEncoder(&buf).Encode(map[string]interface{}{
"userId": userId,
"event": event,
"properties": properties,
})
if err != nil {
logger.Error().Err(err).Msg("error encoding payload")
return
}

req, err := http.NewRequest(http.MethodPost, ConfigURL, &buf)
if err != nil {
logger.Error().Err(err).Msg("error creating request")
return
}
req.SetBasicAuth(ConfigToken, "")
resp, err := client.Do(req)
if err != nil {
logger.Error().Err(err).Msg("error sending request")
return
}
err = resp.Body.Close()
if err != nil {
logger.Error().Err(err).Msg("error closing request")
}

logger.Info().Str("event", event).Msg("Tracked event")
}

func IsEnabled() bool {
return len(ConfigToken) > 0
}

func Track(userId string, event string, properties map[string]any) {
if !IsEnabled() {
return
}

go trackImplementation(userId, event, properties)
}
18 changes: 16 additions & 2 deletions internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"

"github.com/beeper/registration-relay/internal/analytics"
"github.com/beeper/registration-relay/internal/metrics"
"github.com/beeper/registration-relay/internal/util"
)
Expand Down Expand Up @@ -56,6 +57,11 @@ func RegisterProvider(data registerCommandData, provider *provider) (*registerCo
return nil, err
}
data.Secret = base64.RawStdEncoding.EncodeToString(calculateSecret(provider.globalSecret, data.Code))

analytics.Track(data.Code, "Provider Registered", map[string]any{
"commit": data.Commit,
"hardware_version": data.Versions.HardwareVersion,
})
} else {
if len(data.Code) != 19 || len(data.Secret) > 64 {
return nil, fmt.Errorf("invalid secret")
Expand All @@ -67,9 +73,14 @@ func RegisterProvider(data registerCommandData, provider *provider) (*registerCo
if existing, exists := codeToProvider[data.Code]; exists {
existing.log.Warn().
Str("code", data.Code).
Msg("New provider with same code registering, exiting websocket")
Msg("New provider with same code registering, exiting existing websocket")
existing.ws.Close()
}

analytics.Track(data.Code, "Provider Reconnected", map[string]any{
"commit": data.Commit,
"hardware_version": data.Versions.HardwareVersion,
})
}

codeToProvider[data.Code] = provider
Expand Down Expand Up @@ -156,7 +167,10 @@ Loop:
registerCode = response.Code

p.log = p.log.With().Str("code", request.Code).Logger()
p.log.Debug().Msg("Registered provider")
p.log.Debug().
Str("hardware_version", request.Versions.HardwareVersion).
Str("commit", request.Commit).
Msg("Registered provider")

// Send back register response before setting the flag (ws is single writer)
buf, err := json.Marshal(RawCommand[registerCommandData]{Command: "response", Data: *response, ReqID: rawCommand.ReqID})
Expand Down
10 changes: 8 additions & 2 deletions internal/provider/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,15 @@ type RawCommand[T any] struct {
Data T `json:"data"`
}

type versions struct {
HardwareVersion string `json:"hardware_version"`
}

type registerCommandData struct {
Code string `json:"code"`
Secret string `json:"secret"`
Code string `json:"code"`
Secret string `json:"secret"`
Commit string `json:"commit,omitempty"`
Versions versions `json:"versions,omitempty"`
}

type errorData struct {
Expand Down

0 comments on commit c00b355

Please sign in to comment.