Skip to content

Commit

Permalink
Add metrics to get issues by repository (#17225)
Browse files Browse the repository at this point in the history
  • Loading branch information
romdum authored Oct 5, 2021
1 parent 760d61b commit 987152b
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 35 deletions.
2 changes: 2 additions & 0 deletions custom/conf/app.example.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2043,6 +2043,8 @@ PATH =
;TOKEN =
;; Enable issue by label metrics; default is false
;ENABLED_ISSUE_BY_LABEL = false
;; Enable issue by repository metrics; default is false
;ENABLED_ISSUE_BY_REPOSITORY = false

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Expand Down
3 changes: 2 additions & 1 deletion docs/content/doc/advanced/config-cheat-sheet.en-us.md
Original file line number Diff line number Diff line change
Expand Up @@ -853,7 +853,8 @@ 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
- `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`.

## API (`api`)
Expand Down
20 changes: 19 additions & 1 deletion models/statistic.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ type Statistic struct {
Milestone, Label, HookTask,
Team, UpdateTask, Project,
ProjectBoard, Attachment int64
IssueByLabel []IssueByLabelCount
IssueByLabel []IssueByLabelCount
IssueByRepository []IssueByRepositoryCount
}
}

Expand All @@ -31,6 +32,13 @@ type IssueByLabelCount struct {
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
func GetStatistic() (stats Statistic) {
e := db.GetEngine(db.DefaultContext)
Expand Down Expand Up @@ -58,6 +66,16 @@ func GetStatistic() (stats Statistic) {
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{}

_ = e.Select("COUNT(*) AS count, is_closed").Table("issue").GroupBy("is_closed").Find(&issueCounts)
Expand Down
69 changes: 42 additions & 27 deletions modules/metrics/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,34 @@ const namespace = "gitea_"
// Collector implements the prometheus.Collector interface and
// exposes gitea metrics for prometheus
type Collector struct {
Accesses *prometheus.Desc
Actions *prometheus.Desc
Attachments *prometheus.Desc
Comments *prometheus.Desc
Follows *prometheus.Desc
HookTasks *prometheus.Desc
Issues *prometheus.Desc
IssuesOpen *prometheus.Desc
IssuesClosed *prometheus.Desc
IssuesByLabel *prometheus.Desc
Labels *prometheus.Desc
LoginSources *prometheus.Desc
Milestones *prometheus.Desc
Mirrors *prometheus.Desc
Oauths *prometheus.Desc
Organizations *prometheus.Desc
Projects *prometheus.Desc
ProjectBoards *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
Accesses *prometheus.Desc
Actions *prometheus.Desc
Attachments *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
ProjectBoards *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
Expand Down Expand Up @@ -88,6 +89,11 @@ func NewCollector() Collector {
"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",
Expand Down Expand Up @@ -196,6 +202,7 @@ func (c Collector) Describe(ch chan<- *prometheus.Desc) {
ch <- c.HookTasks
ch <- c.Issues
ch <- c.IssuesByLabel
ch <- c.IssuesByRepository
ch <- c.IssuesOpen
ch <- c.IssuesClosed
ch <- c.Labels
Expand Down Expand Up @@ -264,6 +271,14 @@ func (c Collector) Collect(ch chan<- prometheus.Metric) {
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,
Expand Down
14 changes: 8 additions & 6 deletions modules/setting/setting.go
Original file line number Diff line number Diff line change
Expand Up @@ -390,13 +390,15 @@ var (

// Metrics settings
Metrics = struct {
Enabled bool
Token string
EnabledIssueByLabel bool
Enabled bool
Token string
EnabledIssueByLabel bool
EnabledIssueByRepository bool
}{
Enabled: false,
Token: "",
EnabledIssueByLabel: false,
Enabled: false,
Token: "",
EnabledIssueByLabel: false,
EnabledIssueByRepository: false,
}

// I18n settings
Expand Down

0 comments on commit 987152b

Please sign in to comment.