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  }