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  }