Skip to content

Commit

Permalink
Merge pull request #56 from ksctl/feat/telemetry
Browse files Browse the repository at this point in the history
feat(telemetry): feature added
  • Loading branch information
dipankardas011 authored Feb 22, 2025
2 parents 92a78cc + 7752fdd commit ee92cce
Show file tree
Hide file tree
Showing 20 changed files with 442 additions and 30 deletions.
1 change: 1 addition & 0 deletions .github/workflows/goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,4 @@ jobs:
DATE: ${{ env.CURR_DATE }}
VERSION: ${{ env.CURR_VER }}
OCIVERSION: ${{ env.KSCTL_CORE }}
CLI_IDENTITY: ${{ secrets.CLI_IDENTITY }}
1 change: 1 addition & 0 deletions .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ builds:
- -s -w -X "github.com/ksctl/cli/v2/pkg/config.BuildDate={{.Env.DATE}}"
- -s -w -X "github.com/ksctl/cli/v2/pkg/config.Version={{.Env.VERSION}}"
- -s -w -X "github.com/ksctl/cli/v2/pkg/config.KsctlCoreVer={{.Env.OCIVERSION}}"
- -s -w -X "github.com/ksctl/cli/v2/pkg/telemetry.clientIdentity={{.Env.CLI_IDENTITY}}"

signs:
- cmd: cosign
Expand Down
35 changes: 32 additions & 3 deletions cmd/addons.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ import (
"fmt"
"os"
"strconv"
"strings"

"github.com/ksctl/cli/v2/pkg/cli"
"github.com/ksctl/cli/v2/pkg/telemetry"
"github.com/ksctl/ksctl/v2/pkg/handler/cluster/controller"

addonsHandler "github.com/ksctl/ksctl/v2/pkg/handler/addons"
Expand Down Expand Up @@ -106,6 +108,18 @@ ksctl addons enable --help
k.l.Error("Error in getting the addon", "Error", err)
os.Exit(1)
} else {

if err := k.telemetry.Send(k.Ctx, k.l, telemetry.EventClusterAddonEnable, telemetry.TelemetryMeta{
Addons: []telemetry.TelemetryAddon{
{
Sku: addonSku,
Version: addonVer,
},
},
}); err != nil {
k.l.Debug(k.Ctx, "Failed to send the telemetry", "Reason", err)
}

if _err := cc.Install(addonVer); _err != nil {
k.l.Error("Error in enabling the addon", "Error", _err)
os.Exit(1)
Expand Down Expand Up @@ -159,12 +173,12 @@ ksctl addons disable --help
for _, addon := range addons {
ver := "NaN"
if addon.Version != "" {
ver = "@" + addon.Version
ver = addon.Version
}
vals[fmt.Sprintf("%s%s", addon.Name, ver)] = addon.Name
vals[fmt.Sprintf("%s@%s", addon.Name, ver)] = addon.Name + "@" + ver
}

selectedAddon, err := k.menuDriven.DropDown(
_selectedAddon, err := k.menuDriven.DropDown(
"Select the addon to disable",
vals,
)
Expand All @@ -173,10 +187,24 @@ ksctl addons disable --help
os.Exit(1)
}

selectedAddon := strings.Split(_selectedAddon, "@")[0]

if cc, err := c.GetAddon(selectedAddon); err != nil {
k.l.Error("Error in getting the addon", "Error", err)
os.Exit(1)
} else {

if err := k.telemetry.Send(k.Ctx, k.l, telemetry.EventClusterAddonDisable, telemetry.TelemetryMeta{
Addons: []telemetry.TelemetryAddon{
{
Sku: selectedAddon,
Version: strings.Split(_selectedAddon, "@")[1],
},
},
}); err != nil {
k.l.Debug(k.Ctx, "Failed to send the telemetry", "Reason", err)
}

if _err := cc.Uninstall(); _err != nil {
k.l.Error("Error in disabling the addon", "Error", _err)
os.Exit(1)
Expand Down Expand Up @@ -213,6 +241,7 @@ func (k *KsctlCommand) addonClientSetup() (*controller.Metadata, bool) {
Region: cluster.Region,
StateLocation: k.KsctlConfig.PreferedStateStore,
K8sDistro: cluster.K8sDistro,
K8sVersion: cluster.K8sVersion,
}
}

Expand Down
2 changes: 2 additions & 0 deletions cmd/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"github.com/ksctl/cli/v2/pkg/cli"
"github.com/ksctl/cli/v2/pkg/config"
cLogger "github.com/ksctl/cli/v2/pkg/logger"
"github.com/ksctl/cli/v2/pkg/telemetry"
"github.com/ksctl/ksctl/v2/pkg/consts"
"github.com/ksctl/ksctl/v2/pkg/logger"
"github.com/ksctl/ksctl/v2/pkg/provider"
Expand All @@ -38,6 +39,7 @@ type KsctlCommand struct {
debugMode bool
menuDriven cli.MenuDriven
KsctlConfig *config.Config
telemetry *telemetry.Telemetry
inMemInstanceTypesInReg map[string]provider.InstanceRegionOutput
}

Expand Down
81 changes: 70 additions & 11 deletions cmd/configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"os"
"strconv"

"github.com/fatih/color"
"github.com/ksctl/cli/v2/pkg/cli"
"github.com/ksctl/cli/v2/pkg/config"
"github.com/ksctl/ksctl/v2/pkg/consts"
Expand All @@ -34,7 +35,44 @@ func (k *KsctlCommand) Configure() *cobra.Command {
Use: "configure",

Short: "Configure ksctl cli",
Long: "It will help you to configure the ksctl cli",
Long: "It will display the current ksctl cli configuration",
Run: func(cmd *cobra.Command, args []string) {
headers := []string{"Property", "Value"}

enabled := color.HiCyanString("✔")
disabled := color.HiRedString("✘")
telemetry := enabled

if k.KsctlConfig.Telemetry != nil && !*k.KsctlConfig.Telemetry {
telemetry = disabled
}
rows := [][]string{
{"Storage Backend", string(k.KsctlConfig.PreferedStateStore)},
{"Telemetry", telemetry},
}

if k.KsctlConfig.PreferedStateStore == consts.StoreExtMongo {
if err := k.loadMongoCredentials(); err != nil {
rows = append(rows, []string{"MongoDB 💾", disabled})
} else {
rows = append(rows, []string{"MongoDB 💾", enabled})
}
}

if _, err := k.loadAwsCredentials(); err == nil {
rows = append(rows, []string{"AWS ☁️", enabled})
} else {
rows = append(rows, []string{"AWS ☁️", disabled})
}

if _, err := k.loadAzureCredentials(); err == nil {
rows = append(rows, []string{"Azure ☁️", enabled})
} else {
rows = append(rows, []string{"Azure ☁️", disabled})
}

k.l.Table(k.Ctx, headers, rows)
},
}

return cmd
Expand Down Expand Up @@ -72,6 +110,29 @@ func (k *KsctlCommand) ConfigureCloud() *cobra.Command {
return cmd
}

func (k *KsctlCommand) ConfigureTelemetry() *cobra.Command {
cmd := &cobra.Command{
Use: "telemetry",

Short: "Configure telemetry",
Long: "It will help you to configure the telemetry",
Run: func(cmd *cobra.Command, args []string) {
if v, err := k.menuDriven.Confirmation("Do you want to enable the telemetry?", cli.WithDefaultValue("yes")); err != nil {
k.l.Error("Failed to get the telemetry status", "Reason", err)
os.Exit(1)
} else {
k.KsctlConfig.Telemetry = utilities.Ptr(v)
if err := config.SaveConfig(k.KsctlConfig); err != nil {
k.l.Error("Failed to save the configuration", "Reason", err)
os.Exit(1)
}
}
},
}

return cmd
}

func (k *KsctlCommand) handleStorageConfig() bool {
if v, err := k.menuDriven.DropDown(
"What should be your default storageDriver?",
Expand Down Expand Up @@ -144,17 +205,16 @@ func (k *KsctlCommand) storeAwsCredentials() (err error) {
return config.SaveCloudCreds(c, consts.CloudAws)
}

func (k *KsctlCommand) loadAwsCredentials() error {
func (k *KsctlCommand) loadAwsCredentials() ([]byte, error) {
c := new(statefile.CredentialsAws)
if err := config.LoadCloudCreds(c, consts.CloudAws); err != nil {
return err
return nil, err
}
v, err := json.Marshal(c)
if err != nil {
return err
return nil, err
}
k.Ctx = context.WithValue(k.Ctx, consts.KsctlAwsCredentials, v)
return nil
return v, nil
}

func (k *KsctlCommand) storeAzureCredentials() (err error) {
Expand All @@ -181,17 +241,16 @@ func (k *KsctlCommand) storeAzureCredentials() (err error) {
return config.SaveCloudCreds(c, consts.CloudAzure)
}

func (k *KsctlCommand) loadAzureCredentials() error {
func (k *KsctlCommand) loadAzureCredentials() ([]byte, error) {
c := new(statefile.CredentialsAzure)
if err := config.LoadCloudCreds(c, consts.CloudAzure); err != nil {
return err
return nil, err
}
v, err := json.Marshal(c)
if err != nil {
return err
return nil, err
}
k.Ctx = context.WithValue(k.Ctx, consts.KsctlAzureCredentials, v)
return nil
return v, nil
}

func (k *KsctlCommand) storeMongoCredentials() (err error) {
Expand Down
14 changes: 14 additions & 0 deletions cmd/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
"github.com/creack/pty"
"github.com/fatih/color"
"github.com/ksctl/cli/v2/pkg/cli"
"github.com/ksctl/cli/v2/pkg/telemetry"
"github.com/ksctl/ksctl/v2/pkg/handler/cluster/common"
"github.com/ksctl/ksctl/v2/pkg/handler/cluster/controller"
"github.com/ksctl/ksctl/v2/pkg/logger"
Expand Down Expand Up @@ -71,6 +72,7 @@ ksctl connect --help
Region: cluster.Region,
StateLocation: k.KsctlConfig.PreferedStateStore,
K8sDistro: cluster.K8sDistro,
K8sVersion: cluster.K8sVersion,
}
}

Expand All @@ -85,6 +87,18 @@ ksctl connect --help

m := valueMaping[selectedCluster]

if err := k.telemetry.Send(k.Ctx, k.l, telemetry.EventClusterConnect, telemetry.TelemetryMeta{
CloudProvider: m.Provider,
StorageDriver: m.StateLocation,
Region: m.Region,
ClusterType: m.ClusterType,
BootstrapProvider: m.K8sDistro,
K8sVersion: m.K8sVersion,
Addons: telemetry.TranslateMetadata(m.Addons),
}); err != nil {
k.l.Debug(k.Ctx, "Failed to send the telemetry", "Reason", err)
}

if k.loadCloudProviderCreds(m.Provider) != nil {
os.Exit(1)
}
Expand Down
36 changes: 36 additions & 0 deletions cmd/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"github.com/ksctl/ksctl/v2/pkg/consts"

"github.com/ksctl/cli/v2/pkg/cli"
"github.com/ksctl/cli/v2/pkg/telemetry"
"github.com/ksctl/ksctl/v2/pkg/handler/cluster/controller"

controllerManaged "github.com/ksctl/ksctl/v2/pkg/handler/cluster/managed"
Expand Down Expand Up @@ -168,6 +169,18 @@ func (k *KsctlCommand) metadataForSelfManagedCluster(

k.metadataSummary(*meta)

if err := k.telemetry.Send(k.Ctx, k.l, telemetry.EventClusterCreate, telemetry.TelemetryMeta{
CloudProvider: meta.Provider,
StorageDriver: meta.StateLocation,
Region: meta.Region,
ClusterType: meta.ClusterType,
BootstrapProvider: meta.K8sDistro,
K8sVersion: meta.K8sVersion,
Addons: telemetry.TranslateMetadata(meta.Addons),
}); err != nil {
k.l.Debug(k.Ctx, "Failed to send the telemetry", "Reason", err)
}

if ok, _ := k.menuDriven.Confirmation("Do you want to proceed with the cluster creation", cli.WithDefaultValue("no")); !ok {
os.Exit(1)
}
Expand Down Expand Up @@ -269,6 +282,29 @@ func (k *KsctlCommand) metadataForManagedCluster(

k.metadataSummary(*meta)

if err := k.telemetry.Send(k.Ctx, k.l, telemetry.EventClusterCreate, telemetry.TelemetryMeta{
CloudProvider: meta.Provider,
StorageDriver: meta.StateLocation,
Region: meta.Region,
ClusterType: meta.ClusterType,
BootstrapProvider: func() consts.KsctlKubernetes {
switch meta.Provider {
case consts.CloudLocal:
return consts.K8sKind
case consts.CloudAzure:
return consts.K8sAks
case consts.CloudAws:
return consts.K8sEks
default:
return ""
}
}(),
K8sVersion: meta.K8sVersion,
Addons: telemetry.TranslateMetadata(meta.Addons),
}); err != nil {
k.l.Debug(k.Ctx, "Failed to send the telemetry", "Reason", err)
}

if ok, _ := k.menuDriven.Confirmation("Do you want to proceed with the cluster creation", cli.WithDefaultValue("no")); !ok {
os.Exit(1)
}
Expand Down
13 changes: 13 additions & 0 deletions cmd/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"strings"

"github.com/ksctl/cli/v2/pkg/cli"
"github.com/ksctl/cli/v2/pkg/telemetry"
"github.com/ksctl/ksctl/v2/pkg/consts"
"github.com/ksctl/ksctl/v2/pkg/handler/cluster/controller"
"github.com/ksctl/ksctl/v2/pkg/handler/cluster/managed"
Expand Down Expand Up @@ -77,6 +78,18 @@ ksctl delete --help

m := valueMaping[selectedCluster]

if err := k.telemetry.Send(k.Ctx, k.l, telemetry.EventClusterDelete, telemetry.TelemetryMeta{
CloudProvider: m.Provider,
StorageDriver: m.StateLocation,
Region: m.Region,
ClusterType: m.ClusterType,
BootstrapProvider: m.K8sDistro,
K8sVersion: m.K8sVersion,
Addons: telemetry.TranslateMetadata(m.Addons),
}); err != nil {
k.l.Debug(k.Ctx, "Failed to send the telemetry", "Reason", err)
}

if ok, _ := k.menuDriven.Confirmation("Do you want to proceed with the cluster deletion", cli.WithDefaultValue("no")); !ok {
os.Exit(1)
}
Expand Down
12 changes: 12 additions & 0 deletions cmd/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"strconv"
"strings"

"github.com/ksctl/cli/v2/pkg/telemetry"
"github.com/ksctl/ksctl/v2/pkg/consts"
"github.com/ksctl/ksctl/v2/pkg/logger"
"github.com/ksctl/ksctl/v2/pkg/provider"
Expand Down Expand Up @@ -66,6 +67,17 @@ ksctl get --help

cluster := valueMaping[selectedCluster]

if err := k.telemetry.Send(k.Ctx, k.l, telemetry.EventClusterGet, telemetry.TelemetryMeta{
CloudProvider: cluster.CloudProvider,
StorageDriver: k.KsctlConfig.PreferedStateStore,
Region: cluster.Region,
ClusterType: cluster.ClusterType,
BootstrapProvider: cluster.K8sDistro,
K8sVersion: cluster.K8sVersion,
}); err != nil {
k.l.Debug(k.Ctx, "Failed to send the telemetry", "Reason", err)
}

handleTableOutputGet(k.Ctx, k.l, cluster)

},
Expand Down
1 change: 1 addition & 0 deletions cmd/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ func (k *KsctlCommand) CommandMapping() error {
cr,
k.ConfigureStorage(),
k.ConfigureCloud(),
k.ConfigureTelemetry(),
)

cli.RegisterCommand(
Expand Down
Loading

0 comments on commit ee92cce

Please sign in to comment.