mirror of
https://github.com/go-gitea/gitea.git
synced 2025-06-06 06:52:30 +00:00
feat: add label 'state' to metric 'gitea_users' (#34326)
This PR adds the label _state_ to the metric _gitea_users_. With the change, _gitea_users_ would be reported like this: ``` ... # HELP gitea_users Number of Users # TYPE gitea_users gauge gitea_users{state="active"} 20 gitea_users{state="inactive"} 10 ... ``` The metrics above would be from a Gitea instance with 30 user accounts. 20 of the accounts are active and 10 of the accounts are not active. Resolve #34325
This commit is contained in:
parent
dd886d729f
commit
020e774b91
@ -17,13 +17,15 @@ import (
|
|||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/models/webhook"
|
"code.gitea.io/gitea/models/webhook"
|
||||||
|
"code.gitea.io/gitea/modules/optional"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Statistic contains the database statistics
|
// Statistic contains the database statistics
|
||||||
type Statistic struct {
|
type Statistic struct {
|
||||||
Counter struct {
|
Counter struct {
|
||||||
User, Org, PublicKey,
|
UsersActive, UsersNotActive,
|
||||||
|
Org, PublicKey,
|
||||||
Repo, Watch, Star, Access,
|
Repo, Watch, Star, Access,
|
||||||
Issue, IssueClosed, IssueOpen,
|
Issue, IssueClosed, IssueOpen,
|
||||||
Comment, Oauth, Follow,
|
Comment, Oauth, Follow,
|
||||||
@ -53,7 +55,19 @@ type IssueByRepositoryCount struct {
|
|||||||
// GetStatistic returns the database statistics
|
// GetStatistic returns the database statistics
|
||||||
func GetStatistic(ctx context.Context) (stats Statistic) {
|
func GetStatistic(ctx context.Context) (stats Statistic) {
|
||||||
e := db.GetEngine(ctx)
|
e := db.GetEngine(ctx)
|
||||||
stats.Counter.User = user_model.CountUsers(ctx, nil)
|
|
||||||
|
// Number of active users
|
||||||
|
usersActiveOpts := user_model.CountUserFilter{
|
||||||
|
IsActive: optional.Some(true),
|
||||||
|
}
|
||||||
|
stats.Counter.UsersActive = user_model.CountUsers(ctx, &usersActiveOpts)
|
||||||
|
|
||||||
|
// Number of inactive users
|
||||||
|
usersNotActiveOpts := user_model.CountUserFilter{
|
||||||
|
IsActive: optional.Some(false),
|
||||||
|
}
|
||||||
|
stats.Counter.UsersNotActive = user_model.CountUsers(ctx, &usersNotActiveOpts)
|
||||||
|
|
||||||
stats.Counter.Org, _ = db.Count[organization.Organization](ctx, organization.FindOrgOptions{IncludePrivate: true})
|
stats.Counter.Org, _ = db.Count[organization.Organization](ctx, organization.FindOrgOptions{IncludePrivate: true})
|
||||||
stats.Counter.PublicKey, _ = e.Count(new(asymkey_model.PublicKey))
|
stats.Counter.PublicKey, _ = e.Count(new(asymkey_model.PublicKey))
|
||||||
stats.Counter.Repo, _ = repo_model.CountRepositories(ctx, repo_model.CountRepositoryOptions{})
|
stats.Counter.Repo, _ = repo_model.CountRepositories(ctx, repo_model.CountRepositoryOptions{})
|
||||||
|
@ -828,6 +828,7 @@ func IsLastAdminUser(ctx context.Context, user *User) bool {
|
|||||||
type CountUserFilter struct {
|
type CountUserFilter struct {
|
||||||
LastLoginSince *int64
|
LastLoginSince *int64
|
||||||
IsAdmin optional.Option[bool]
|
IsAdmin optional.Option[bool]
|
||||||
|
IsActive optional.Option[bool]
|
||||||
}
|
}
|
||||||
|
|
||||||
// CountUsers returns number of users.
|
// CountUsers returns number of users.
|
||||||
@ -848,6 +849,10 @@ func countUsers(ctx context.Context, opts *CountUserFilter) int64 {
|
|||||||
if opts.IsAdmin.Has() {
|
if opts.IsAdmin.Has() {
|
||||||
cond = cond.And(builder.Eq{"is_admin": opts.IsAdmin.Value()})
|
cond = cond.And(builder.Eq{"is_admin": opts.IsAdmin.Value()})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.IsActive.Has() {
|
||||||
|
cond = cond.And(builder.Eq{"is_active": opts.IsActive.Value()})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
count, err := sess.Where(cond).Count(new(User))
|
count, err := sess.Where(cond).Count(new(User))
|
||||||
|
@ -184,7 +184,7 @@ func NewCollector() Collector {
|
|||||||
Users: prometheus.NewDesc(
|
Users: prometheus.NewDesc(
|
||||||
namespace+"users",
|
namespace+"users",
|
||||||
"Number of Users",
|
"Number of Users",
|
||||||
nil, nil,
|
[]string{"state"}, nil,
|
||||||
),
|
),
|
||||||
Watches: prometheus.NewDesc(
|
Watches: prometheus.NewDesc(
|
||||||
namespace+"watches",
|
namespace+"watches",
|
||||||
@ -373,7 +373,14 @@ func (c Collector) Collect(ch chan<- prometheus.Metric) {
|
|||||||
ch <- prometheus.MustNewConstMetric(
|
ch <- prometheus.MustNewConstMetric(
|
||||||
c.Users,
|
c.Users,
|
||||||
prometheus.GaugeValue,
|
prometheus.GaugeValue,
|
||||||
float64(stats.Counter.User),
|
float64(stats.Counter.UsersActive),
|
||||||
|
"active", // state label
|
||||||
|
)
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
c.Users,
|
||||||
|
prometheus.GaugeValue,
|
||||||
|
float64(stats.Counter.UsersNotActive),
|
||||||
|
"inactive", // state label
|
||||||
)
|
)
|
||||||
ch <- prometheus.MustNewConstMetric(
|
ch <- prometheus.MustNewConstMetric(
|
||||||
c.Watches,
|
c.Watches,
|
||||||
|
Loading…
Reference in New Issue
Block a user