From 10c461f7b546cc260540725a64e624d9f99b04f1 Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Fri, 1 Sep 2023 15:30:00 +0200 Subject: [PATCH] feat: track the analytics toggle event (#1217) ## Description: This event is tracked regardless of the state of the metrics election tracker, if we go from enabled -> disabled or disabled -> enabled we track the metric regardless ## Is this change user facing? NO --- cli/cli/commands/analytics/analytics.go | 16 +++++ cli/cli/go.mod | 2 +- cli/cli/go.sum | 2 + .../metrics_client_factory.go | 65 +++++++++++++++---- 4 files changed, 70 insertions(+), 15 deletions(-) diff --git a/cli/cli/commands/analytics/analytics.go b/cli/cli/commands/analytics/analytics.go index 3a9d5e8b7c..08662b8808 100644 --- a/cli/cli/commands/analytics/analytics.go +++ b/cli/cli/commands/analytics/analytics.go @@ -7,6 +7,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_client_factory" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_user_id_store" "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config" "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/resolved_config" @@ -55,6 +56,17 @@ func run(ctx context.Context, flags *flags.ParsedFlags, args *args.ParsedArgs) e return stacktrace.Propagate(err, "Expected a value for non-greedy arg '%v' but none was found; this is a bug in Kurtosis!", enableDisableStatus) } + // this client will send events regardless of the current metrics election + segmentMetricsClient, segmentMetricsClientCloser, err := metrics_client_factory.GetSegmentClient() + if err != nil { + return stacktrace.Propagate(err, "An error occurred while creating metrics client") + } + defer func() { + if err = segmentMetricsClientCloser(); err != nil { + logrus.Debugf("an error occurred while closing the metrics client:\n%v", err.Error()) + } + }() + // We get validation for free by virtue of the KurtosisCommand framework var didUserAcceptSendingMetrics bool justPrintMetricsId := false @@ -108,6 +120,10 @@ func run(ctx context.Context, flags *flags.ParsedFlags, args *args.ParsedArgs) e return stacktrace.Propagate(err, "An error occurred setting analytics configuration") } + if err = segmentMetricsClient.TrackKurtosisAnalyticsToggle(didUserAcceptSendingMetrics); err != nil { + logrus.Debugf("an error occurred while trackikng the kurtosis analytics toggle event:%v\n", err.Error()) + } + logrus.Infof("Analytics tracking is now %vd", didUserAcceptSendingMetricsStr) return nil diff --git a/cli/cli/go.mod b/cli/cli/go.mod index 978102fc60..ce5d32dd45 100644 --- a/cli/cli/go.mod +++ b/cli/cli/go.mod @@ -49,7 +49,7 @@ require ( github.com/kurtosis-tech/kurtosis-portal/api/golang v0.0.0-20230818182330-1a86869414d2 github.com/kurtosis-tech/kurtosis/cloud/api/golang v0.0.0 github.com/kurtosis-tech/kurtosis/name_generator v0.0.0-20230727152609-768e95d2dbeb - github.com/kurtosis-tech/metrics-library/golang v0.0.0-20230727131823-40788a849ce5 + github.com/kurtosis-tech/metrics-library/golang v0.0.0-20230901112211-5e1bcbcc81c3 github.com/kurtosis-tech/minimal-grpc-server/golang v0.0.0-20230710164206-90b674acb269 github.com/kurtosis-tech/vscode-kurtosis/starlark-lsp v0.0.0-20230406131103-c466e04f1b89 github.com/mholt/archiver v3.1.1+incompatible diff --git a/cli/cli/go.sum b/cli/cli/go.sum index 24bfe3c377..d178daaa6e 100644 --- a/cli/cli/go.sum +++ b/cli/cli/go.sum @@ -363,6 +363,8 @@ github.com/kurtosis-tech/kurtosis/name_generator v0.0.0-20230727152609-768e95d2d github.com/kurtosis-tech/kurtosis/name_generator v0.0.0-20230727152609-768e95d2dbeb/go.mod h1:BReV/l+0pvK7K9wf8MN41ViQBSQH30j+YJ7V4glf19A= github.com/kurtosis-tech/metrics-library/golang v0.0.0-20230727131823-40788a849ce5 h1:OVnlFVT5ooscDchTKMK6o46/s25XlBDEliSZqp63FfY= github.com/kurtosis-tech/metrics-library/golang v0.0.0-20230727131823-40788a849ce5/go.mod h1:tteWV+M47xMHxqCIPQmdmgPW80rhN8YfzrgRRWbQhOw= +github.com/kurtosis-tech/metrics-library/golang v0.0.0-20230901112211-5e1bcbcc81c3 h1:yLIA0iPMSLMSYklgTsfzeRRP46/ef8YmymQZ8fmr1d8= +github.com/kurtosis-tech/metrics-library/golang v0.0.0-20230901112211-5e1bcbcc81c3/go.mod h1:tteWV+M47xMHxqCIPQmdmgPW80rhN8YfzrgRRWbQhOw= github.com/kurtosis-tech/minimal-grpc-server/golang v0.0.0-20230710164206-90b674acb269 h1:yOo1I1iAyp0oYcGJ8AEAvt95QmpKNL1NYm1ZDqJW/LU= github.com/kurtosis-tech/minimal-grpc-server/golang v0.0.0-20230710164206-90b674acb269/go.mod h1:hCgrTsWf5Z8i+DOIvOw5xBMnNjrBruv89s1hjtbAPcw= github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409 h1:YQTATifMUwZEtZYb0LVA7DK2pj8s71iY8rzweuUQ5+g= diff --git a/cli/cli/helpers/metrics_client_factory/metrics_client_factory.go b/cli/cli/helpers/metrics_client_factory/metrics_client_factory.go index ae8e436f82..1121cbd627 100644 --- a/cli/cli/helpers/metrics_client_factory/metrics_client_factory.go +++ b/cli/cli/helpers/metrics_client_factory/metrics_client_factory.go @@ -20,18 +20,9 @@ const ( ) func GetMetricsClient() (metrics_client.MetricsClient, func() error, error) { - - clusterSettingStore := kurtosis_cluster_setting.GetKurtosisClusterSettingStore() - isClusterSet, err := clusterSettingStore.HasClusterSetting() + metricsUserId, clusterType, err := getMetricsUserIdAndClusterType() if err != nil { - return nil, nil, stacktrace.Propagate(err, "Failed to check if cluster setting has been set.") - } - clusterType := resolved_config.DefaultDockerClusterName - if isClusterSet { - clusterType, err = clusterSettingStore.GetClusterSetting() - if err != nil { - return nil, nil, stacktrace.Propagate(err, "Cluster is set but config couldn't be fetched") - } + return nil, nil, stacktrace.Propagate(err, "an error occurred while getting metrics user id and cluster type") } kurtosisConfigStore := kurtosis_config.GetKurtosisConfigStore() @@ -39,6 +30,7 @@ func GetMetricsClient() (metrics_client.MetricsClient, func() error, error) { if err != nil { return nil, nil, stacktrace.NewError("An error occurred while determining whether configuration already exists") } + var sendUserMetrics bool if hasConfig { kurtosisConfig, err := kurtosisConfigStore.GetConfig() @@ -50,12 +42,34 @@ func GetMetricsClient() (metrics_client.MetricsClient, func() error, error) { sendUserMetrics = defaults.SendMetricsByDefault } - metricsUserIdStore := metrics_user_id_store.GetMetricsUserIDStore() - metricsUserId, err := metricsUserIdStore.GetUserID() + logger := logrus.StandardLogger() + metricsClient, metricsClientCloseFunc, err := metrics_client.CreateMetricsClient( + source.KurtosisCLISource, + kurtosis_version.KurtosisVersion, + metricsUserId, + clusterType, + sendUserMetrics, + shouldFlushMetricsClientQueueOnEachEvent, + do_nothing_metrics_client_callback.NewDoNothingMetricsClientCallback(), + logrus_logger_converter.ConvertLogrusLoggerToAnalyticsLogger(logger), + ) + if err != nil { - return nil, nil, stacktrace.Propagate(err, "An error occurred while getting the users metrics id") + return nil, nil, stacktrace.Propagate(err, "An error occurred while creating the metrics client") } + return metricsClient, metricsClientCloseFunc, nil +} + +// GetSegmentClient use this method only if you are sure that you want to send metrics otherwise use GetMetricsClient +func GetSegmentClient() (metrics_client.MetricsClient, func() error, error) { + metricsUserId, clusterType, err := getMetricsUserIdAndClusterType() + if err != nil { + return nil, nil, stacktrace.Propagate(err, "an error occurred while getting metrics user id and cluster type") + } + // this is force set to true in order to get the segment client + sendUserMetrics := true + logger := logrus.StandardLogger() metricsClient, metricsClientCloseFunc, err := metrics_client.CreateMetricsClient( source.KurtosisCLISource, @@ -74,3 +88,26 @@ func GetMetricsClient() (metrics_client.MetricsClient, func() error, error) { return metricsClient, metricsClientCloseFunc, nil } + +func getMetricsUserIdAndClusterType() (string, string, error) { + clusterSettingStore := kurtosis_cluster_setting.GetKurtosisClusterSettingStore() + isClusterSet, err := clusterSettingStore.HasClusterSetting() + if err != nil { + return "", "", stacktrace.Propagate(err, "Failed to check if cluster setting has been set.") + } + clusterType := resolved_config.DefaultDockerClusterName + if isClusterSet { + clusterType, err = clusterSettingStore.GetClusterSetting() + if err != nil { + return "", "", stacktrace.Propagate(err, "Cluster is set but config couldn't be fetched") + } + } + + metricsUserIdStore := metrics_user_id_store.GetMetricsUserIDStore() + metricsUserId, err := metricsUserIdStore.GetUserID() + if err != nil { + return "", "", stacktrace.Propagate(err, "An error occurred while getting the users metrics id") + } + + return metricsUserId, clusterType, nil +}