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  }