github.com/argoproj/argo-cd/v2@v2.10.9/server/metrics/metrics.go (about)

     1  package metrics
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"strconv"
     7  	"time"
     8  
     9  	"github.com/prometheus/client_golang/prometheus"
    10  	"github.com/prometheus/client_golang/prometheus/promhttp"
    11  
    12  	"github.com/argoproj/argo-cd/v2/util/profile"
    13  )
    14  
    15  type MetricsServer struct {
    16  	*http.Server
    17  	redisRequestCounter   *prometheus.CounterVec
    18  	redisRequestHistogram *prometheus.HistogramVec
    19  }
    20  
    21  var (
    22  	redisRequestCounter = prometheus.NewCounterVec(
    23  		prometheus.CounterOpts{
    24  			Name: "argocd_redis_request_total",
    25  			Help: "Number of kubernetes requests executed during application reconciliation.",
    26  		},
    27  		[]string{"initiator", "failed"},
    28  	)
    29  	redisRequestHistogram = prometheus.NewHistogramVec(
    30  		prometheus.HistogramOpts{
    31  			Name:    "argocd_redis_request_duration",
    32  			Help:    "Redis requests duration.",
    33  			Buckets: []float64{0.1, 0.25, .5, 1, 2},
    34  		},
    35  		[]string{"initiator"},
    36  	)
    37  )
    38  
    39  // NewMetricsServer returns a new prometheus server which collects api server metrics
    40  func NewMetricsServer(host string, port int) *MetricsServer {
    41  	mux := http.NewServeMux()
    42  	registry := prometheus.NewRegistry()
    43  	mux.Handle("/metrics", promhttp.HandlerFor(prometheus.Gatherers{
    44  		registry,
    45  		prometheus.DefaultGatherer,
    46  	}, promhttp.HandlerOpts{}))
    47  	profile.RegisterProfiler(mux)
    48  
    49  	registry.MustRegister(redisRequestCounter)
    50  	registry.MustRegister(redisRequestHistogram)
    51  
    52  	return &MetricsServer{
    53  		Server: &http.Server{
    54  			Addr:    fmt.Sprintf("%s:%d", host, port),
    55  			Handler: mux,
    56  		},
    57  		redisRequestCounter:   redisRequestCounter,
    58  		redisRequestHistogram: redisRequestHistogram,
    59  	}
    60  }
    61  
    62  func (m *MetricsServer) IncRedisRequest(failed bool) {
    63  	m.redisRequestCounter.WithLabelValues("argocd-server", strconv.FormatBool(failed)).Inc()
    64  }
    65  
    66  // ObserveRedisRequestDuration observes redis request duration
    67  func (m *MetricsServer) ObserveRedisRequestDuration(duration time.Duration) {
    68  	m.redisRequestHistogram.WithLabelValues("argocd-server").Observe(duration.Seconds())
    69  }