github.com/argoproj/argo-cd/v2@v2.10.9/reposerver/metrics/githandlers.go (about) 1 package metrics 2 3 import ( 4 "context" 5 "math" 6 "time" 7 8 "golang.org/x/sync/semaphore" 9 10 "github.com/argoproj/argo-cd/v2/util/env" 11 "github.com/argoproj/argo-cd/v2/util/git" 12 ) 13 14 var ( 15 lsRemoteParallelismLimit = env.ParseInt64FromEnv("ARGOCD_GIT_LS_REMOTE_PARALLELISM_LIMIT", 0, 0, math.MaxInt64) 16 lsRemoteParallelismLimitSemaphore *semaphore.Weighted 17 ) 18 19 func init() { 20 if lsRemoteParallelismLimit > 0 { 21 lsRemoteParallelismLimitSemaphore = semaphore.NewWeighted(lsRemoteParallelismLimit) 22 } 23 } 24 25 // NewGitClientEventHandlers creates event handlers that update Git related metrics 26 func NewGitClientEventHandlers(metricsServer *MetricsServer) git.EventHandlers { 27 return git.EventHandlers{ 28 OnFetch: func(repo string) func() { 29 startTime := time.Now() 30 metricsServer.IncGitRequest(repo, GitRequestTypeFetch) 31 return func() { 32 metricsServer.ObserveGitRequestDuration(repo, GitRequestTypeFetch, time.Since(startTime)) 33 } 34 }, 35 OnLsRemote: func(repo string) func() { 36 startTime := time.Now() 37 metricsServer.IncGitRequest(repo, GitRequestTypeLsRemote) 38 if lsRemoteParallelismLimitSemaphore != nil { 39 // The `Acquire` method returns either `nil` or error of the provided context. The 40 // context.Background() is never canceled, so it is safe to ignore the error. 41 _ = lsRemoteParallelismLimitSemaphore.Acquire(context.Background(), 1) 42 } 43 return func() { 44 if lsRemoteParallelismLimitSemaphore != nil { 45 lsRemoteParallelismLimitSemaphore.Release(1) 46 } 47 metricsServer.ObserveGitRequestDuration(repo, GitRequestTypeLsRemote, time.Since(startTime)) 48 } 49 }, 50 } 51 }