mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 10:44:12 +01: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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user