Skip to content
117 changes: 1 addition & 116 deletions client/telemetry/TelemetryEventClient.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,8 @@ import (
"fmt"
cloudProviderIdentifier "github.com/devtron-labs/common-lib/cloud-provider-identifier"
posthogTelemetry "github.com/devtron-labs/common-lib/telemetry"
"github.com/devtron-labs/common-lib/utils/k8s/commonBean"
"github.com/devtron-labs/devtron/api/helm-app/gRPC"
installedAppReader "github.com/devtron-labs/devtron/pkg/appStore/installedApp/read"
bean2 "github.com/devtron-labs/devtron/pkg/attributes/bean"
"github.com/devtron-labs/devtron/pkg/auth/user/bean"
bean3 "github.com/devtron-labs/devtron/pkg/cluster/bean"
module2 "github.com/devtron-labs/devtron/pkg/module/bean"
ucidService "github.com/devtron-labs/devtron/pkg/ucid"
cron3 "github.com/devtron-labs/devtron/util/cron"
Expand All @@ -49,9 +45,7 @@ import (
"github.com/go-pg/pg"
"github.com/posthog/posthog-go"
"github.com/robfig/cron/v3"
"github.com/tidwall/gjson"
"go.uber.org/zap"
"k8s.io/apimachinery/pkg/version"
)

type TelemetryEventClientImpl struct {
Expand Down Expand Up @@ -154,115 +148,6 @@ func (impl *TelemetryEventClientImpl) StopCron() {
impl.cron.Stop()
}

func (impl *TelemetryEventClientImpl) SummaryDetailsForTelemetry() (cluster []bean3.ClusterBean, user []bean.UserInfo,
k8sServerVersion *version.Info, hostURL bool, ssoSetup bool, HelmAppAccessCount string, ChartStoreVisitCount string,
SkippedOnboarding bool, HelmAppUpdateCounter string, helmChartSuccessfulDeploymentCount int, ExternalHelmAppClusterCount map[int32]int) {

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

users, err := impl.userService.GetAll()
if err != nil && err != pg.ErrNoRows {
impl.logger.Errorw("exception caught inside telemetry summery event", "err", err)
return
}

clusters, err := impl.clusterService.FindAllActive()

if err != nil && err != pg.ErrNoRows {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return
}

hostURL = false

attribute, err := impl.attributeRepo.FindByKey(bean2.HostUrlKey)
if err == nil && attribute.Id > 0 {
hostURL = true
}

attribute, err = impl.attributeRepo.FindByKey("HelmAppAccessCounter")

if err == nil {
HelmAppAccessCount = attribute.Value
}

attribute, err = impl.attributeRepo.FindByKey("ChartStoreVisitCount")

if err == nil {
ChartStoreVisitCount = attribute.Value
}

attribute, err = impl.attributeRepo.FindByKey("HelmAppUpdateCounter")

if err == nil {
HelmAppUpdateCounter = attribute.Value
}

helmChartSuccessfulDeploymentCount, err = impl.installedAppReadService.GetDeploymentSuccessfulStatusCountForTelemetry()

//externalHelmCount := make(map[int32]int)
ExternalHelmAppClusterCount = make(map[int32]int)

for _, clusterDetail := range clusters {
req := &gRPC.AppListRequest{}
config := &gRPC.ClusterConfig{
ApiServerUrl: clusterDetail.ServerUrl,
Token: clusterDetail.Config[commonBean.BearerToken],
ClusterId: int32(clusterDetail.Id),
ClusterName: clusterDetail.ClusterName,
InsecureSkipTLSVerify: clusterDetail.InsecureSkipTLSVerify,
}

if clusterDetail.InsecureSkipTLSVerify == false {
config.KeyData = clusterDetail.Config[commonBean.TlsKey]
config.CertData = clusterDetail.Config[commonBean.CertData]
config.CaData = clusterDetail.Config[commonBean.CertificateAuthorityData]
}
req.Clusters = append(req.Clusters, config)
applicationStream, err := impl.helmAppClient.ListApplication(context.Background(), req)
if err == nil {
clusterList, err1 := applicationStream.Recv()
if err1 != nil {
impl.logger.Errorw("error in list helm applications streams recv", "err", err)
}
if err1 != nil && clusterList != nil && !clusterList.Errored {
ExternalHelmAppClusterCount[clusterList.ClusterId] = len(clusterList.DeployedAppDetail)
}
} else {
impl.logger.Errorw("error while fetching list application from kubelink", "err", err)
}
}

//getting userData from emailId
userData, err := impl.userAttributesRepository.GetUserDataByEmailId(AdminEmailIdConst)

SkippedOnboardingValue := gjson.Get(userData, SkippedOnboardingConst).Str

if SkippedOnboardingValue == "true" {
SkippedOnboarding = true
} else {
SkippedOnboarding = false
}

ssoSetup = false

ssoConfig, err := impl.ssoLoginService.GetAll()
if err == nil && len(ssoConfig) > 0 {
ssoSetup = true
}

return clusters, users, k8sServerVersion, hostURL, ssoSetup, HelmAppAccessCount, ChartStoreVisitCount, SkippedOnboarding, HelmAppUpdateCounter, helmChartSuccessfulDeploymentCount, ExternalHelmAppClusterCount
}

// New methods for collecting additional telemetry metrics

func (impl *TelemetryEventClientImpl) SummaryEventForTelemetryEA() {
Expand Down Expand Up @@ -291,7 +176,7 @@ func (impl *TelemetryEventClientImpl) SendSummaryEvent(eventType string) error {
return err
}

clusters, users, k8sServerVersion, hostURL, ssoSetup, HelmAppAccessCount, ChartStoreVisitCount, SkippedOnboarding, HelmAppUpdateCounter, helmChartSuccessfulDeploymentCount, ExternalHelmAppClusterCount := impl.SummaryDetailsForTelemetry()
clusters, users, k8sServerVersion, hostURL, ssoSetup, HelmAppAccessCount, ChartStoreVisitCount, SkippedOnboarding, HelmAppUpdateCounter, helmChartSuccessfulDeploymentCount, ExternalHelmAppClusterCount := impl.GetSummaryDetailsForTelemetry()

payload := &TelemetryEventEA{UCID: ucid, Timestamp: time.Now(), EventType: TelemetryEventType(eventType), DevtronVersion: "v1"}
payload.ServerVersion = k8sServerVersion.String()
Expand Down
31 changes: 29 additions & 2 deletions client/telemetry/TelemetryEventClientExtended.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ func (impl *TelemetryEventClientImplExtended) SendSummaryEvent(eventType string)
return err
}

clusters, users, k8sServerVersion, hostURL, ssoSetup, HelmAppAccessCount, ChartStoreVisitCount, SkippedOnboarding, HelmAppUpdateCounter, HelmChartSuccessfulDeploymentCount, ExternalHelmAppClusterCount := impl.SummaryDetailsForTelemetry()
clusters, users, k8sServerVersion, hostURL, ssoSetup, HelmAppAccessCount, ChartStoreVisitCount, SkippedOnboarding, HelmAppUpdateCounter, HelmChartSuccessfulDeploymentCount, ExternalHelmAppClusterCount := impl.GetSummaryDetailsForTelemetry()
payload := &TelemetryEventDto{UCID: ucid, Timestamp: time.Now(), EventType: TelemetryEventType(eventType), DevtronVersion: "v1"}
payload.ServerVersion = k8sServerVersion.String()

Expand Down Expand Up @@ -345,12 +345,39 @@ func (impl *TelemetryEventClientImplExtended) SendSummaryEvent(eventType string)
payload.JobPipelineTriggeredLast24h = impl.getJobPipelineTriggeredLast24h()
payload.JobPipelineSucceededLast24h = impl.getJobPipelineSucceededLast24h()
payload.UserCreatedPluginCount = impl.getUserCreatedPluginCount()
payload.PolicyCount = impl.getPolicyCount()
payload.DeploymentWindowPolicyCount = impl.getDeploymentWindowPolicyCount()
payload.ApprovalPolicyCount = impl.getApprovalPolicyCount()
payload.PluginPolicyCount = impl.getPluginPolicyCount()
payload.TagsPolicyCount = impl.getTagsPolicyCount()
payload.FilterConditionPolicyCount = impl.getFilterConditionPolicyCount()
payload.LockDeploymentConfigurationPolicyCount = impl.getLockDeploymentConfigurationPolicyCount()
payload.AppliedPolicyRowCount = impl.getAppliedPolicyRowCount()
payload.PhysicalClusterCount, payload.IsolatedClusterCount = impl.getClusterCounts()
payload.ActiveUsersLast30Days = impl.getActiveUsersLast30Days()
payload.GitOpsPipelineCount = impl.getGitOpsPipelineCount()
payload.HelmPipelineCount = impl.helmPipelineCount()
payload.ProjectsWithZeroAppsCount = impl.getProjectsWithZeroAppsCount()
payload.AppsWithPropagationTagsCount = impl.getAppsWithPropagationTagsCount()
payload.AppsWithNonPropagationTagsCount = impl.getAppsWithNonPropagationTagsCount()
payload.AppsWithDescriptionCount = impl.getAppsWithDescriptionCount()
payload.AppsWithCatalogDataCount = impl.getAppsWithCatalogDataCount()
payload.AppsWithReadmeDataCount = impl.getAppsWithReadmeDataCount()
payload.HighestEnvironmentCountInApp = impl.getHighestEnvironmentCountInApp()
payload.HighestAppCountInEnvironment = impl.getHighestAppCountInEnvironment()
payload.HighestWorkflowCountInApp = impl.getHighestWorkflowCountInApp()
payload.HighestEnvironmentCountInWorkflow = impl.getHighestEnvironmentCountInWorkflow()
payload.HighestGitRepoCountInApp = impl.getHighestGitRepoCountInApp()
payload.AppsWithIncludeExcludeFilesCount = impl.getAppsWithIncludeExcludeFilesCount()
payload.DockerfileLanguagesList = impl.getDockerfileLanguagesList()
payload.BuildpackLanguagesList = impl.getBuildpackLanguagesList()
payload.AppsWithDeploymentChartCount = impl.getAppsWithDeploymentChartCount()
payload.AppsWithRolloutChartCount = impl.getAppsWithRolloutChartCount()
payload.AppsWithStatefulsetCount = impl.getAppsWithStatefulsetCount()
payload.AppsWithJobsCronjobsCount = impl.getAppsWithJobsCronjobsCount()
payload.EnvironmentsWithPatchStrategyCount = impl.getEnvironmentsWithPatchStrategyCount()
payload.EnvironmentsWithReplaceStrategyCount = impl.getEnvironmentsWithReplaceStrategyCount()
payload.ExternalConfigMapCount = impl.getExternalConfigMapCount()
payload.InternalConfigMapCount = impl.getInternalConfigMapCount()

payload.ClusterProvider, err = impl.GetCloudProvider()
if err != nil {
Expand Down
55 changes: 41 additions & 14 deletions client/telemetry/bean.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,18 +142,45 @@ type TelemetryEventDto struct {
ExternalHelmAppClusterCount map[int32]int `json:"ExternalHelmAppClusterCount"`
ClusterProvider string `json:"clusterProvider,omitempty"`
// New telemetry fields
HelmAppCount int `json:"helmAppCount,omitempty"`
DevtronAppCount int `json:"devtronAppCount,omitempty"`
JobCount int `json:"jobCount,omitempty"`
JobPipelineCount int `json:"jobPipelineCount,omitempty"`
JobPipelineTriggeredLast24h int `json:"jobPipelineTriggeredLast24h,omitempty"`
JobPipelineSucceededLast24h int `json:"jobPipelineSucceededLast24h,omitempty"`
UserCreatedPluginCount int `json:"userCreatedPluginCount,omitempty"`
PolicyCount int `json:"policyCount,omitempty"`
AppliedPolicyRowCount int `json:"appliedPolicyRowCount,omitempty"`
PhysicalClusterCount int `json:"physicalClusterCount,omitempty"`
IsolatedClusterCount int `json:"isolatedClusterCount,omitempty"`
ActiveUsersLast30Days int `json:"activeUsersLast30Days,omitempty"`
GitOpsPipelineCount int `json:"gitOpsPipelineCount,omitempty"`
HelmPipelineCount int `json:"helmPipelineCount,omitempty"`
HelmAppCount int `json:"helmAppCount,omitempty"`
DevtronAppCount int `json:"devtronAppCount,omitempty"`
JobCount int `json:"jobCount,omitempty"`
JobPipelineCount int `json:"jobPipelineCount,omitempty"`
JobPipelineTriggeredLast24h int `json:"jobPipelineTriggeredLast24h,omitempty"`
JobPipelineSucceededLast24h int `json:"jobPipelineSucceededLast24h,omitempty"`
UserCreatedPluginCount int `json:"userCreatedPluginCount,omitempty"`
DeploymentWindowPolicyCount int `json:"deploymentWindowPolicyCount,omitempty"`
ApprovalPolicyCount int `json:"approvalPolicyCount,omitempty"`
PluginPolicyCount int `json:"pluginPolicyCount,omitempty"`
TagsPolicyCount int `json:"tagsPolicyCount,omitempty"`
FilterConditionPolicyCount int `json:"filterConditionPolicyCount,omitempty"`
LockDeploymentConfigurationPolicyCount int `json:"lockDeploymentConfigurationPolicyCount,omitempty"`
AppliedPolicyRowCount int `json:"appliedPolicyRowCount,omitempty"`
PhysicalClusterCount int `json:"physicalClusterCount,omitempty"`
IsolatedClusterCount int `json:"isolatedClusterCount,omitempty"`
ActiveUsersLast30Days int `json:"activeUsersLast30Days,omitempty"`
GitOpsPipelineCount int `json:"gitOpsPipelineCount,omitempty"`
HelmPipelineCount int `json:"helmPipelineCount,omitempty"`
ProjectsWithZeroAppsCount int `json:"projectsWithZeroAppsCount,omitempty"`
AppsWithPropagationTagsCount int `json:"appsWithPropagationTagsCount,omitempty"`
AppsWithNonPropagationTagsCount int `json:"appsWithNonPropagationTagsCount,omitempty"`
AppsWithDescriptionCount int `json:"appsWithDescriptionCount,omitempty"`
AppsWithCatalogDataCount int `json:"appsWithCatalogDataCount,omitempty"`
AppsWithReadmeDataCount int `json:"appsWithReadmeDataCount,omitempty"`
HighestEnvironmentCountInApp int `json:"highestEnvironmentCountInApp,omitempty"`
HighestAppCountInEnvironment int `json:"highestAppCountInEnvironment,omitempty"`
HighestWorkflowCountInApp int `json:"highestWorkflowCountInApp,omitempty"`
HighestEnvironmentCountInWorkflow int `json:"highestEnvironmentCountInWorkflow,omitempty"`
HighestGitRepoCountInApp int `json:"highestGitRepoCountInApp,omitempty"`
AppsWithIncludeExcludeFilesCount int `json:"appsWithIncludeExcludeFilesCount,omitempty"`
DockerfileLanguagesList []string `json:"dockerfileLanguagesList,omitempty"`
BuildpackLanguagesList []string `json:"buildpackLanguagesList,omitempty"`
AppsWithDeploymentChartCount int `json:"appsWithDeploymentChartCount,omitempty"`
AppsWithRolloutChartCount int `json:"appsWithRolloutChartCount,omitempty"`
AppsWithStatefulsetCount int `json:"appsWithStatefulsetCount,omitempty"`
AppsWithJobsCronjobsCount int `json:"appsWithJobsCronjobsCount,omitempty"`
EnvironmentsWithPatchStrategyCount int `json:"environmentsWithPatchStrategyCount,omitempty"`
EnvironmentsWithReplaceStrategyCount int `json:"environmentsWithReplaceStrategyCount,omitempty"`
ExternalConfigMapCount int `json:"externalConfigMapCount,omitempty"`
InternalConfigMapCount int `json:"internalConfigMapCount,omitempty"`
}
122 changes: 122 additions & 0 deletions client/telemetry/telemetryQueries.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
package telemetry

import (
"context"
"errors"
"github.com/devtron-labs/common-lib/utils/k8s/commonBean"
"github.com/devtron-labs/devtron/api/helm-app/gRPC"
bean3 "github.com/devtron-labs/devtron/pkg/attributes/bean"
bean2 "github.com/devtron-labs/devtron/pkg/auth/user/bean"
"github.com/devtron-labs/devtron/pkg/cluster/bean"
"github.com/go-pg/pg"
"github.com/tidwall/gjson"
"k8s.io/apimachinery/pkg/version"
)

// EA-mode compatible telemetry queries - no imports needed for current methods

func (impl *TelemetryEventClientImpl) getHelmAppCount() int {
Expand Down Expand Up @@ -56,3 +69,112 @@ func (impl *TelemetryEventClientImpl) getActiveUsersLast30Days() int {
impl.logger.Debugw("counted active users in last 30 days", "count", count)
return count
}

func (impl *TelemetryEventClientImpl) GetSummaryDetailsForTelemetry() (cluster []bean.ClusterBean, user []bean2.UserInfo,
k8sServerVersion *version.Info, hostURL bool, ssoSetup bool, HelmAppAccessCount string, ChartStoreVisitCount string,
SkippedOnboarding bool, HelmAppUpdateCounter string, helmChartSuccessfulDeploymentCount int, ExternalHelmAppClusterCount map[int32]int) {

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

users, err := impl.userService.GetAll()
if err != nil && !errors.Is(err, pg.ErrNoRows) {
impl.logger.Errorw("exception caught inside telemetry summery event", "err", err)
return
}

clusters, err := impl.clusterService.FindAllActive()

if err != nil && !errors.Is(err, pg.ErrNoRows) {
impl.logger.Errorw("exception caught inside telemetry summary event", "err", err)
return
}

hostURL = false

attribute, err := impl.attributeRepo.FindByKey(bean3.HostUrlKey)
if err == nil && attribute.Id > 0 {
hostURL = true
}

attribute, err = impl.attributeRepo.FindByKey("HelmAppAccessCounter")

if err == nil {
HelmAppAccessCount = attribute.Value
}

attribute, err = impl.attributeRepo.FindByKey("ChartStoreVisitCount")

if err == nil {
ChartStoreVisitCount = attribute.Value
}

attribute, err = impl.attributeRepo.FindByKey("HelmAppUpdateCounter")

if err == nil {
HelmAppUpdateCounter = attribute.Value
}

helmChartSuccessfulDeploymentCount, err = impl.installedAppReadService.GetDeploymentSuccessfulStatusCountForTelemetry()

//externalHelmCount := make(map[int32]int)
ExternalHelmAppClusterCount = make(map[int32]int)

for _, clusterDetail := range clusters {
req := &gRPC.AppListRequest{}
config := &gRPC.ClusterConfig{
ApiServerUrl: clusterDetail.ServerUrl,
Token: clusterDetail.Config[commonBean.BearerToken],
ClusterId: int32(clusterDetail.Id),
ClusterName: clusterDetail.ClusterName,
InsecureSkipTLSVerify: clusterDetail.InsecureSkipTLSVerify,
}

if clusterDetail.InsecureSkipTLSVerify == false {
config.KeyData = clusterDetail.Config[commonBean.TlsKey]
config.CertData = clusterDetail.Config[commonBean.CertData]
config.CaData = clusterDetail.Config[commonBean.CertificateAuthorityData]
}
req.Clusters = append(req.Clusters, config)
applicationStream, err := impl.helmAppClient.ListApplication(context.Background(), req)
if err == nil {
clusterList, err1 := applicationStream.Recv()
if err1 != nil {
impl.logger.Errorw("error in list helm applications streams recv", "err", err)
}
if err1 != nil && clusterList != nil && !clusterList.Errored {
ExternalHelmAppClusterCount[clusterList.ClusterId] = len(clusterList.DeployedAppDetail)
}
} else {
impl.logger.Errorw("error while fetching list application from kubelink", "err", err)
}
}

//getting userData from emailId
userData, err := impl.userAttributesRepository.GetUserDataByEmailId(AdminEmailIdConst)

SkippedOnboardingValue := gjson.Get(userData, SkippedOnboardingConst).Str

if SkippedOnboardingValue == "true" {
SkippedOnboarding = true
} else {
SkippedOnboarding = false
}

ssoSetup = false

ssoConfig, err := impl.ssoLoginService.GetAll()
if err == nil && len(ssoConfig) > 0 {
ssoSetup = true
}

return clusters, users, k8sServerVersion, hostURL, ssoSetup, HelmAppAccessCount, ChartStoreVisitCount, SkippedOnboarding, HelmAppUpdateCounter, helmChartSuccessfulDeploymentCount, ExternalHelmAppClusterCount
}
Loading
Loading