diff --git a/appview/config.go b/appview/config.go index c7d321c..d57decb 100644 --- a/appview/config.go +++ b/appview/config.go @@ -17,6 +17,7 @@ type Config struct { CamoSharedSecret string `env:"TANGLED_CAMO_SHARED_SECRET"` AvatarSharedSecret string `env:"TANGLED_AVATAR_SHARED_SECRET"` AvatarHost string `env:"TANGLED_AVATAR_HOST, default=https://avatar.tangled.sh"` + EnableTelemetry bool `env:"TANGLED_TELEMETRY_ENABLED, default=false"` } func LoadConfig(ctx context.Context) (*Config, error) { diff --git a/appview/state/router.go b/appview/state/router.go index dcd5fce..659cd35 100644 --- a/appview/state/router.go +++ b/appview/state/router.go @@ -13,6 +13,12 @@ import ( func (s *State) Router() http.Handler { router := chi.NewRouter() + if s.t != nil { + // top-level telemetry middleware + // router.Use(s.t.RequestDuration()) + // router.Use(s.t.RequestInFlight()) + } + router.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) { pat := chi.URLParam(r, "*") if strings.HasPrefix(pat, "did:") || strings.HasPrefix(pat, "@") { @@ -48,7 +54,6 @@ func (s *State) Router() http.Handler { func (s *State) UserRouter() http.Handler { r := chi.NewRouter() - // strip @ from user r.Use(StripLeadingAt) diff --git a/appview/state/state.go b/appview/state/state.go index 460a2bb..871c688 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -9,6 +9,7 @@ import ( "log" "log/slog" "net/http" + "runtime/debug" "strings" "time" @@ -24,6 +25,7 @@ import ( "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/jetstream" "tangled.sh/tangled.sh/core/rbac" + "tangled.sh/tangled.sh/core/telemetry" ) type State struct { @@ -34,10 +36,11 @@ type State struct { pages *pages.Pages resolver *appview.Resolver jc *jetstream.JetstreamClient + t *telemetry.Telemetry config *appview.Config } -func Make(config *appview.Config) (*State, error) { +func Make(ctx context.Context, config *appview.Config) (*State, error) { d, err := db.Make(config.DbPath) if err != nil { return nil, err @@ -59,6 +62,14 @@ func Make(config *appview.Config) (*State, error) { resolver := appview.NewResolver() + bi, ok := debug.ReadBuildInfo() + var version string + if ok { + version = bi.Main.Version + } else { + version = "v0.0.0-unknown" + } + wrapper := db.DbWrapper{d} jc, err := jetstream.NewJetstreamClient( config.JetstreamEndpoint, @@ -77,6 +88,14 @@ func Make(config *appview.Config) (*State, error) { return nil, fmt.Errorf("failed to start jetstream watcher: %w", err) } + var tele *telemetry.Telemetry + if config.EnableTelemetry { + tele, err = telemetry.NewTelemetry(ctx, "appview", version, config.Dev) + if err != nil { + return nil, fmt.Errorf("failed to setup telemetry: %w", err) + } + } + state := &State{ d, auth, @@ -85,6 +104,7 @@ func Make(config *appview.Config) (*State, error) { pgs, resolver, jc, + tele, config, } diff --git a/cmd/appview/main.go b/cmd/appview/main.go index 2cc33c2..ebe2aae 100644 --- a/cmd/appview/main.go +++ b/cmd/appview/main.go @@ -14,13 +14,15 @@ import ( func main() { slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil))) - c, err := appview.LoadConfig(context.Background()) + ctx := context.Background() + + c, err := appview.LoadConfig(ctx) if err != nil { log.Println("failed to load config", "error", err) return } - state, err := state.Make(c) + state, err := state.Make(ctx, c) if err != nil { log.Fatal(err)