Skip to content

Commit

Permalink
feat: added posthog events for cloud provider and version (#4443)
Browse files Browse the repository at this point in the history
* added cloud provider event

* added logger for testing

* logger removed

* common-lib version upgraded
  • Loading branch information
ashishdevtron committed Jan 22, 2024
1 parent 7cff679 commit c3987b8
Show file tree
Hide file tree
Showing 18 changed files with 689 additions and 47 deletions.
4 changes: 4 additions & 0 deletions Wire.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ package main

import (
"github.com/devtron-labs/authenticator/middleware"
cloudProviderIdentifier "github.com/devtron-labs/common-lib/cloud-provider-identifier"
pubsub1 "github.com/devtron-labs/common-lib/pubsub-lib"
util4 "github.com/devtron-labs/common-lib/utils/k8s"
"github.com/devtron-labs/devtron/api/apiToken"
Expand Down Expand Up @@ -714,6 +715,9 @@ func InitializeApp() (*App, error) {
wire.Bind(new(restHandler.TelemetryRestHandler), new(*restHandler.TelemetryRestHandlerImpl)),
telemetry.NewPosthogClient,

cloudProviderIdentifier.NewProviderIdentifierServiceImpl,
wire.Bind(new(cloudProviderIdentifier.ProviderIdentifierService), new(*cloudProviderIdentifier.ProviderIdentifierServiceImpl)),

telemetry.NewTelemetryEventClientImplExtended,
wire.Bind(new(telemetry.TelemetryEventClient), new(*telemetry.TelemetryEventClientImplExtended)),

Expand Down
117 changes: 93 additions & 24 deletions client/telemetry/TelemetryEventClient.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
cloudProviderIdentifier "github.com/devtron-labs/common-lib/cloud-provider-identifier"
"net/http"
"time"

Expand Down Expand Up @@ -40,22 +41,23 @@ const SKIPPED_ONBOARDING_CONST = "SkippedOnboarding"
const ADMIN_EMAIL_ID_CONST = "admin"

type TelemetryEventClientImpl struct {
cron *cron.Cron
logger *zap.SugaredLogger
client *http.Client
clusterService cluster.ClusterService
K8sUtil *k8s.K8sServiceImpl
aCDAuthConfig *util3.ACDAuthConfig
userService user2.UserService
attributeRepo repository.AttributesRepository
ssoLoginService sso.SSOLoginService
PosthogClient *PosthogClient
moduleRepository moduleRepo.ModuleRepository
serverDataStore *serverDataStore.ServerDataStore
userAuditService user2.UserAuditService
helmAppClient client.HelmAppClient
InstalledAppRepository repository2.InstalledAppRepository
userAttributesRepository repository.UserAttributesRepository
cron *cron.Cron
logger *zap.SugaredLogger
client *http.Client
clusterService cluster.ClusterService
K8sUtil *k8s.K8sServiceImpl
aCDAuthConfig *util3.ACDAuthConfig
userService user2.UserService
attributeRepo repository.AttributesRepository
ssoLoginService sso.SSOLoginService
PosthogClient *PosthogClient
moduleRepository moduleRepo.ModuleRepository
serverDataStore *serverDataStore.ServerDataStore
userAuditService user2.UserAuditService
helmAppClient client.HelmAppClient
InstalledAppRepository repository2.InstalledAppRepository
userAttributesRepository repository.UserAttributesRepository
cloudProviderIdentifierService cloudProviderIdentifier.ProviderIdentifierService
}

type TelemetryEventClient interface {
Expand All @@ -70,7 +72,8 @@ type TelemetryEventClient interface {
func NewTelemetryEventClientImpl(logger *zap.SugaredLogger, client *http.Client, clusterService cluster.ClusterService,
K8sUtil *k8s.K8sServiceImpl, aCDAuthConfig *util3.ACDAuthConfig, userService user2.UserService,
attributeRepo repository.AttributesRepository, ssoLoginService sso.SSOLoginService,
PosthogClient *PosthogClient, moduleRepository moduleRepo.ModuleRepository, serverDataStore *serverDataStore.ServerDataStore, userAuditService user2.UserAuditService, helmAppClient client.HelmAppClient, InstalledAppRepository repository2.InstalledAppRepository) (*TelemetryEventClientImpl, error) {
PosthogClient *PosthogClient, moduleRepository moduleRepo.ModuleRepository, serverDataStore *serverDataStore.ServerDataStore, userAuditService user2.UserAuditService, helmAppClient client.HelmAppClient, InstalledAppRepository repository2.InstalledAppRepository,
cloudProviderIdentifierService cloudProviderIdentifier.ProviderIdentifierService) (*TelemetryEventClientImpl, error) {
cron := cron.New(
cron.WithChain())
cron.Start()
Expand All @@ -80,13 +83,14 @@ func NewTelemetryEventClientImpl(logger *zap.SugaredLogger, client *http.Client,
client: client, clusterService: clusterService,
K8sUtil: K8sUtil, aCDAuthConfig: aCDAuthConfig,
userService: userService, attributeRepo: attributeRepo,
ssoLoginService: ssoLoginService,
PosthogClient: PosthogClient,
moduleRepository: moduleRepository,
serverDataStore: serverDataStore,
userAuditService: userAuditService,
helmAppClient: helmAppClient,
InstalledAppRepository: InstalledAppRepository,
ssoLoginService: ssoLoginService,
PosthogClient: PosthogClient,
moduleRepository: moduleRepository,
serverDataStore: serverDataStore,
userAuditService: userAuditService,
helmAppClient: helmAppClient,
InstalledAppRepository: InstalledAppRepository,
cloudProviderIdentifierService: cloudProviderIdentifierService,
}

watcher.HeartbeatEventForTelemetry()
Expand Down Expand Up @@ -132,6 +136,7 @@ type TelemetryEventEA struct {
SkippedOnboarding bool `json:"SkippedOnboarding"`
HelmChartSuccessfulDeploymentCount int `json:"helmChartSuccessfulDeploymentCount,omitempty"`
ExternalHelmAppClusterCount map[int32]int `json:"ExternalHelmAppClusterCount,omitempty"`
ClusterProvider string `json:"clusterProvider,omitempty"`
}

const DevtronUniqueClientIdConfigMap = "devtron-ucid"
Expand Down Expand Up @@ -315,6 +320,13 @@ func (impl *TelemetryEventClientImpl) SendSummaryEvent(eventType string) error {
payload.HelmChartSuccessfulDeploymentCount = helmChartSuccessfulDeploymentCount
payload.ExternalHelmAppClusterCount = ExternalHelmAppClusterCount

provider, err := impl.cloudProviderIdentifierService.IdentifyProvider()
if err != nil {
impl.logger.Errorw("exception while getting cluster provider", "error", err)
return err
}
payload.ClusterProvider = provider

latestUser, err := impl.userAuditService.GetLatestUser()
if err == nil {
loginTime := latestUser.UpdatedOn
Expand Down Expand Up @@ -459,8 +471,27 @@ func (impl *TelemetryEventClientImpl) SendTelemetryInstallEventEA() (*TelemetryE
return nil, err
}

discoveryClient, err := impl.K8sUtil.GetK8sDiscoveryClientInCluster()
if err != nil {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return nil, err
}
k8sServerVersion, err := discoveryClient.ServerVersion()
if err != nil {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return nil, err
}

payload := &TelemetryEventEA{UCID: ucid, Timestamp: time.Now(), EventType: InstallationSuccess, DevtronVersion: "v1"}
payload.DevtronMode = util.GetDevtronVersion().ServerMode
payload.ServerVersion = k8sServerVersion.String()

provider, err := impl.cloudProviderIdentifierService.IdentifyProvider()
if err != nil {
impl.logger.Errorw("exception while getting cluster provider", "error", err)
return nil, err
}
payload.ClusterProvider = provider

reqBody, err := json.Marshal(payload)
if err != nil {
Expand Down Expand Up @@ -507,8 +538,27 @@ func (impl *TelemetryEventClientImpl) SendTelemetryDashboardAccessEvent() error
return err
}

discoveryClient, err := impl.K8sUtil.GetK8sDiscoveryClientInCluster()
if err != nil {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return err
}
k8sServerVersion, err := discoveryClient.ServerVersion()
if err != nil {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return err
}

payload := &TelemetryEventEA{UCID: ucid, Timestamp: time.Now(), EventType: DashboardAccessed, DevtronVersion: "v1"}
payload.DevtronMode = util.GetDevtronVersion().ServerMode
payload.ServerVersion = k8sServerVersion.String()

provider, err := impl.cloudProviderIdentifierService.IdentifyProvider()
if err != nil {
impl.logger.Errorw("exception while getting cluster provider", "error", err)
return err
}
payload.ClusterProvider = provider

reqBody, err := json.Marshal(payload)
if err != nil {
Expand Down Expand Up @@ -555,8 +605,27 @@ func (impl *TelemetryEventClientImpl) SendTelemetryDashboardLoggedInEvent() erro
return err
}

discoveryClient, err := impl.K8sUtil.GetK8sDiscoveryClientInCluster()
if err != nil {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return err
}
k8sServerVersion, err := discoveryClient.ServerVersion()
if err != nil {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return err
}

payload := &TelemetryEventEA{UCID: ucid, Timestamp: time.Now(), EventType: DashboardLoggedIn, DevtronVersion: "v1"}
payload.DevtronMode = util.GetDevtronVersion().ServerMode
payload.ServerVersion = k8sServerVersion.String()

provider, err := impl.cloudProviderIdentifierService.IdentifyProvider()
if err != nil {
impl.logger.Errorw("exception while getting cluster provider", "error", err)
return err
}
payload.ClusterProvider = provider

reqBody, err := json.Marshal(payload)
if err != nil {
Expand Down
45 changes: 28 additions & 17 deletions client/telemetry/TelemetryEventClientExtended.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package telemetry

import (
"encoding/json"
cloudProviderIdentifier "github.com/devtron-labs/common-lib/cloud-provider-identifier"
"net/http"
"time"

Expand Down Expand Up @@ -59,7 +60,8 @@ func NewTelemetryEventClientImplExtended(logger *zap.SugaredLogger, client *http
materialRepository pipelineConfig.MaterialRepository, ciTemplateRepository pipelineConfig.CiTemplateRepository,
chartRepository chartRepoRepository.ChartRepository, userAuditService user2.UserAuditService,
ciBuildConfigService pipeline.CiBuildConfigService, moduleRepository moduleRepo.ModuleRepository, serverDataStore *serverDataStore.ServerDataStore,
helmAppClient client.HelmAppClient, InstalledAppRepository repository2.InstalledAppRepository, userAttributesRepository repository.UserAttributesRepository) (*TelemetryEventClientImplExtended, error) {
helmAppClient client.HelmAppClient, InstalledAppRepository repository2.InstalledAppRepository, userAttributesRepository repository.UserAttributesRepository,
cloudProviderIdentifierService cloudProviderIdentifier.ProviderIdentifierService) (*TelemetryEventClientImplExtended, error) {

cron := cron.New(
cron.WithChain())
Expand All @@ -81,22 +83,23 @@ func NewTelemetryEventClientImplExtended(logger *zap.SugaredLogger, client *http
ciBuildConfigService: ciBuildConfigService,

TelemetryEventClientImpl: &TelemetryEventClientImpl{
cron: cron,
logger: logger,
client: client,
clusterService: clusterService,
K8sUtil: K8sUtil,
aCDAuthConfig: aCDAuthConfig,
userService: userService,
attributeRepo: attributeRepo,
ssoLoginService: ssoLoginService,
PosthogClient: PosthogClient,
moduleRepository: moduleRepository,
serverDataStore: serverDataStore,
userAuditService: userAuditService,
helmAppClient: helmAppClient,
InstalledAppRepository: InstalledAppRepository,
userAttributesRepository: userAttributesRepository,
cron: cron,
logger: logger,
client: client,
clusterService: clusterService,
K8sUtil: K8sUtil,
aCDAuthConfig: aCDAuthConfig,
userService: userService,
attributeRepo: attributeRepo,
ssoLoginService: ssoLoginService,
PosthogClient: PosthogClient,
moduleRepository: moduleRepository,
serverDataStore: serverDataStore,
userAuditService: userAuditService,
helmAppClient: helmAppClient,
InstalledAppRepository: InstalledAppRepository,
userAttributesRepository: userAttributesRepository,
cloudProviderIdentifierService: cloudProviderIdentifierService,
},
}

Expand Down Expand Up @@ -167,6 +170,7 @@ type TelemetryEventDto struct {
HelmAppUpdateCounter string `json:"HelmAppUpdateCounter,omitempty"`
HelmChartSuccessfulDeploymentCount int `json:"helmChartSuccessfulDeploymentCount,omitempty"`
ExternalHelmAppClusterCount map[int32]int `json:"ExternalHelmAppClusterCount"`
ClusterProvider string `json:"clusterProvider,omitempty"`
}

func (impl *TelemetryEventClientImplExtended) SummaryEventForTelemetry() {
Expand Down Expand Up @@ -322,6 +326,13 @@ func (impl *TelemetryEventClientImplExtended) SendSummaryEvent(eventType string)
payload.HelmChartSuccessfulDeploymentCount = HelmChartSuccessfulDeploymentCount
payload.ExternalHelmAppClusterCount = ExternalHelmAppClusterCount

provider, err := impl.cloudProviderIdentifierService.IdentifyProvider()
if err != nil {
impl.logger.Errorw("exception while getting cluster provider", "error", err)
return err
}
payload.ClusterProvider = provider

latestUser, err := impl.userAuditService.GetLatestUser()
if err == nil {
loginTime := latestUser.UpdatedOn
Expand Down
3 changes: 3 additions & 0 deletions cmd/external-app/wire.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package main

import (
"github.com/devtron-labs/authenticator/middleware"
cloudProviderIdentifier "github.com/devtron-labs/common-lib/cloud-provider-identifier"
util4 "github.com/devtron-labs/common-lib/utils/k8s"
"github.com/devtron-labs/devtron/api/apiToken"
chartProvider "github.com/devtron-labs/devtron/api/appStore/chartProvider"
Expand Down Expand Up @@ -114,6 +115,8 @@ func InitializeApp() (*App, error) {
wire.Bind(new(session.ServiceClient), new(*middleware.LoginService)),
connector.NewPumpImpl,
wire.Bind(new(connector.Pump), new(*connector.PumpImpl)),
cloudProviderIdentifier.NewProviderIdentifierServiceImpl,
wire.Bind(new(cloudProviderIdentifier.ProviderIdentifierService), new(*cloudProviderIdentifier.ProviderIdentifierServiceImpl)),

telemetry.NewTelemetryEventClientImpl,
wire.Bind(new(telemetry.TelemetryEventClient), new(*telemetry.TelemetryEventClientImpl)),
Expand Down
4 changes: 3 additions & 1 deletion cmd/external-app/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ require (
github.com/davecgh/go-spew v1.1.1
github.com/deckarep/golang-set v1.8.0
github.com/devtron-labs/authenticator v0.4.33
github.com/devtron-labs/common-lib v0.0.10-0.20240119134712-5ed4eed5fc0e
github.com/devtron-labs/common-lib v0.0.10
github.com/devtron-labs/protos v0.0.0-20230503113602-282404f70fd2
github.com/evanphx/json-patch v5.6.0+incompatible
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,8 @@ github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4 h1:YcpmyvADG
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
github.com/devtron-labs/authenticator v0.4.33 h1:FpAV3ZgFluaRFcMwPpwxr/mwSipJ16XRvgABq3BzP5Y=
github.com/devtron-labs/authenticator v0.4.33/go.mod h1:ozNfT8WcruiSgnUbyp48WVfc41++W6xYXhKFp67lNTU=
github.com/devtron-labs/common-lib v0.0.10-0.20240119134712-5ed4eed5fc0e h1:tPD2kWowGhgH3g5TRZMKgrvuNAgpFE6E6sxZaTAHNSU=
github.com/devtron-labs/common-lib v0.0.10-0.20240119134712-5ed4eed5fc0e/go.mod h1:95/DizzVXu1kHap/VwEvdxwgd+BvPVYc0bJzt8yqGDU=
github.com/devtron-labs/common-lib v0.0.10 h1:3ayOUwIedXTvBEj80mKJ0iLo06glZ9nzY/WFsYFpYGM=
github.com/devtron-labs/common-lib v0.0.10/go.mod h1:95/DizzVXu1kHap/VwEvdxwgd+BvPVYc0bJzt8yqGDU=
github.com/devtron-labs/protos v0.0.0-20230503113602-282404f70fd2 h1:/IEIsJTxDZ3hv8uOoCaqdWCXqcv7nCAgX9AP/v84dUY=
github.com/devtron-labs/protos v0.0.0-20230503113602-282404f70fd2/go.mod h1:l85jxWHlcSo910hdUfRycL40yGzC6glE93V1sVxVPto=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
Expand Down

0 comments on commit c3987b8

Please sign in to comment.