github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/analytics.go (about) 1 package cli 2 3 import ( 4 "os" 5 "runtime" 6 7 tiltanalytics "github.com/tilt-dev/tilt/internal/analytics" 8 "github.com/tilt-dev/tilt/internal/git" 9 "github.com/tilt-dev/tilt/pkg/logger" 10 "github.com/tilt-dev/tilt/pkg/model" 11 12 "github.com/tilt-dev/wmclient/pkg/analytics" 13 ) 14 15 const tiltAppName = "tilt" 16 const analyticsURLEnvVar = "TILT_ANALYTICS_URL" 17 18 // Testing analytics locally: 19 // (after `npm install http-echo-server -g`) 20 // In one window: `PORT=9988 http-echo-server` 21 // In another: `TILT_ANALYTICS_URL=http://localhost:9988 tilt up` 22 // Analytics requests will show up in the http-echo-server window. 23 24 type analyticsOpter struct{} 25 26 var _ tiltanalytics.AnalyticsOpter = analyticsOpter{} 27 28 func (ao analyticsOpter) ReadUserOpt() (analytics.Opt, error) { 29 return analytics.OptStatus() 30 } 31 32 func (ao analyticsOpter) SetUserOpt(opt analytics.Opt) error { 33 return analytics.SetOpt(opt) 34 } 35 36 type analyticsLogger struct { 37 logger logger.Logger 38 } 39 40 func (al analyticsLogger) Printf(fmt string, v ...interface{}) { 41 al.logger.Debugf(fmt, v...) 42 } 43 44 func newAnalytics(l logger.Logger, cmdName model.TiltSubcommand, tiltBuild model.TiltBuild, 45 gitRemote git.GitRemote) (*tiltanalytics.TiltAnalytics, error) { 46 var err error 47 48 options := []analytics.Option{} 49 // enabled: true because TiltAnalytics wraps the RemoteAnalytics and has its own guards for whether analytics 50 // is enabled. When TiltAnalytics decides to pass a call through to RemoteAnalytics, it should always work. 51 options = append(options, 52 analytics.WithGlobalTags(globalTags(cmdName, tiltBuild, gitRemote)), 53 analytics.WithEnabled(true), 54 analytics.WithLogger(analyticsLogger{logger: l})) 55 analyticsURL := os.Getenv(analyticsURLEnvVar) 56 if analyticsURL != "" { 57 options = append(options, analytics.WithReportURL(analyticsURL)) 58 } 59 backingAnalytics, err := analytics.NewRemoteAnalytics(tiltAppName, options...) 60 if err != nil { 61 return nil, err 62 } 63 64 return tiltanalytics.NewTiltAnalytics(analyticsOpter{}, backingAnalytics, tiltBuild.AnalyticsVersion()) 65 } 66 67 func globalTags(cmdName model.TiltSubcommand, tiltBuild model.TiltBuild, gr git.GitRemote) map[string]string { 68 ret := map[string]string{ 69 tiltanalytics.TagVersion: tiltBuild.AnalyticsVersion(), 70 tiltanalytics.TagOS: runtime.GOOS, 71 tiltanalytics.TagSubcommand: cmdName.String(), 72 } 73 74 // store a hash of the git remote to help us guess how many users are running it on the same repository 75 origin := gr.String() 76 if origin != "" { 77 ret[tiltanalytics.TagGitRepoHash] = tiltanalytics.HashMD5(origin) 78 } 79 80 return ret 81 }