Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: added posthog events for cloud provider and version #4443

Merged
merged 5 commits into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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