]> source.dussan.org Git - gitea.git/commitdiff
Add metrics to get issues by label (#17201)
authorRomain <romdum@users.noreply.github.com>
Sun, 3 Oct 2021 22:46:44 +0000 (00:46 +0200)
committerGitHub <noreply@github.com>
Sun, 3 Oct 2021 22:46:44 +0000 (18:46 -0400)
* Add metrics to get issues by label

* Add comment on IssueByLabelCount

* Code review - Unify "AS" in SQL (#17201)

* Code review - Remove useless join (#17201)

* Code review - Disable issue_by_label by default in settings (#17201)

* use e

* restore empty line

* update docs

Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: techknowlogick <matti@mdranta.net>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
custom/conf/app.example.ini
docs/content/doc/advanced/config-cheat-sheet.en-us.md
models/statistic.go
modules/metrics/collector.go
modules/setting/setting.go

index 12a172f5ac58d3018380a89ef588929f0d98732b..d8b73aa7eb6ed71f0408f95e2df63f3b65165b0b 100644 (file)
@@ -2041,6 +2041,8 @@ PATH =
 ;ENABLED = false
 ;; If you want to add authorization, specify a token here
 ;TOKEN =
+;; Enable issue by label metrics; default is false
+;ENABLED_ISSUE_BY_LABEL = false
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
index d80f96b3de04bfdee112a957d0491ebe5c12cd25..5726473d240f03658c89cd6b3bb0cb23021a14eb 100644 (file)
@@ -853,6 +853,7 @@ NB: You must have `DISABLE_ROUTER_LOG` set to `false` for this option to take ef
 ## Metrics (`metrics`)
 
 - `ENABLED`: **false**: Enables /metrics endpoint for prometheus.
+- `ENABLED_ISSUE_BY_LABEL`: **false**: Enable issue by label metrics
 - `TOKEN`: **\<empty\>**: You need to specify the token, if you want to include in the authorization the metrics . The same token need to be used in prometheus parameters `bearer_token` or `bearer_token_file`.
 
 ## API (`api`)
index 1fdcc44a6fe75962207689e4a4db9e713f56390b..c80cebba99feb1521a0a32d475793e03f7def95f 100644 (file)
@@ -7,6 +7,7 @@ package models
 import (
        "code.gitea.io/gitea/models/db"
        "code.gitea.io/gitea/models/login"
+       "code.gitea.io/gitea/modules/setting"
 )
 
 // Statistic contains the database statistics
@@ -20,9 +21,16 @@ type Statistic struct {
                Milestone, Label, HookTask,
                Team, UpdateTask, Project,
                ProjectBoard, Attachment int64
+               IssueByLabel []IssueByLabelCount
        }
 }
 
+// IssueByLabelCount contains the number of issue group by label
+type IssueByLabelCount struct {
+       Count int64
+       Label string
+}
+
 // GetStatistic returns the database statistics
 func GetStatistic() (stats Statistic) {
        e := db.GetEngine(db.DefaultContext)
@@ -39,6 +47,17 @@ func GetStatistic() (stats Statistic) {
                Count    int64
                IsClosed bool
        }
+
+       if setting.Metrics.EnabledIssueByLabel {
+               stats.Counter.IssueByLabel = []IssueByLabelCount{}
+
+               _ = e.Select("COUNT(*) AS count, l.name AS label").
+                       Join("LEFT", "label l", "l.id=il.label_id").
+                       Table("issue_label il").
+                       GroupBy("l.name").
+                       Find(&stats.Counter.IssueByLabel)
+       }
+
        issueCounts := []IssueCount{}
 
        _ = e.Select("COUNT(*) AS count, is_closed").Table("issue").GroupBy("is_closed").Find(&issueCounts)
index 29374583d63b119f61b7e6dd527dfd94d39db3a4..dcc147631b7023406a4eac16aba7260905f252a2 100755 (executable)
@@ -24,6 +24,7 @@ type Collector struct {
        Issues        *prometheus.Desc
        IssuesOpen    *prometheus.Desc
        IssuesClosed  *prometheus.Desc
+       IssuesByLabel *prometheus.Desc
        Labels        *prometheus.Desc
        LoginSources  *prometheus.Desc
        Milestones    *prometheus.Desc
@@ -45,6 +46,7 @@ type Collector struct {
 
 // NewCollector returns a new Collector with all prometheus.Desc initialized
 func NewCollector() Collector {
+
        return Collector{
                Accesses: prometheus.NewDesc(
                        namespace+"accesses",
@@ -81,6 +83,11 @@ func NewCollector() Collector {
                        "Number of Issues",
                        nil, nil,
                ),
+               IssuesByLabel: prometheus.NewDesc(
+                       namespace+"issues_by_label",
+                       "Number of Issues",
+                       []string{"label"}, nil,
+               ),
                IssuesOpen: prometheus.NewDesc(
                        namespace+"issues_open",
                        "Number of open Issues",
@@ -177,7 +184,6 @@ func NewCollector() Collector {
                        nil, nil,
                ),
        }
-
 }
 
 // Describe returns all possible prometheus.Desc
@@ -189,6 +195,7 @@ func (c Collector) Describe(ch chan<- *prometheus.Desc) {
        ch <- c.Follows
        ch <- c.HookTasks
        ch <- c.Issues
+       ch <- c.IssuesByLabel
        ch <- c.IssuesOpen
        ch <- c.IssuesClosed
        ch <- c.Labels
@@ -249,6 +256,14 @@ func (c Collector) Collect(ch chan<- prometheus.Metric) {
                prometheus.GaugeValue,
                float64(stats.Counter.Issue),
        )
+       for _, il := range stats.Counter.IssueByLabel {
+               ch <- prometheus.MustNewConstMetric(
+                       c.IssuesByLabel,
+                       prometheus.GaugeValue,
+                       float64(il.Count),
+                       il.Label,
+               )
+       }
        ch <- prometheus.MustNewConstMetric(
                c.IssuesClosed,
                prometheus.GaugeValue,
index afd1e49aed07f04682ec6d216a9cc40168b2d2e9..bdb3b1fd7b93dd7e81ca3655525c09e106ce2d66 100644 (file)
@@ -390,11 +390,13 @@ var (
 
        // Metrics settings
        Metrics = struct {
-               Enabled bool
-               Token   string
+               Enabled             bool
+               Token               string
+               EnabledIssueByLabel bool
        }{
-               Enabled: false,
-               Token:   "",
+               Enabled:             false,
+               Token:               "",
+               EnabledIssueByLabel: false,
        }
 
        // I18n settings