summaryrefslogtreecommitdiffstats
path: root/modules/metrics
diff options
context:
space:
mode:
authorDaniel Baumann <daniel@debian.org>2024-10-18 20:33:49 +0200
committerDaniel Baumann <daniel@debian.org>2024-12-12 23:57:56 +0100
commite68b9d00a6e05b3a941f63ffb696f91e554ac5ec (patch)
tree97775d6c13b0f416af55314eb6a89ef792474615 /modules/metrics
parentInitial commit. (diff)
downloadforgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.tar.xz
forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.zip
Adding upstream version 9.0.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to '')
-rwxr-xr-xmodules/metrics/collector.go388
1 files changed, 388 insertions, 0 deletions
diff --git a/modules/metrics/collector.go b/modules/metrics/collector.go
new file mode 100755
index 0000000..230260f
--- /dev/null
+++ b/modules/metrics/collector.go
@@ -0,0 +1,388 @@
+// Copyright 2018 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package metrics
+
+import (
+ "runtime"
+
+ activities_model "code.gitea.io/gitea/models/activities"
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/setting"
+
+ "github.com/prometheus/client_golang/prometheus"
+)
+
+const namespace = "gitea_"
+
+// Collector implements the prometheus.Collector interface and
+// exposes gitea metrics for prometheus
+type Collector struct {
+ Accesses *prometheus.Desc
+ Attachments *prometheus.Desc
+ BuildInfo *prometheus.Desc
+ Comments *prometheus.Desc
+ Follows *prometheus.Desc
+ HookTasks *prometheus.Desc
+ Issues *prometheus.Desc
+ IssuesOpen *prometheus.Desc
+ IssuesClosed *prometheus.Desc
+ IssuesByLabel *prometheus.Desc
+ IssuesByRepository *prometheus.Desc
+ Labels *prometheus.Desc
+ LoginSources *prometheus.Desc
+ Milestones *prometheus.Desc
+ Mirrors *prometheus.Desc
+ Oauths *prometheus.Desc
+ Organizations *prometheus.Desc
+ Projects *prometheus.Desc
+ ProjectColumns *prometheus.Desc
+ PublicKeys *prometheus.Desc
+ Releases *prometheus.Desc
+ Repositories *prometheus.Desc
+ Stars *prometheus.Desc
+ Teams *prometheus.Desc
+ UpdateTasks *prometheus.Desc
+ Users *prometheus.Desc
+ Watches *prometheus.Desc
+ Webhooks *prometheus.Desc
+}
+
+// NewCollector returns a new Collector with all prometheus.Desc initialized
+func NewCollector() Collector {
+ return Collector{
+ Accesses: prometheus.NewDesc(
+ namespace+"accesses",
+ "Number of Accesses",
+ nil, nil,
+ ),
+ Attachments: prometheus.NewDesc(
+ namespace+"attachments",
+ "Number of Attachments",
+ nil, nil,
+ ),
+ BuildInfo: prometheus.NewDesc(
+ namespace+"build_info",
+ "Build information",
+ []string{
+ "goarch",
+ "goos",
+ "goversion",
+ "version",
+ }, nil,
+ ),
+ Comments: prometheus.NewDesc(
+ namespace+"comments",
+ "Number of Comments",
+ nil, nil,
+ ),
+ Follows: prometheus.NewDesc(
+ namespace+"follows",
+ "Number of Follows",
+ nil, nil,
+ ),
+ HookTasks: prometheus.NewDesc(
+ namespace+"hooktasks",
+ "Number of HookTasks",
+ nil, nil,
+ ),
+ Issues: prometheus.NewDesc(
+ namespace+"issues",
+ "Number of Issues",
+ nil, nil,
+ ),
+ IssuesByLabel: prometheus.NewDesc(
+ namespace+"issues_by_label",
+ "Number of Issues",
+ []string{"label"}, nil,
+ ),
+ IssuesByRepository: prometheus.NewDesc(
+ namespace+"issues_by_repository",
+ "Number of Issues",
+ []string{"repository"}, nil,
+ ),
+ IssuesOpen: prometheus.NewDesc(
+ namespace+"issues_open",
+ "Number of open Issues",
+ nil, nil,
+ ),
+ IssuesClosed: prometheus.NewDesc(
+ namespace+"issues_closed",
+ "Number of closed Issues",
+ nil, nil,
+ ),
+ Labels: prometheus.NewDesc(
+ namespace+"labels",
+ "Number of Labels",
+ nil, nil,
+ ),
+ LoginSources: prometheus.NewDesc(
+ namespace+"loginsources",
+ "Number of LoginSources",
+ nil, nil,
+ ),
+ Milestones: prometheus.NewDesc(
+ namespace+"milestones",
+ "Number of Milestones",
+ nil, nil,
+ ),
+ Mirrors: prometheus.NewDesc(
+ namespace+"mirrors",
+ "Number of Mirrors",
+ nil, nil,
+ ),
+ Oauths: prometheus.NewDesc(
+ namespace+"oauths",
+ "Number of Oauths",
+ nil, nil,
+ ),
+ Organizations: prometheus.NewDesc(
+ namespace+"organizations",
+ "Number of Organizations",
+ nil, nil,
+ ),
+ Projects: prometheus.NewDesc(
+ namespace+"projects",
+ "Number of projects",
+ nil, nil,
+ ),
+ ProjectColumns: prometheus.NewDesc(
+ namespace+"projects_boards", // TODO: change the key name will affect the consume's result history
+ "Number of project columns",
+ nil, nil,
+ ),
+ PublicKeys: prometheus.NewDesc(
+ namespace+"publickeys",
+ "Number of PublicKeys",
+ nil, nil,
+ ),
+ Releases: prometheus.NewDesc(
+ namespace+"releases",
+ "Number of Releases",
+ nil, nil,
+ ),
+ Repositories: prometheus.NewDesc(
+ namespace+"repositories",
+ "Number of Repositories",
+ nil, nil,
+ ),
+ Stars: prometheus.NewDesc(
+ namespace+"stars",
+ "Number of Stars",
+ nil, nil,
+ ),
+ Teams: prometheus.NewDesc(
+ namespace+"teams",
+ "Number of Teams",
+ nil, nil,
+ ),
+ UpdateTasks: prometheus.NewDesc(
+ namespace+"updatetasks",
+ "Number of UpdateTasks",
+ nil, nil,
+ ),
+ Users: prometheus.NewDesc(
+ namespace+"users",
+ "Number of Users",
+ nil, nil,
+ ),
+ Watches: prometheus.NewDesc(
+ namespace+"watches",
+ "Number of Watches",
+ nil, nil,
+ ),
+ Webhooks: prometheus.NewDesc(
+ namespace+"webhooks",
+ "Number of Webhooks",
+ nil, nil,
+ ),
+ }
+}
+
+// Describe returns all possible prometheus.Desc
+func (c Collector) Describe(ch chan<- *prometheus.Desc) {
+ ch <- c.Accesses
+ ch <- c.Attachments
+ ch <- c.BuildInfo
+ ch <- c.Comments
+ ch <- c.Follows
+ ch <- c.HookTasks
+ ch <- c.Issues
+ ch <- c.IssuesByLabel
+ ch <- c.IssuesByRepository
+ ch <- c.IssuesOpen
+ ch <- c.IssuesClosed
+ ch <- c.Labels
+ ch <- c.LoginSources
+ ch <- c.Milestones
+ ch <- c.Mirrors
+ ch <- c.Oauths
+ ch <- c.Organizations
+ ch <- c.Projects
+ ch <- c.ProjectColumns
+ ch <- c.PublicKeys
+ ch <- c.Releases
+ ch <- c.Repositories
+ ch <- c.Stars
+ ch <- c.Teams
+ ch <- c.UpdateTasks
+ ch <- c.Users
+ ch <- c.Watches
+ ch <- c.Webhooks
+}
+
+// Collect returns the metrics with values
+func (c Collector) Collect(ch chan<- prometheus.Metric) {
+ stats := activities_model.GetStatistic(db.DefaultContext)
+
+ ch <- prometheus.MustNewConstMetric(
+ c.Accesses,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Access),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Attachments,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Attachment),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.BuildInfo,
+ prometheus.GaugeValue,
+ 1,
+ runtime.GOARCH,
+ runtime.GOOS,
+ runtime.Version(),
+ setting.AppVer,
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Comments,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Comment),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Follows,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Follow),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.HookTasks,
+ prometheus.GaugeValue,
+ float64(stats.Counter.HookTask),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Issues,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Issue),
+ )
+ for _, il := range stats.Counter.IssueByLabel {
+ ch <- prometheus.MustNewConstMetric(
+ c.IssuesByLabel,
+ prometheus.GaugeValue,
+ float64(il.Count),
+ il.Label,
+ )
+ }
+ for _, ir := range stats.Counter.IssueByRepository {
+ ch <- prometheus.MustNewConstMetric(
+ c.IssuesByRepository,
+ prometheus.GaugeValue,
+ float64(ir.Count),
+ ir.OwnerName+"/"+ir.Repository,
+ )
+ }
+ ch <- prometheus.MustNewConstMetric(
+ c.IssuesClosed,
+ prometheus.GaugeValue,
+ float64(stats.Counter.IssueClosed),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.IssuesOpen,
+ prometheus.GaugeValue,
+ float64(stats.Counter.IssueOpen),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Labels,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Label),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.LoginSources,
+ prometheus.GaugeValue,
+ float64(stats.Counter.AuthSource),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Milestones,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Milestone),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Mirrors,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Mirror),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Oauths,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Oauth),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Organizations,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Org),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Projects,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Project),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.ProjectColumns,
+ prometheus.GaugeValue,
+ float64(stats.Counter.ProjectColumn),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.PublicKeys,
+ prometheus.GaugeValue,
+ float64(stats.Counter.PublicKey),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Releases,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Release),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Repositories,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Repo),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Stars,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Star),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Teams,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Team),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.UpdateTasks,
+ prometheus.GaugeValue,
+ float64(stats.Counter.UpdateTask),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Users,
+ prometheus.GaugeValue,
+ float64(stats.Counter.User),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Watches,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Watch),
+ )
+ ch <- prometheus.MustNewConstMetric(
+ c.Webhooks,
+ prometheus.GaugeValue,
+ float64(stats.Counter.Webhook),
+ )
+}