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  }