Add metrics to get issues by repository (#17225)

tokarchuk/v1.17
Romain 3 years ago committed by GitHub
parent 760d61b411
commit 987152ba40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      custom/conf/app.example.ini
  2. 3
      docs/content/doc/advanced/config-cheat-sheet.en-us.md
  3. 18
      models/statistic.go
  4. 15
      modules/metrics/collector.go
  5. 2
      modules/setting/setting.go

@ -2043,6 +2043,8 @@ PATH =
;TOKEN = ;TOKEN =
;; Enable issue by label metrics; default is false ;; Enable issue by label metrics; default is false
;ENABLED_ISSUE_BY_LABEL = false ;ENABLED_ISSUE_BY_LABEL = false
;; Enable issue by repository metrics; default is false
;ENABLED_ISSUE_BY_REPOSITORY = false
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

@ -853,7 +853,8 @@ NB: You must have `DISABLE_ROUTER_LOG` set to `false` for this option to take ef
## Metrics (`metrics`) ## Metrics (`metrics`)
- `ENABLED`: **false**: Enables /metrics endpoint for prometheus. - `ENABLED`: **false**: Enables /metrics endpoint for prometheus.
- `ENABLED_ISSUE_BY_LABEL`: **false**: Enable issue by label metrics - `ENABLED_ISSUE_BY_LABEL`: **false**: Enable issue by label metrics with format `gitea_issues_by_label{label="bug"} 2`.
- `ENABLED_ISSUE_BY_REPOSITORY`: **false**: Enable issue by repository metrics with format `gitea_issues_by_repository{repository="org/repo"} 5`.
- `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`. - `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`) ## API (`api`)

@ -22,6 +22,7 @@ type Statistic struct {
Team, UpdateTask, Project, Team, UpdateTask, Project,
ProjectBoard, Attachment int64 ProjectBoard, Attachment int64
IssueByLabel []IssueByLabelCount IssueByLabel []IssueByLabelCount
IssueByRepository []IssueByRepositoryCount
} }
} }
@ -31,6 +32,13 @@ type IssueByLabelCount struct {
Label string Label string
} }
// IssueByRepositoryCount contains the number of issue group by repository
type IssueByRepositoryCount struct {
Count int64
OwnerName string
Repository string
}
// GetStatistic returns the database statistics // GetStatistic returns the database statistics
func GetStatistic() (stats Statistic) { func GetStatistic() (stats Statistic) {
e := db.GetEngine(db.DefaultContext) e := db.GetEngine(db.DefaultContext)
@ -58,6 +66,16 @@ func GetStatistic() (stats Statistic) {
Find(&stats.Counter.IssueByLabel) Find(&stats.Counter.IssueByLabel)
} }
if setting.Metrics.EnabledIssueByRepository {
stats.Counter.IssueByRepository = []IssueByRepositoryCount{}
_ = e.Select("COUNT(*) AS count, r.owner_name, r.name AS repository").
Join("LEFT", "repository r", "r.id=i.repo_id").
Table("issue i").
GroupBy("r.owner_name, r.name").
Find(&stats.Counter.IssueByRepository)
}
issueCounts := []IssueCount{} issueCounts := []IssueCount{}
_ = e.Select("COUNT(*) AS count, is_closed").Table("issue").GroupBy("is_closed").Find(&issueCounts) _ = e.Select("COUNT(*) AS count, is_closed").Table("issue").GroupBy("is_closed").Find(&issueCounts)

@ -25,6 +25,7 @@ type Collector struct {
IssuesOpen *prometheus.Desc IssuesOpen *prometheus.Desc
IssuesClosed *prometheus.Desc IssuesClosed *prometheus.Desc
IssuesByLabel *prometheus.Desc IssuesByLabel *prometheus.Desc
IssuesByRepository *prometheus.Desc
Labels *prometheus.Desc Labels *prometheus.Desc
LoginSources *prometheus.Desc LoginSources *prometheus.Desc
Milestones *prometheus.Desc Milestones *prometheus.Desc
@ -88,6 +89,11 @@ func NewCollector() Collector {
"Number of Issues", "Number of Issues",
[]string{"label"}, nil, []string{"label"}, nil,
), ),
IssuesByRepository: prometheus.NewDesc(
namespace+"issues_by_repository",
"Number of Issues",
[]string{"repository"}, nil,
),
IssuesOpen: prometheus.NewDesc( IssuesOpen: prometheus.NewDesc(
namespace+"issues_open", namespace+"issues_open",
"Number of open Issues", "Number of open Issues",
@ -196,6 +202,7 @@ func (c Collector) Describe(ch chan<- *prometheus.Desc) {
ch <- c.HookTasks ch <- c.HookTasks
ch <- c.Issues ch <- c.Issues
ch <- c.IssuesByLabel ch <- c.IssuesByLabel
ch <- c.IssuesByRepository
ch <- c.IssuesOpen ch <- c.IssuesOpen
ch <- c.IssuesClosed ch <- c.IssuesClosed
ch <- c.Labels ch <- c.Labels
@ -264,6 +271,14 @@ func (c Collector) Collect(ch chan<- prometheus.Metric) {
il.Label, 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( ch <- prometheus.MustNewConstMetric(
c.IssuesClosed, c.IssuesClosed,
prometheus.GaugeValue, prometheus.GaugeValue,

@ -393,10 +393,12 @@ var (
Enabled bool Enabled bool
Token string Token string
EnabledIssueByLabel bool EnabledIssueByLabel bool
EnabledIssueByRepository bool
}{ }{
Enabled: false, Enabled: false,
Token: "", Token: "",
EnabledIssueByLabel: false, EnabledIssueByLabel: false,
EnabledIssueByRepository: false,
} }
// I18n settings // I18n settings

Loading…
Cancel
Save