diff --git a/pkg/deployment/gitOps/git/GitServiceAzure.go b/pkg/deployment/gitOps/git/GitServiceAzure.go index e8682cade8..4252901a23 100644 --- a/pkg/deployment/gitOps/git/GitServiceAzure.go +++ b/pkg/deployment/gitOps/git/GitServiceAzure.go @@ -22,6 +22,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" @@ -39,6 +40,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 @@ -67,7 +74,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, @@ -85,6 +97,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 { @@ -152,6 +170,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: "", @@ -272,6 +297,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 @@ -295,6 +326,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 606da7d434..ab4efa3fb0 100644 --- a/pkg/deployment/gitOps/git/GitServiceBitbucket.go +++ b/pkg/deployment/gitOps/git/GitServiceBitbucket.go @@ -63,21 +63,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() { + util.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() { + util.TriggerGitOpsMetrics("GetRepoUrl", "GitBitbucketClient", start, err) + }() + repoOptions := &bitbucket.RepositoryOptions{ Owner: config.BitBucketWorkspaceId, Project: config.BitBucketProjectKey, @@ -95,6 +104,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() { + util.TriggerGitOpsMetrics("CreateRepository", "GitBitbucketClient", start, err) + }() + detailedErrorGitOpsConfigActions.StageErrorMap = make(map[string]error) workSpaceId := config.BitBucketWorkspaceId @@ -107,6 +122,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) @@ -168,6 +184,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() { + util.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 @@ -202,6 +224,12 @@ func getDir() string { } func (impl GitBitbucketClient) CreateReadme(ctx context.Context, config *bean2.GitOpsConfigDto) (string, error) { + var err error + start := time.Now() + defer func() { + util.TriggerGitOpsMetrics("CreateReadme", "GitBitbucketClient", start, err) + }() + cfg := &ChartConfig{ ChartName: config.GitRepoName, ChartLocation: "", @@ -242,6 +270,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() { + util.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 0ec43594c8..589d79c2ac 100644 --- a/pkg/deployment/gitOps/git/GitServiceGithub.go +++ b/pkg/deployment/gitOps/git/GitServiceGithub.go @@ -21,6 +21,7 @@ import ( "crypto/tls" "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" @@ -76,7 +77,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 @@ -85,9 +92,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 { @@ -158,6 +171,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: "", @@ -176,6 +195,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 @@ -226,6 +251,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 { @@ -235,6 +265,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 @@ -255,6 +291,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 b4a91de319..5182d65bb3 100644 --- a/pkg/deployment/gitOps/git/GitServiceGitlab.go +++ b/pkg/deployment/gitOps/git/GitServiceGitlab.go @@ -114,8 +114,13 @@ func CreateGitlabClient(host, token string, tlsConfig *tls.Config) (*gitlab.Clie 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() { + util.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) } @@ -123,6 +128,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() { + util.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) @@ -182,11 +194,21 @@ func (impl GitLabClient) CreateRepository(ctx context.Context, config *bean2.Git } func (impl GitLabClient) DeleteProject(projectName string) (err error) { + start := time.Now() + defer func() { + util.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() { + util.TriggerGitOpsMetrics("createProject", "GitLabClient", start, err) + }() + var namespace = impl.config.GitlabGroupId namespaceId, err := strconv.Atoi(namespace) if err != nil { @@ -212,6 +234,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() { + util.TriggerGitOpsMetrics("ensureProjectAvailability", "GitLabClient", start, err) + }() + pid := fmt.Sprintf("%s/%s", impl.config.GitlabGroupPath, projectName) count := 0 verified := false @@ -231,6 +260,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() { + util.TriggerGitOpsMetrics("ensureProjectAvailabilityOnSsh", "GitLabClient", start, err) + }() + count := 0 for count < 3 { count = count + 1 @@ -248,6 +283,12 @@ func (impl GitLabClient) ensureProjectAvailabilityOnSsh(projectName string, repo } func (impl GitLabClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl string, err error) { + + start := time.Now() + defer func() { + util.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 { @@ -264,6 +305,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() { + util.TriggerGitOpsMetrics("CreateReadme", "GitLabClient", start, err) + }() + fileAction := gitlab.FileCreate filePath := "README.md" fileContent := "devtron licence" @@ -293,6 +340,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() { + util.TriggerGitOpsMetrics("CommitValues", "GitLabClient", start, err) + }() + branch := "master" path := filepath.Join(config.ChartLocation, config.FileName) exists, err := impl.checkIfFileExists(config.ChartRepoName, branch, path)