From 230a08746301cc755b5ec53531cb716f8bffd2fe Mon Sep 17 00:00:00 2001 From: Gireesh Naidu Date: Mon, 29 Jul 2024 16:50:10 +0530 Subject: [PATCH] feat: expose git ops metrics --- pkg/deployment/gitOps/git/GitServiceAzure.go | 39 ++++++++++++- .../gitOps/git/GitServiceBitbucket.go | 41 ++++++++++++- pkg/deployment/gitOps/git/GitServiceGithub.go | 46 ++++++++++++++- pkg/deployment/gitOps/git/GitServiceGitlab.go | 58 ++++++++++++++++++- 4 files changed, 176 insertions(+), 8 deletions(-) diff --git a/pkg/deployment/gitOps/git/GitServiceAzure.go b/pkg/deployment/gitOps/git/GitServiceAzure.go index 156c6fd2c8..1b6060a1e1 100644 --- a/pkg/deployment/gitOps/git/GitServiceAzure.go +++ b/pkg/deployment/gitOps/git/GitServiceAzure.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" bean2 "github.com/devtron-labs/devtron/api/bean/gitOps" + globalUtil "github.com/devtron-labs/devtron/util" "github.com/devtron-labs/devtron/util/retryFunc" "github.com/microsoft/azure-devops-go-api/azuredevops" "github.com/microsoft/azure-devops-go-api/azuredevops/git" @@ -38,6 +39,12 @@ type GitAzureClient struct { } func (impl GitAzureClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl string, err error) { + + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("GetRepoUrl", "GitAzureClient", start, err) + }() + url, exists, err := impl.repoExists(config.GitRepoName, impl.project) if err != nil { return "", err @@ -65,7 +72,12 @@ func NewGitAzureClient(token string, host string, project string, logger *zap.Su }, err } -func (impl GitAzureClient) DeleteRepository(config *bean2.GitOpsConfigDto) error { +func (impl GitAzureClient) DeleteRepository(config *bean2.GitOpsConfigDto) (err error) { + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateRepository", "GitAzureClient", start, err) + }() + clientAzure := *impl.client gitRepository, err := clientAzure.GetRepository(context.Background(), git.GetRepositoryArgs{ RepositoryId: &config.GitRepoName, @@ -83,6 +95,12 @@ func (impl GitAzureClient) DeleteRepository(config *bean2.GitOpsConfigDto) error } func (impl GitAzureClient) CreateRepository(ctx context.Context, config *bean2.GitOpsConfigDto) (url string, isNew bool, detailedErrorGitOpsConfigActions DetailedErrorGitOpsConfigActions) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateRepository", "GitAzureClient", start, err) + }() + detailedErrorGitOpsConfigActions.StageErrorMap = make(map[string]error) url, repoExists, err := impl.repoExists(config.GitRepoName, impl.project) if err != nil { @@ -150,6 +168,13 @@ func (impl GitAzureClient) CreateRepository(ctx context.Context, config *bean2.G } func (impl GitAzureClient) CreateReadme(ctx context.Context, config *bean2.GitOpsConfigDto) (string, error) { + + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateReadme", "GitAzureClient", start, err) + }() + cfg := &ChartConfig{ ChartName: config.GitRepoName, ChartLocation: "", @@ -270,6 +295,12 @@ func (impl GitAzureClient) CommitValues(ctx context.Context, config *ChartConfig } func (impl GitAzureClient) repoExists(repoName, projectName string) (repoUrl string, exists bool, err error) { + + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("repoExists", "GitAzureClient", start, err) + }() + ctx := context.Background() // Get first page of the list of team projects for your organization clientAzure := *impl.client @@ -293,6 +324,12 @@ func (impl GitAzureClient) repoExists(repoName, projectName string) (repoUrl str } func (impl GitAzureClient) ensureProjectAvailabilityOnHttp(repoName string) (bool, error) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("ensureProjectAvailabilityOnHttp", "GitAzureClient", start, err) + }() + for count := 0; count < 5; count++ { _, exists, err := impl.repoExists(repoName, impl.project) if err == nil && exists { diff --git a/pkg/deployment/gitOps/git/GitServiceBitbucket.go b/pkg/deployment/gitOps/git/GitServiceBitbucket.go index 7c6e06e9d6..b1d14fa49e 100644 --- a/pkg/deployment/gitOps/git/GitServiceBitbucket.go +++ b/pkg/deployment/gitOps/git/GitServiceBitbucket.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" bean2 "github.com/devtron-labs/devtron/api/bean/gitOps" + globalUtil "github.com/devtron-labs/devtron/util" "github.com/devtron-labs/devtron/util/retryFunc" "github.com/devtron-labs/go-bitbucket" "go.uber.org/zap" @@ -59,21 +60,30 @@ func NewGitBitbucketClient(username, token, host string, logger *zap.SugaredLogg } } -func (impl GitBitbucketClient) DeleteRepository(config *bean2.GitOpsConfigDto) error { +func (impl GitBitbucketClient) DeleteRepository(config *bean2.GitOpsConfigDto) (err error) { + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("DeleteRepository", "GitBitbucketClient", start, err) + }() repoOptions := &bitbucket.RepositoryOptions{ Owner: config.BitBucketWorkspaceId, RepoSlug: config.GitRepoName, IsPrivate: "true", Project: config.BitBucketProjectKey, } - _, err := impl.client.Repositories.Repository.Delete(repoOptions) + _, err = impl.client.Repositories.Repository.Delete(repoOptions) if err != nil { - impl.logger.Errorw("error in deleting repo gitlab", "repoName", repoOptions.RepoSlug, "err", err) + impl.logger.Errorw("error in deleting repo gitlab", "repoName", config.GitRepoName, "err", err) } return err } func (impl GitBitbucketClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl string, err error) { + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("GetRepoUrl", "GitBitbucketClient", start, err) + }() + repoOptions := &bitbucket.RepositoryOptions{ Owner: config.BitBucketWorkspaceId, Project: config.BitBucketProjectKey, @@ -91,6 +101,12 @@ func (impl GitBitbucketClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUr } func (impl GitBitbucketClient) CreateRepository(ctx context.Context, config *bean2.GitOpsConfigDto) (url string, isNew bool, detailedErrorGitOpsConfigActions DetailedErrorGitOpsConfigActions) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateRepository", "GitBitbucketClient", start, err) + }() + detailedErrorGitOpsConfigActions.StageErrorMap = make(map[string]error) workSpaceId := config.BitBucketWorkspaceId @@ -103,6 +119,7 @@ func (impl GitBitbucketClient) CreateRepository(ctx context.Context, config *bea Description: config.Description, Project: projectKey, } + repoUrl, repoExists, err := impl.repoExists(repoOptions) if err != nil { impl.logger.Errorw("error in communication with bitbucket", "repoOptions", repoOptions, "err", err) @@ -164,6 +181,12 @@ func (impl GitBitbucketClient) CreateRepository(ctx context.Context, config *bea } func (impl GitBitbucketClient) repoExists(repoOptions *bitbucket.RepositoryOptions) (repoUrl string, exists bool, err error) { + + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("repoExists", "GitBitbucketClient", start, err) + }() + repo, err := impl.client.Repositories.Repository.Get(repoOptions) if repo == nil && err.Error() == BITBUCKET_REPO_NOT_FOUND_ERROR { return "", false, nil @@ -198,6 +221,12 @@ func getDir() string { } func (impl GitBitbucketClient) CreateReadme(ctx context.Context, config *bean2.GitOpsConfigDto) (string, error) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateReadme", "GitBitbucketClient", start, err) + }() + cfg := &ChartConfig{ ChartName: config.GitRepoName, ChartLocation: "", @@ -238,6 +267,12 @@ func (impl GitBitbucketClient) cleanUp(cloneDir string) { } func (impl GitBitbucketClient) CommitValues(ctx context.Context, config *ChartConfig, gitOpsConfig *bean2.GitOpsConfigDto) (commitHash string, commitTime time.Time, err error) { + + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CommitValues", "GitBitbucketClient", start, err) + }() + homeDir, err := os.UserHomeDir() if err != nil { impl.logger.Errorw("error in getting home dir", "err", err) diff --git a/pkg/deployment/gitOps/git/GitServiceGithub.go b/pkg/deployment/gitOps/git/GitServiceGithub.go index acb8177adf..e0ded17333 100644 --- a/pkg/deployment/gitOps/git/GitServiceGithub.go +++ b/pkg/deployment/gitOps/git/GitServiceGithub.go @@ -20,6 +20,7 @@ import ( "context" "fmt" bean2 "github.com/devtron-labs/devtron/api/bean/gitOps" + globalUtil "github.com/devtron-labs/devtron/util" "github.com/devtron-labs/devtron/util/retryFunc" "github.com/google/go-github/github" "go.uber.org/zap" @@ -73,7 +74,13 @@ func NewGithubClient(host string, token string, org string, logger *zap.SugaredL } func (impl GitHubClient) DeleteRepository(config *bean2.GitOpsConfigDto) error { - _, err := impl.client.Repositories.Delete(context.Background(), config.GitHubOrgId, config.GitRepoName) + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("DeleteRepository", "GitHubClient", start, err) + }() + + _, err = impl.client.Repositories.Delete(context.Background(), config.GitHubOrgId, config.GitRepoName) if err != nil { impl.logger.Errorw("repo deletion failed for github", "repo", config.GitRepoName, "err", err) return err @@ -82,9 +89,15 @@ func (impl GitHubClient) DeleteRepository(config *bean2.GitOpsConfigDto) error { } func (impl GitHubClient) CreateRepository(ctx context.Context, config *bean2.GitOpsConfigDto) (url string, isNew bool, detailedErrorGitOpsConfigActions DetailedErrorGitOpsConfigActions) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateRepository", "GitHubClient", start, err) + }() + detailedErrorGitOpsConfigActions.StageErrorMap = make(map[string]error) repoExists := true - url, err := impl.GetRepoUrl(config) + url, err = impl.GetRepoUrl(config) if err != nil { responseErr, ok := err.(*github.ErrorResponse) if !ok || responseErr.Response.StatusCode != 404 { @@ -155,6 +168,12 @@ func (impl GitHubClient) CreateRepository(ctx context.Context, config *bean2.Git } func (impl GitHubClient) CreateReadme(ctx context.Context, config *bean2.GitOpsConfigDto) (string, error) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateReadme", "GitHubClient", start, err) + }() + cfg := &ChartConfig{ ChartName: config.GitRepoName, ChartLocation: "", @@ -173,6 +192,12 @@ func (impl GitHubClient) CreateReadme(ctx context.Context, config *bean2.GitOpsC } func (impl GitHubClient) CommitValues(ctx context.Context, config *ChartConfig, gitOpsConfig *bean2.GitOpsConfigDto) (commitHash string, commitTime time.Time, err error) { + + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CommitValues", "GitHubClient", start, err) + }() + branch := "master" path := filepath.Join(config.ChartLocation, config.FileName) newFile := false @@ -223,6 +248,11 @@ func (impl GitHubClient) CommitValues(ctx context.Context, config *ChartConfig, } func (impl GitHubClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl string, err error) { + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("GetRepoUrl", "GitHubClient", start, err) + }() + ctx := context.Background() repo, _, err := impl.client.Repositories.Get(ctx, impl.org, config.GitRepoName) if err != nil { @@ -232,6 +262,12 @@ func (impl GitHubClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl stri } func (impl GitHubClient) ensureProjectAvailabilityOnHttp(config *bean2.GitOpsConfigDto) (bool, error) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("ensureProjectAvailabilityOnHttp", "GitHubClient", start, err) + }() + count := 0 for count < 3 { count = count + 1 @@ -252,6 +288,12 @@ func (impl GitHubClient) ensureProjectAvailabilityOnHttp(config *bean2.GitOpsCon } func (impl GitHubClient) ensureProjectAvailabilityOnSsh(projectName string, repoUrl string) (bool, error) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("ensureProjectAvailabilityOnSsh", "GitHubClient", start, err) + }() + count := 0 for count < 3 { count = count + 1 diff --git a/pkg/deployment/gitOps/git/GitServiceGitlab.go b/pkg/deployment/gitOps/git/GitServiceGitlab.go index 9cf8a15a66..8ecb33b863 100644 --- a/pkg/deployment/gitOps/git/GitServiceGitlab.go +++ b/pkg/deployment/gitOps/git/GitServiceGitlab.go @@ -21,6 +21,7 @@ import ( "fmt" bean2 "github.com/devtron-labs/devtron/api/bean/gitOps" "github.com/devtron-labs/devtron/pkg/deployment/gitOps/git/bean" + globalUtil "github.com/devtron-labs/devtron/util" "github.com/devtron-labs/devtron/util/retryFunc" "github.com/xanzy/go-gitlab" "go.uber.org/zap" @@ -110,8 +111,13 @@ func CreateGitlabClient(host, token string) (*gitlab.Client, error) { return gitLabClient, err } -func (impl GitLabClient) DeleteRepository(config *bean2.GitOpsConfigDto) error { - err := impl.DeleteProject(config.GitRepoName) +func (impl GitLabClient) DeleteRepository(config *bean2.GitOpsConfigDto) (err error) { + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("DeleteRepository", "GitLabClient", start, err) + }() + + err = impl.DeleteProject(config.GitRepoName) if err != nil { impl.logger.Errorw("error in deleting repo gitlab", "project", config.GitRepoName, "err", err) } @@ -119,6 +125,13 @@ func (impl GitLabClient) DeleteRepository(config *bean2.GitOpsConfigDto) error { } func (impl GitLabClient) CreateRepository(ctx context.Context, config *bean2.GitOpsConfigDto) (url string, isNew bool, detailedErrorGitOpsConfigActions DetailedErrorGitOpsConfigActions) { + + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateRepository", "GitLabClient", start, err) + }() + detailedErrorGitOpsConfigActions.StageErrorMap = make(map[string]error) impl.logger.Debugw("gitlab app create request ", "name", config.GitRepoName, "description", config.Description) repoUrl, err := impl.GetRepoUrl(config) @@ -178,11 +191,21 @@ func (impl GitLabClient) CreateRepository(ctx context.Context, config *bean2.Git } func (impl GitLabClient) DeleteProject(projectName string) (err error) { + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("DeleteProject", "GitLabClient", start, err) + }() + impl.logger.Infow("deleting project ", "gitlab project name", projectName) _, err = impl.client.Projects.DeleteProject(fmt.Sprintf("%s/%s", impl.config.GitlabGroupPath, projectName)) return err } func (impl GitLabClient) createProject(name, description string) (url string, err error) { + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("createProject", "GitLabClient", start, err) + }() + var namespace = impl.config.GitlabGroupId namespaceId, err := strconv.Atoi(namespace) if err != nil { @@ -208,6 +231,13 @@ func (impl GitLabClient) createProject(name, description string) (url string, er } func (impl GitLabClient) ensureProjectAvailability(projectName string) (bool, error) { + + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("ensureProjectAvailability", "GitLabClient", start, err) + }() + pid := fmt.Sprintf("%s/%s", impl.config.GitlabGroupPath, projectName) count := 0 verified := false @@ -227,6 +257,12 @@ func (impl GitLabClient) ensureProjectAvailability(projectName string) (bool, er } func (impl GitLabClient) ensureProjectAvailabilityOnSsh(projectName string, repoUrl string) (bool, error) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("ensureProjectAvailabilityOnSsh", "GitLabClient", start, err) + }() + count := 0 for count < 3 { count = count + 1 @@ -244,6 +280,12 @@ func (impl GitLabClient) ensureProjectAvailabilityOnSsh(projectName string, repo } func (impl GitLabClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl string, err error) { + + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("GetRepoUrl", "GitLabClient", start, err) + }() + pid := fmt.Sprintf("%s/%s", impl.config.GitlabGroupPath, config.GitRepoName) prop, res, err := impl.client.Projects.GetProject(pid, &gitlab.GetProjectOptions{}) if err != nil { @@ -260,6 +302,12 @@ func (impl GitLabClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl stri } func (impl GitLabClient) CreateReadme(ctx context.Context, config *bean2.GitOpsConfigDto) (string, error) { + var err error + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CreateReadme", "GitLabClient", start, err) + }() + fileAction := gitlab.FileCreate filePath := "README.md" fileContent := "devtron licence" @@ -289,6 +337,12 @@ func (impl GitLabClient) checkIfFileExists(projectName, ref, file string) (exist } func (impl GitLabClient) CommitValues(ctx context.Context, config *ChartConfig, gitOpsConfig *bean2.GitOpsConfigDto) (commitHash string, commitTime time.Time, err error) { + + start := time.Now() + defer func() { + globalUtil.TriggerGitOpsMetrics("CommitValues", "GitLabClient", start, err) + }() + branch := "master" path := filepath.Join(config.ChartLocation, config.FileName) exists, err := impl.checkIfFileExists(config.ChartRepoName, branch, path)