code.gitea.io/gitea@v1.22.3/modules/metrics/collector.go (about)

     1  // Copyright 2018 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package metrics
     5  
     6  import (
     7  	"runtime"
     8  
     9  	activities_model "code.gitea.io/gitea/models/activities"
    10  	"code.gitea.io/gitea/models/db"
    11  	"code.gitea.io/gitea/modules/setting"
    12  
    13  	"github.com/prometheus/client_golang/prometheus"
    14  )
    15  
    16  const namespace = "gitea_"
    17  
    18  // Collector implements the prometheus.Collector interface and
    19  // exposes gitea metrics for prometheus
    20  type Collector struct {
    21  	Accesses           *prometheus.Desc
    22  	Attachments        *prometheus.Desc
    23  	BuildInfo          *prometheus.Desc
    24  	Comments           *prometheus.Desc
    25  	Follows            *prometheus.Desc
    26  	HookTasks          *prometheus.Desc
    27  	Issues             *prometheus.Desc
    28  	IssuesOpen         *prometheus.Desc
    29  	IssuesClosed       *prometheus.Desc
    30  	IssuesByLabel      *prometheus.Desc
    31  	IssuesByRepository *prometheus.Desc
    32  	Labels             *prometheus.Desc
    33  	LoginSources       *prometheus.Desc
    34  	Milestones         *prometheus.Desc
    35  	Mirrors            *prometheus.Desc
    36  	Oauths             *prometheus.Desc
    37  	Organizations      *prometheus.Desc
    38  	Projects           *prometheus.Desc
    39  	ProjectBoards      *prometheus.Desc
    40  	PublicKeys         *prometheus.Desc
    41  	Releases           *prometheus.Desc
    42  	Repositories       *prometheus.Desc
    43  	Stars              *prometheus.Desc
    44  	Teams              *prometheus.Desc
    45  	UpdateTasks        *prometheus.Desc
    46  	Users              *prometheus.Desc
    47  	Watches            *prometheus.Desc
    48  	Webhooks           *prometheus.Desc
    49  }
    50  
    51  // NewCollector returns a new Collector with all prometheus.Desc initialized
    52  func NewCollector() Collector {
    53  	return Collector{
    54  		Accesses: prometheus.NewDesc(
    55  			namespace+"accesses",
    56  			"Number of Accesses",
    57  			nil, nil,
    58  		),
    59  		Attachments: prometheus.NewDesc(
    60  			namespace+"attachments",
    61  			"Number of Attachments",
    62  			nil, nil,
    63  		),
    64  		BuildInfo: prometheus.NewDesc(
    65  			namespace+"build_info",
    66  			"Build information",
    67  			[]string{
    68  				"goarch",
    69  				"goos",
    70  				"goversion",
    71  				"version",
    72  			}, nil,
    73  		),
    74  		Comments: prometheus.NewDesc(
    75  			namespace+"comments",
    76  			"Number of Comments",
    77  			nil, nil,
    78  		),
    79  		Follows: prometheus.NewDesc(
    80  			namespace+"follows",
    81  			"Number of Follows",
    82  			nil, nil,
    83  		),
    84  		HookTasks: prometheus.NewDesc(
    85  			namespace+"hooktasks",
    86  			"Number of HookTasks",
    87  			nil, nil,
    88  		),
    89  		Issues: prometheus.NewDesc(
    90  			namespace+"issues",
    91  			"Number of Issues",
    92  			nil, nil,
    93  		),
    94  		IssuesByLabel: prometheus.NewDesc(
    95  			namespace+"issues_by_label",
    96  			"Number of Issues",
    97  			[]string{"label"}, nil,
    98  		),
    99  		IssuesByRepository: prometheus.NewDesc(
   100  			namespace+"issues_by_repository",
   101  			"Number of Issues",
   102  			[]string{"repository"}, nil,
   103  		),
   104  		IssuesOpen: prometheus.NewDesc(
   105  			namespace+"issues_open",
   106  			"Number of open Issues",
   107  			nil, nil,
   108  		),
   109  		IssuesClosed: prometheus.NewDesc(
   110  			namespace+"issues_closed",
   111  			"Number of closed Issues",
   112  			nil, nil,
   113  		),
   114  		Labels: prometheus.NewDesc(
   115  			namespace+"labels",
   116  			"Number of Labels",
   117  			nil, nil,
   118  		),
   119  		LoginSources: prometheus.NewDesc(
   120  			namespace+"loginsources",
   121  			"Number of LoginSources",
   122  			nil, nil,
   123  		),
   124  		Milestones: prometheus.NewDesc(
   125  			namespace+"milestones",
   126  			"Number of Milestones",
   127  			nil, nil,
   128  		),
   129  		Mirrors: prometheus.NewDesc(
   130  			namespace+"mirrors",
   131  			"Number of Mirrors",
   132  			nil, nil,
   133  		),
   134  		Oauths: prometheus.NewDesc(
   135  			namespace+"oauths",
   136  			"Number of Oauths",
   137  			nil, nil,
   138  		),
   139  		Organizations: prometheus.NewDesc(
   140  			namespace+"organizations",
   141  			"Number of Organizations",
   142  			nil, nil,
   143  		),
   144  		Projects: prometheus.NewDesc(
   145  			namespace+"projects",
   146  			"Number of projects",
   147  			nil, nil,
   148  		),
   149  		ProjectBoards: prometheus.NewDesc(
   150  			namespace+"projects_boards",
   151  			"Number of project boards",
   152  			nil, nil,
   153  		),
   154  		PublicKeys: prometheus.NewDesc(
   155  			namespace+"publickeys",
   156  			"Number of PublicKeys",
   157  			nil, nil,
   158  		),
   159  		Releases: prometheus.NewDesc(
   160  			namespace+"releases",
   161  			"Number of Releases",
   162  			nil, nil,
   163  		),
   164  		Repositories: prometheus.NewDesc(
   165  			namespace+"repositories",
   166  			"Number of Repositories",
   167  			nil, nil,
   168  		),
   169  		Stars: prometheus.NewDesc(
   170  			namespace+"stars",
   171  			"Number of Stars",
   172  			nil, nil,
   173  		),
   174  		Teams: prometheus.NewDesc(
   175  			namespace+"teams",
   176  			"Number of Teams",
   177  			nil, nil,
   178  		),
   179  		UpdateTasks: prometheus.NewDesc(
   180  			namespace+"updatetasks",
   181  			"Number of UpdateTasks",
   182  			nil, nil,
   183  		),
   184  		Users: prometheus.NewDesc(
   185  			namespace+"users",
   186  			"Number of Users",
   187  			nil, nil,
   188  		),
   189  		Watches: prometheus.NewDesc(
   190  			namespace+"watches",
   191  			"Number of Watches",
   192  			nil, nil,
   193  		),
   194  		Webhooks: prometheus.NewDesc(
   195  			namespace+"webhooks",
   196  			"Number of Webhooks",
   197  			nil, nil,
   198  		),
   199  	}
   200  }
   201  
   202  // Describe returns all possible prometheus.Desc
   203  func (c Collector) Describe(ch chan<- *prometheus.Desc) {
   204  	ch <- c.Accesses
   205  	ch <- c.Attachments
   206  	ch <- c.BuildInfo
   207  	ch <- c.Comments
   208  	ch <- c.Follows
   209  	ch <- c.HookTasks
   210  	ch <- c.Issues
   211  	ch <- c.IssuesByLabel
   212  	ch <- c.IssuesByRepository
   213  	ch <- c.IssuesOpen
   214  	ch <- c.IssuesClosed
   215  	ch <- c.Labels
   216  	ch <- c.LoginSources
   217  	ch <- c.Milestones
   218  	ch <- c.Mirrors
   219  	ch <- c.Oauths
   220  	ch <- c.Organizations
   221  	ch <- c.Projects
   222  	ch <- c.ProjectBoards
   223  	ch <- c.PublicKeys
   224  	ch <- c.Releases
   225  	ch <- c.Repositories
   226  	ch <- c.Stars
   227  	ch <- c.Teams
   228  	ch <- c.UpdateTasks
   229  	ch <- c.Users
   230  	ch <- c.Watches
   231  	ch <- c.Webhooks
   232  }
   233  
   234  // Collect returns the metrics with values
   235  func (c Collector) Collect(ch chan<- prometheus.Metric) {
   236  	stats := activities_model.GetStatistic(db.DefaultContext)
   237  
   238  	ch <- prometheus.MustNewConstMetric(
   239  		c.Accesses,
   240  		prometheus.GaugeValue,
   241  		float64(stats.Counter.Access),
   242  	)
   243  	ch <- prometheus.MustNewConstMetric(
   244  		c.Attachments,
   245  		prometheus.GaugeValue,
   246  		float64(stats.Counter.Attachment),
   247  	)
   248  	ch <- prometheus.MustNewConstMetric(
   249  		c.BuildInfo,
   250  		prometheus.GaugeValue,
   251  		1,
   252  		runtime.GOARCH,
   253  		runtime.GOOS,
   254  		runtime.Version(),
   255  		setting.AppVer,
   256  	)
   257  	ch <- prometheus.MustNewConstMetric(
   258  		c.Comments,
   259  		prometheus.GaugeValue,
   260  		float64(stats.Counter.Comment),
   261  	)
   262  	ch <- prometheus.MustNewConstMetric(
   263  		c.Follows,
   264  		prometheus.GaugeValue,
   265  		float64(stats.Counter.Follow),
   266  	)
   267  	ch <- prometheus.MustNewConstMetric(
   268  		c.HookTasks,
   269  		prometheus.GaugeValue,
   270  		float64(stats.Counter.HookTask),
   271  	)
   272  	ch <- prometheus.MustNewConstMetric(
   273  		c.Issues,
   274  		prometheus.GaugeValue,
   275  		float64(stats.Counter.Issue),
   276  	)
   277  	for _, il := range stats.Counter.IssueByLabel {
   278  		ch <- prometheus.MustNewConstMetric(
   279  			c.IssuesByLabel,
   280  			prometheus.GaugeValue,
   281  			float64(il.Count),
   282  			il.Label,
   283  		)
   284  	}
   285  	for _, ir := range stats.Counter.IssueByRepository {
   286  		ch <- prometheus.MustNewConstMetric(
   287  			c.IssuesByRepository,
   288  			prometheus.GaugeValue,
   289  			float64(ir.Count),
   290  			ir.OwnerName+"/"+ir.Repository,
   291  		)
   292  	}
   293  	ch <- prometheus.MustNewConstMetric(
   294  		c.IssuesClosed,
   295  		prometheus.GaugeValue,
   296  		float64(stats.Counter.IssueClosed),
   297  	)
   298  	ch <- prometheus.MustNewConstMetric(
   299  		c.IssuesOpen,
   300  		prometheus.GaugeValue,
   301  		float64(stats.Counter.IssueOpen),
   302  	)
   303  	ch <- prometheus.MustNewConstMetric(
   304  		c.Labels,
   305  		prometheus.GaugeValue,
   306  		float64(stats.Counter.Label),
   307  	)
   308  	ch <- prometheus.MustNewConstMetric(
   309  		c.LoginSources,
   310  		prometheus.GaugeValue,
   311  		float64(stats.Counter.AuthSource),
   312  	)
   313  	ch <- prometheus.MustNewConstMetric(
   314  		c.Milestones,
   315  		prometheus.GaugeValue,
   316  		float64(stats.Counter.Milestone),
   317  	)
   318  	ch <- prometheus.MustNewConstMetric(
   319  		c.Mirrors,
   320  		prometheus.GaugeValue,
   321  		float64(stats.Counter.Mirror),
   322  	)
   323  	ch <- prometheus.MustNewConstMetric(
   324  		c.Oauths,
   325  		prometheus.GaugeValue,
   326  		float64(stats.Counter.Oauth),
   327  	)
   328  	ch <- prometheus.MustNewConstMetric(
   329  		c.Organizations,
   330  		prometheus.GaugeValue,
   331  		float64(stats.Counter.Org),
   332  	)
   333  	ch <- prometheus.MustNewConstMetric(
   334  		c.Projects,
   335  		prometheus.GaugeValue,
   336  		float64(stats.Counter.Project),
   337  	)
   338  	ch <- prometheus.MustNewConstMetric(
   339  		c.ProjectBoards,
   340  		prometheus.GaugeValue,
   341  		float64(stats.Counter.ProjectBoard),
   342  	)
   343  	ch <- prometheus.MustNewConstMetric(
   344  		c.PublicKeys,
   345  		prometheus.GaugeValue,
   346  		float64(stats.Counter.PublicKey),
   347  	)
   348  	ch <- prometheus.MustNewConstMetric(
   349  		c.Releases,
   350  		prometheus.GaugeValue,
   351  		float64(stats.Counter.Release),
   352  	)
   353  	ch <- prometheus.MustNewConstMetric(
   354  		c.Repositories,
   355  		prometheus.GaugeValue,
   356  		float64(stats.Counter.Repo),
   357  	)
   358  	ch <- prometheus.MustNewConstMetric(
   359  		c.Stars,
   360  		prometheus.GaugeValue,
   361  		float64(stats.Counter.Star),
   362  	)
   363  	ch <- prometheus.MustNewConstMetric(
   364  		c.Teams,
   365  		prometheus.GaugeValue,
   366  		float64(stats.Counter.Team),
   367  	)
   368  	ch <- prometheus.MustNewConstMetric(
   369  		c.UpdateTasks,
   370  		prometheus.GaugeValue,
   371  		float64(stats.Counter.UpdateTask),
   372  	)
   373  	ch <- prometheus.MustNewConstMetric(
   374  		c.Users,
   375  		prometheus.GaugeValue,
   376  		float64(stats.Counter.User),
   377  	)
   378  	ch <- prometheus.MustNewConstMetric(
   379  		c.Watches,
   380  		prometheus.GaugeValue,
   381  		float64(stats.Counter.Watch),
   382  	)
   383  	ch <- prometheus.MustNewConstMetric(
   384  		c.Webhooks,
   385  		prometheus.GaugeValue,
   386  		float64(stats.Counter.Webhook),
   387  	)
   388  }