feat: Export metrics to track number of users (#20801) (#23343)

Signed-off-by: Sathiya Narayanan Venkatesan <sathiyavenkat06@gmail.com>
Signed-off-by: sathiya06 <64639742+sathiya06@users.noreply.github.com>
This commit is contained in:
sathiya06
2025-06-30 13:00:33 -04:00
committed by GitHub
parent 0a0176f4fd
commit 3401d3bf92
5 changed files with 54 additions and 2 deletions

View File

@@ -20,6 +20,7 @@ type MetricsServer struct {
redisRequestHistogram *prometheus.HistogramVec
extensionRequestCounter *prometheus.CounterVec
extensionRequestDuration *prometheus.HistogramVec
loginRequestCounter *prometheus.CounterVec
}
var (
@@ -53,6 +54,13 @@ var (
},
[]string{"extension"},
)
loginRequestCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "argocd_login_request_total",
Help: "Number of login requests to the Argo CD API server.",
},
[]string{"status"},
)
argoVersion = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "argocd_info",
@@ -78,6 +86,7 @@ func NewMetricsServer(host string, port int) *MetricsServer {
registry.MustRegister(redisRequestHistogram)
registry.MustRegister(extensionRequestCounter)
registry.MustRegister(extensionRequestDuration)
registry.MustRegister(loginRequestCounter)
registry.MustRegister(argoVersion)
kubectl.RegisterWithClientGo()
@@ -92,6 +101,7 @@ func NewMetricsServer(host string, port int) *MetricsServer {
redisRequestHistogram: redisRequestHistogram,
extensionRequestCounter: extensionRequestCounter,
extensionRequestDuration: extensionRequestDuration,
loginRequestCounter: loginRequestCounter,
}
}
@@ -111,3 +121,9 @@ func (m *MetricsServer) IncExtensionRequestCounter(extension string, status int)
func (m *MetricsServer) ObserveExtensionRequestDuration(extension string, duration time.Duration) {
m.extensionRequestDuration.WithLabelValues(extension).Observe(duration.Seconds())
}
// IncLoginRequestCounter increments the login request counter with the given status
// status can be "success" or "failure"
func (m *MetricsServer) IncLoginRequestCounter(status string) {
m.loginRequestCounter.WithLabelValues(status).Inc()
}

View File

@@ -573,6 +573,9 @@ func (server *ArgoCDServer) Run(ctx context.Context, listeners *Listeners) {
server.userStateStorage.Init(ctx)
svcSet := newArgoCDServiceSet(server)
if server.sessionMgr != nil {
server.sessionMgr.CollectMetrics(metricsServ)
}
server.serviceSet = svcSet
grpcS, appResourceTreeFn := server.newGRPCServer()
grpcWebS := grpcweb.WrapServer(grpcS)

View File

@@ -29,6 +29,11 @@ type Authenticator interface {
Authenticate(ctx context.Context) (context.Context, error)
}
const (
success = "success"
failure = "failure"
)
// NewServer returns a new instance of the Session service
func NewServer(mgr *sessionmgr.SessionManager, settingsMgr *settings.SettingsManager, authenticator Authenticator, policyEnf *rbacpolicy.RBACPolicyEnforcer, rateLimiter func() (utilio.Closer, error)) *Server {
return &Server{mgr, settingsMgr, authenticator, policyEnf, rateLimiter}
@@ -40,27 +45,33 @@ func (s *Server) Create(_ context.Context, q *session.SessionCreateRequest) (*se
if s.limitLoginAttempts != nil {
closer, err := s.limitLoginAttempts()
if err != nil {
s.mgr.IncLoginRequestCounter(failure)
return nil, err
}
defer utilio.Close(closer)
}
if q.Token != "" {
s.mgr.IncLoginRequestCounter(failure)
return nil, status.Errorf(codes.Unauthenticated, "token-based session creation no longer supported. please upgrade argocd cli to v0.7+")
}
if q.Username == "" || q.Password == "" {
s.mgr.IncLoginRequestCounter(failure)
return nil, status.Errorf(codes.Unauthenticated, "no credentials supplied")
}
err := s.mgr.VerifyUsernamePassword(q.Username, q.Password)
if err != nil {
s.mgr.IncLoginRequestCounter(failure)
return nil, err
}
uniqueId, err := uuid.NewRandom()
if err != nil {
s.mgr.IncLoginRequestCounter(failure)
return nil, err
}
argoCDSettings, err := s.settingsMgr.GetSettings()
if err != nil {
s.mgr.IncLoginRequestCounter(failure)
return nil, err
}
jwtToken, err := s.mgr.Create(
@@ -68,8 +79,10 @@ func (s *Server) Create(_ context.Context, q *session.SessionCreateRequest) (*se
int64(argoCDSettings.UserSessionDuration.Seconds()),
uniqueId.String())
if err != nil {
s.mgr.IncLoginRequestCounter(failure)
return nil, err
}
s.mgr.IncLoginRequestCounter(success)
return &session.SessionResponse{Token: jwtToken}, nil
}