diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index 12a172f5a..d8b73aa7e 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -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
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
index d80f96b3d..5726473d2 100644
--- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md
+++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
@@ -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`)
diff --git a/models/statistic.go b/models/statistic.go
index 1fdcc44a6..c80cebba9 100644
--- a/models/statistic.go
+++ b/models/statistic.go
@@ -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)
diff --git a/modules/metrics/collector.go b/modules/metrics/collector.go
index 29374583d..dcc147631 100755
--- a/modules/metrics/collector.go
+++ b/modules/metrics/collector.go
@@ -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,
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index afd1e49ae..bdb3b1fd7 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -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