github.com/argoproj/argo-cd/v2@v2.10.9/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 gitRequestCounter *prometheus.CounterVec 16 gitRequestHistogram *prometheus.HistogramVec 17 repoPendingRequestsGauge *prometheus.GaugeVec 18 redisRequestCounter *prometheus.CounterVec 19 redisRequestHistogram *prometheus.HistogramVec 20 } 21 22 type GitRequestType string 23 24 const ( 25 GitRequestTypeLsRemote = "ls-remote" 26 GitRequestTypeFetch = "fetch" 27 ) 28 29 // NewMetricsServer returns a new prometheus server which collects application metrics. 30 func NewMetricsServer() *MetricsServer { 31 registry := prometheus.NewRegistry() 32 registry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{})) 33 registry.MustRegister(collectors.NewGoCollector()) 34 35 gitRequestCounter := prometheus.NewCounterVec( 36 prometheus.CounterOpts{ 37 Name: "argocd_git_request_total", 38 Help: "Number of git requests performed by repo server", 39 }, 40 []string{"repo", "request_type"}, 41 ) 42 registry.MustRegister(gitRequestCounter) 43 44 gitRequestHistogram := prometheus.NewHistogramVec( 45 prometheus.HistogramOpts{ 46 Name: "argocd_git_request_duration_seconds", 47 Help: "Git requests duration seconds.", 48 Buckets: []float64{0.1, 0.25, .5, 1, 2, 4, 10, 20}, 49 }, 50 []string{"repo", "request_type"}, 51 ) 52 registry.MustRegister(gitRequestHistogram) 53 54 repoPendingRequestsGauge := prometheus.NewGaugeVec( 55 prometheus.GaugeOpts{ 56 Name: "argocd_repo_pending_request_total", 57 Help: "Number of pending requests requiring repository lock", 58 }, 59 []string{"repo"}, 60 ) 61 registry.MustRegister(repoPendingRequestsGauge) 62 63 redisRequestCounter := prometheus.NewCounterVec( 64 prometheus.CounterOpts{ 65 Name: "argocd_redis_request_total", 66 Help: "Number of kubernetes requests executed during application reconciliation.", 67 }, 68 []string{"initiator", "failed"}, 69 ) 70 registry.MustRegister(redisRequestCounter) 71 72 redisRequestHistogram := prometheus.NewHistogramVec( 73 prometheus.HistogramOpts{ 74 Name: "argocd_redis_request_duration_seconds", 75 Help: "Redis requests duration seconds.", 76 Buckets: []float64{0.1, 0.25, .5, 1, 2}, 77 }, 78 []string{"initiator"}, 79 ) 80 registry.MustRegister(redisRequestHistogram) 81 82 return &MetricsServer{ 83 handler: promhttp.HandlerFor(registry, promhttp.HandlerOpts{}), 84 gitRequestCounter: gitRequestCounter, 85 gitRequestHistogram: gitRequestHistogram, 86 repoPendingRequestsGauge: repoPendingRequestsGauge, 87 redisRequestCounter: redisRequestCounter, 88 redisRequestHistogram: redisRequestHistogram, 89 } 90 } 91 92 func (m *MetricsServer) GetHandler() http.Handler { 93 return m.handler 94 } 95 96 // IncGitRequest increments the git requests counter 97 func (m *MetricsServer) IncGitRequest(repo string, requestType GitRequestType) { 98 m.gitRequestCounter.WithLabelValues(repo, string(requestType)).Inc() 99 } 100 101 func (m *MetricsServer) IncPendingRepoRequest(repo string) { 102 m.repoPendingRequestsGauge.WithLabelValues(repo).Inc() 103 } 104 105 func (m *MetricsServer) ObserveGitRequestDuration(repo string, requestType GitRequestType, duration time.Duration) { 106 m.gitRequestHistogram.WithLabelValues(repo, string(requestType)).Observe(duration.Seconds()) 107 } 108 109 func (m *MetricsServer) DecPendingRepoRequest(repo string) { 110 m.repoPendingRequestsGauge.WithLabelValues(repo).Dec() 111 } 112 113 func (m *MetricsServer) IncRedisRequest(failed bool) { 114 m.redisRequestCounter.WithLabelValues("argocd-repo-server", strconv.FormatBool(failed)).Inc() 115 } 116 117 func (m *MetricsServer) ObserveRedisRequestDuration(duration time.Duration) { 118 m.redisRequestHistogram.WithLabelValues("argocd-repo-server").Observe(duration.Seconds()) 119 }