github.com/argoproj/argo-cd/v3@v3.2.1/reposerver/metrics/metrics.go (about) 1 package metrics 2 3 import ( 4 "net/http" 5 "strconv" 6 "time" 7 8 "github.com/prometheus/client_golang/prometheus" 9 "github.com/prometheus/client_golang/prometheus/collectors" 10 "github.com/prometheus/client_golang/prometheus/promhttp" 11 ) 12 13 type MetricsServer struct { 14 handler http.Handler 15 gitFetchFailCounter *prometheus.CounterVec 16 gitLsRemoteFailCounter *prometheus.CounterVec 17 gitRequestCounter *prometheus.CounterVec 18 gitRequestHistogram *prometheus.HistogramVec 19 repoPendingRequestsGauge *prometheus.GaugeVec 20 redisRequestCounter *prometheus.CounterVec 21 redisRequestHistogram *prometheus.HistogramVec 22 PrometheusRegistry *prometheus.Registry 23 } 24 25 type GitRequestType string 26 27 const ( 28 GitRequestTypeLsRemote = "ls-remote" 29 GitRequestTypeFetch = "fetch" 30 ) 31 32 // NewMetricsServer returns a new prometheus server which collects application metrics. 33 func NewMetricsServer() *MetricsServer { 34 registry := prometheus.NewRegistry() 35 registry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{})) 36 registry.MustRegister(collectors.NewGoCollector()) 37 38 gitFetchFailCounter := prometheus.NewCounterVec( 39 prometheus.CounterOpts{ 40 Name: "argocd_git_fetch_fail_total", 41 Help: "Number of git fetch requests failures by repo server", 42 }, 43 []string{"repo", "revision"}, 44 ) 45 registry.MustRegister(gitFetchFailCounter) 46 47 gitLsRemoteFailCounter := prometheus.NewCounterVec( 48 prometheus.CounterOpts{ 49 Name: "argocd_git_lsremote_fail_total", 50 Help: "Number of git ls-remote requests failures by repo server", 51 }, 52 []string{"repo", "revision"}, 53 ) 54 registry.MustRegister(gitLsRemoteFailCounter) 55 56 gitRequestCounter := prometheus.NewCounterVec( 57 prometheus.CounterOpts{ 58 Name: "argocd_git_request_total", 59 Help: "Number of git requests performed by repo server", 60 }, 61 []string{"repo", "request_type"}, 62 ) 63 registry.MustRegister(gitRequestCounter) 64 65 gitRequestHistogram := prometheus.NewHistogramVec( 66 prometheus.HistogramOpts{ 67 Name: "argocd_git_request_duration_seconds", 68 Help: "Git requests duration seconds.", 69 Buckets: []float64{0.1, 0.25, .5, 1, 2, 4, 10, 20}, 70 }, 71 []string{"repo", "request_type"}, 72 ) 73 registry.MustRegister(gitRequestHistogram) 74 75 repoPendingRequestsGauge := prometheus.NewGaugeVec( 76 prometheus.GaugeOpts{ 77 Name: "argocd_repo_pending_request_total", 78 Help: "Number of pending requests requiring repository lock", 79 }, 80 []string{"repo"}, 81 ) 82 registry.MustRegister(repoPendingRequestsGauge) 83 84 redisRequestCounter := prometheus.NewCounterVec( 85 prometheus.CounterOpts{ 86 Name: "argocd_redis_request_total", 87 Help: "Number of kubernetes requests executed during application reconciliation.", 88 }, 89 []string{"initiator", "failed"}, 90 ) 91 registry.MustRegister(redisRequestCounter) 92 93 redisRequestHistogram := prometheus.NewHistogramVec( 94 prometheus.HistogramOpts{ 95 Name: "argocd_redis_request_duration_seconds", 96 Help: "Redis requests duration seconds.", 97 Buckets: []float64{0.1, 0.25, .5, 1, 2}, 98 }, 99 []string{"initiator"}, 100 ) 101 registry.MustRegister(redisRequestHistogram) 102 103 return &MetricsServer{ 104 handler: promhttp.HandlerFor(registry, promhttp.HandlerOpts{}), 105 gitFetchFailCounter: gitFetchFailCounter, 106 gitLsRemoteFailCounter: gitLsRemoteFailCounter, 107 gitRequestCounter: gitRequestCounter, 108 gitRequestHistogram: gitRequestHistogram, 109 repoPendingRequestsGauge: repoPendingRequestsGauge, 110 redisRequestCounter: redisRequestCounter, 111 redisRequestHistogram: redisRequestHistogram, 112 PrometheusRegistry: registry, 113 } 114 } 115 116 func (m *MetricsServer) GetHandler() http.Handler { 117 return m.handler 118 } 119 120 func (m *MetricsServer) IncGitFetchFail(repo string, revision string) { 121 m.gitFetchFailCounter.WithLabelValues(repo, revision).Inc() 122 } 123 124 func (m *MetricsServer) IncGitLsRemoteFail(repo string, revision string) { 125 m.gitLsRemoteFailCounter.WithLabelValues(repo, revision).Inc() 126 } 127 128 // IncGitRequest increments the git requests counter 129 func (m *MetricsServer) IncGitRequest(repo string, requestType GitRequestType) { 130 m.gitRequestCounter.WithLabelValues(repo, string(requestType)).Inc() 131 } 132 133 func (m *MetricsServer) IncPendingRepoRequest(repo string) { 134 m.repoPendingRequestsGauge.WithLabelValues(repo).Inc() 135 } 136 137 func (m *MetricsServer) ObserveGitRequestDuration(repo string, requestType GitRequestType, duration time.Duration) { 138 m.gitRequestHistogram.WithLabelValues(repo, string(requestType)).Observe(duration.Seconds()) 139 } 140 141 func (m *MetricsServer) DecPendingRepoRequest(repo string) { 142 m.repoPendingRequestsGauge.WithLabelValues(repo).Dec() 143 } 144 145 func (m *MetricsServer) IncRedisRequest(failed bool) { 146 m.redisRequestCounter.WithLabelValues("argocd-repo-server", strconv.FormatBool(failed)).Inc() 147 } 148 149 func (m *MetricsServer) ObserveRedisRequestDuration(duration time.Duration) { 150 m.redisRequestHistogram.WithLabelValues("argocd-repo-server").Observe(duration.Seconds()) 151 }