github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/analytics/analytics.go (about) 1 package analytics 2 3 import ( 4 "go.starlark.net/starlark" 5 6 "github.com/tilt-dev/tilt/internal/tiltfile/starkit" 7 "github.com/tilt-dev/tilt/internal/tiltfile/value" 8 "github.com/tilt-dev/wmclient/pkg/analytics" 9 ) 10 11 type Settings struct { 12 Opt analytics.Opt 13 CustomTagsToReport map[string]string 14 } 15 16 type Plugin struct { 17 } 18 19 func NewPlugin() Plugin { 20 return Plugin{} 21 } 22 23 func (e Plugin) NewState() interface{} { 24 return Settings{ 25 Opt: analytics.OptDefault, 26 CustomTagsToReport: make(map[string]string), 27 } 28 } 29 30 func (Plugin) OnStart(env *starkit.Environment) error { 31 err := env.AddBuiltin("analytics_settings", setAnalyticsSettings) 32 if err != nil { 33 return err 34 } 35 36 // This is an experimental feature to allow Tiltfiles to specify custom data to report to analytics 37 // to allow teams to get more visibility into, e.g., who's using Tilt or what k8s distributions are 38 // their members using. It is not intended for use without coordinating with the Tilt team. 39 err = env.AddBuiltin("experimental_analytics_report", reportCustomTags) 40 if err != nil { 41 return err 42 } 43 44 return nil 45 } 46 47 func setAnalyticsSettings(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { 48 var enable bool 49 if err := starkit.UnpackArgs(thread, fn.Name(), args, kwargs, 50 "enable", &enable); err != nil { 51 return nil, err 52 } 53 54 err := starkit.SetState(thread, func(settings Settings) Settings { 55 if enable { 56 settings.Opt = analytics.OptIn 57 } else { 58 settings.Opt = analytics.OptOut 59 } 60 return settings 61 }) 62 63 return starlark.None, err 64 } 65 66 func reportCustomTags(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { 67 var tags value.StringStringMap 68 if err := starkit.UnpackArgs(thread, fn.Name(), args, kwargs, "tags", &tags); err != nil { 69 return nil, err 70 } 71 72 err := starkit.SetState(thread, func(settings Settings) Settings { 73 for k, v := range tags { 74 settings.CustomTagsToReport[k] = v 75 } 76 77 return settings 78 }) 79 80 return starlark.None, err 81 } 82 83 var _ starkit.StatefulPlugin = Plugin{} 84 85 func MustState(model starkit.Model) Settings { 86 state, err := GetState(model) 87 if err != nil { 88 panic(err) 89 } 90 return state 91 } 92 93 func GetState(m starkit.Model) (Settings, error) { 94 var state Settings 95 err := m.Load(&state) 96 return state, err 97 }