github.com/argoproj/argo-cd/v3@v3.2.1/commitserver/metrics/metrics.go (about) 1 package metrics 2 3 import ( 4 "net/http" 5 "time" 6 7 "github.com/prometheus/client_golang/prometheus" 8 "github.com/prometheus/client_golang/prometheus/collectors" 9 "github.com/prometheus/client_golang/prometheus/promhttp" 10 ) 11 12 // Server is a prometheus server which collects application metrics. 13 type Server struct { 14 handler http.Handler 15 commitPendingRequestsGauge *prometheus.GaugeVec 16 gitRequestCounter *prometheus.CounterVec 17 gitRequestHistogram *prometheus.HistogramVec 18 commitRequestHistogram *prometheus.HistogramVec 19 userInfoRequestHistogram *prometheus.HistogramVec 20 commitRequestCounter *prometheus.CounterVec 21 } 22 23 // GitRequestType is the type of git request 24 type GitRequestType string 25 26 const ( 27 // GitRequestTypeLsRemote is a request to list remote refs 28 GitRequestTypeLsRemote = "ls-remote" 29 // GitRequestTypeFetch is a request to fetch from remote 30 GitRequestTypeFetch = "fetch" 31 // GitRequestTypePush is a request to push to remote 32 GitRequestTypePush = "push" 33 ) 34 35 // CommitResponseType is the type of response for a commit request 36 type CommitResponseType string 37 38 const ( 39 // CommitResponseTypeSuccess is a successful commit request 40 CommitResponseTypeSuccess CommitResponseType = "success" 41 // CommitResponseTypeFailure is a failed commit request 42 CommitResponseTypeFailure CommitResponseType = "failure" 43 ) 44 45 // NewMetricsServer returns a new prometheus server which collects application metrics. 46 func NewMetricsServer() *Server { 47 registry := prometheus.NewRegistry() 48 registry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{})) 49 registry.MustRegister(collectors.NewGoCollector()) 50 51 commitPendingRequestsGauge := prometheus.NewGaugeVec( 52 prometheus.GaugeOpts{ 53 Name: "argocd_commitserver_commit_pending_request_total", 54 Help: "Number of pending commit requests", 55 }, 56 []string{"repo"}, 57 ) 58 registry.MustRegister(commitPendingRequestsGauge) 59 60 gitRequestCounter := prometheus.NewCounterVec( 61 prometheus.CounterOpts{ 62 Name: "argocd_commitserver_git_request_total", 63 Help: "Number of git requests performed by repo server", 64 }, 65 []string{"repo", "request_type"}, 66 ) 67 registry.MustRegister(gitRequestCounter) 68 69 gitRequestHistogram := prometheus.NewHistogramVec( 70 prometheus.HistogramOpts{ 71 Name: "argocd_commitserver_git_request_duration_seconds", 72 Help: "Git requests duration seconds.", 73 Buckets: []float64{0.1, 0.25, .5, 1, 2, 4, 10, 20}, 74 }, 75 []string{"repo", "request_type"}, 76 ) 77 registry.MustRegister(gitRequestHistogram) 78 79 commitRequestHistogram := prometheus.NewHistogramVec( 80 prometheus.HistogramOpts{ 81 Name: "argocd_commitserver_commit_request_duration_seconds", 82 Help: "Commit request duration seconds.", 83 Buckets: []float64{0.1, 0.25, .5, 1, 2, 4, 10, 20}, 84 }, 85 []string{"repo", "response_type"}, 86 ) 87 registry.MustRegister(commitRequestHistogram) 88 89 userInfoRequestHistogram := prometheus.NewHistogramVec( 90 prometheus.HistogramOpts{ 91 Name: "argocd_commitserver_userinfo_request_duration_seconds", 92 Help: "Userinfo request duration seconds.", 93 Buckets: []float64{0.1, 0.25, .5, 1, 2, 4, 10, 20}, 94 }, 95 []string{"repo", "credential_type"}, 96 ) 97 registry.MustRegister(userInfoRequestHistogram) 98 99 commitRequestCounter := prometheus.NewCounterVec( 100 prometheus.CounterOpts{ 101 Name: "argocd_commitserver_commit_request_total", 102 Help: "Number of commit requests performed handled", 103 }, 104 []string{"repo", "response_type"}, 105 ) 106 registry.MustRegister(commitRequestCounter) 107 108 return &Server{ 109 handler: promhttp.HandlerFor(registry, promhttp.HandlerOpts{}), 110 commitPendingRequestsGauge: commitPendingRequestsGauge, 111 gitRequestCounter: gitRequestCounter, 112 gitRequestHistogram: gitRequestHistogram, 113 commitRequestHistogram: commitRequestHistogram, 114 userInfoRequestHistogram: userInfoRequestHistogram, 115 commitRequestCounter: commitRequestCounter, 116 } 117 } 118 119 // GetHandler returns the http.Handler for the prometheus server 120 func (m *Server) GetHandler() http.Handler { 121 return m.handler 122 } 123 124 // IncPendingCommitRequest increments the pending commit requests gauge 125 func (m *Server) IncPendingCommitRequest(repo string) { 126 m.commitPendingRequestsGauge.WithLabelValues(repo).Inc() 127 } 128 129 // DecPendingCommitRequest decrements the pending commit requests gauge 130 func (m *Server) DecPendingCommitRequest(repo string) { 131 m.commitPendingRequestsGauge.WithLabelValues(repo).Dec() 132 } 133 134 // IncGitRequest increments the git requests counter 135 func (m *Server) IncGitRequest(repo string, requestType GitRequestType) { 136 m.gitRequestCounter.WithLabelValues(repo, string(requestType)).Inc() 137 } 138 139 // ObserveGitRequestDuration observes the duration of a git request 140 func (m *Server) ObserveGitRequestDuration(repo string, requestType GitRequestType, duration time.Duration) { 141 m.gitRequestHistogram.WithLabelValues(repo, string(requestType)).Observe(duration.Seconds()) 142 } 143 144 // ObserveCommitRequestDuration observes the duration of a commit request 145 func (m *Server) ObserveCommitRequestDuration(repo string, rt CommitResponseType, duration time.Duration) { 146 m.commitRequestHistogram.WithLabelValues(repo, string(rt)).Observe(duration.Seconds()) 147 } 148 149 // ObserveUserInfoRequestDuration observes the duration of a userinfo request 150 func (m *Server) ObserveUserInfoRequestDuration(repo string, credentialType string, duration time.Duration) { 151 m.userInfoRequestHistogram.WithLabelValues(repo, credentialType).Observe(duration.Seconds()) 152 } 153 154 // IncCommitRequest increments the commit request counter 155 func (m *Server) IncCommitRequest(repo string, rt CommitResponseType) { 156 m.commitRequestCounter.WithLabelValues(repo, string(rt)).Inc() 157 }