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  }