1// Copyright 2018 The Gitea Authors. All rights reserved.
2// Use of this source code is governed by a MIT-style
3// license that can be found in the LICENSE file.
4
5package metrics
6
7import (
8	"code.gitea.io/gitea/models"
9
10	"github.com/prometheus/client_golang/prometheus"
11)
12
13const namespace = "gitea_"
14
15// Collector implements the prometheus.Collector interface and
16// exposes gitea metrics for prometheus
17type Collector struct {
18	Accesses           *prometheus.Desc
19	Actions            *prometheus.Desc
20	Attachments        *prometheus.Desc
21	Comments           *prometheus.Desc
22	Follows            *prometheus.Desc
23	HookTasks          *prometheus.Desc
24	Issues             *prometheus.Desc
25	IssuesOpen         *prometheus.Desc
26	IssuesClosed       *prometheus.Desc
27	IssuesByLabel      *prometheus.Desc
28	IssuesByRepository *prometheus.Desc
29	Labels             *prometheus.Desc
30	LoginSources       *prometheus.Desc
31	Milestones         *prometheus.Desc
32	Mirrors            *prometheus.Desc
33	Oauths             *prometheus.Desc
34	Organizations      *prometheus.Desc
35	Projects           *prometheus.Desc
36	ProjectBoards      *prometheus.Desc
37	PublicKeys         *prometheus.Desc
38	Releases           *prometheus.Desc
39	Repositories       *prometheus.Desc
40	Stars              *prometheus.Desc
41	Teams              *prometheus.Desc
42	UpdateTasks        *prometheus.Desc
43	Users              *prometheus.Desc
44	Watches            *prometheus.Desc
45	Webhooks           *prometheus.Desc
46}
47
48// NewCollector returns a new Collector with all prometheus.Desc initialized
49func NewCollector() Collector {
50
51	return Collector{
52		Accesses: prometheus.NewDesc(
53			namespace+"accesses",
54			"Number of Accesses",
55			nil, nil,
56		),
57		Actions: prometheus.NewDesc(
58			namespace+"actions",
59			"Number of Actions",
60			nil, nil,
61		),
62		Attachments: prometheus.NewDesc(
63			namespace+"attachments",
64			"Number of Attachments",
65			nil, nil,
66		),
67		Comments: prometheus.NewDesc(
68			namespace+"comments",
69			"Number of Comments",
70			nil, nil,
71		),
72		Follows: prometheus.NewDesc(
73			namespace+"follows",
74			"Number of Follows",
75			nil, nil,
76		),
77		HookTasks: prometheus.NewDesc(
78			namespace+"hooktasks",
79			"Number of HookTasks",
80			nil, nil,
81		),
82		Issues: prometheus.NewDesc(
83			namespace+"issues",
84			"Number of Issues",
85			nil, nil,
86		),
87		IssuesByLabel: prometheus.NewDesc(
88			namespace+"issues_by_label",
89			"Number of Issues",
90			[]string{"label"}, nil,
91		),
92		IssuesByRepository: prometheus.NewDesc(
93			namespace+"issues_by_repository",
94			"Number of Issues",
95			[]string{"repository"}, nil,
96		),
97		IssuesOpen: prometheus.NewDesc(
98			namespace+"issues_open",
99			"Number of open Issues",
100			nil, nil,
101		),
102		IssuesClosed: prometheus.NewDesc(
103			namespace+"issues_closed",
104			"Number of closed Issues",
105			nil, nil,
106		),
107		Labels: prometheus.NewDesc(
108			namespace+"labels",
109			"Number of Labels",
110			nil, nil,
111		),
112		LoginSources: prometheus.NewDesc(
113			namespace+"loginsources",
114			"Number of LoginSources",
115			nil, nil,
116		),
117		Milestones: prometheus.NewDesc(
118			namespace+"milestones",
119			"Number of Milestones",
120			nil, nil,
121		),
122		Mirrors: prometheus.NewDesc(
123			namespace+"mirrors",
124			"Number of Mirrors",
125			nil, nil,
126		),
127		Oauths: prometheus.NewDesc(
128			namespace+"oauths",
129			"Number of Oauths",
130			nil, nil,
131		),
132		Organizations: prometheus.NewDesc(
133			namespace+"organizations",
134			"Number of Organizations",
135			nil, nil,
136		),
137		Projects: prometheus.NewDesc(
138			namespace+"projects",
139			"Number of projects",
140			nil, nil,
141		),
142		ProjectBoards: prometheus.NewDesc(
143			namespace+"projects_boards",
144			"Number of project boards",
145			nil, nil,
146		),
147		PublicKeys: prometheus.NewDesc(
148			namespace+"publickeys",
149			"Number of PublicKeys",
150			nil, nil,
151		),
152		Releases: prometheus.NewDesc(
153			namespace+"releases",
154			"Number of Releases",
155			nil, nil,
156		),
157		Repositories: prometheus.NewDesc(
158			namespace+"repositories",
159			"Number of Repositories",
160			nil, nil,
161		),
162		Stars: prometheus.NewDesc(
163			namespace+"stars",
164			"Number of Stars",
165			nil, nil,
166		),
167		Teams: prometheus.NewDesc(
168			namespace+"teams",
169			"Number of Teams",
170			nil, nil,
171		),
172		UpdateTasks: prometheus.NewDesc(
173			namespace+"updatetasks",
174			"Number of UpdateTasks",
175			nil, nil,
176		),
177		Users: prometheus.NewDesc(
178			namespace+"users",
179			"Number of Users",
180			nil, nil,
181		),
182		Watches: prometheus.NewDesc(
183			namespace+"watches",
184			"Number of Watches",
185			nil, nil,
186		),
187		Webhooks: prometheus.NewDesc(
188			namespace+"webhooks",
189			"Number of Webhooks",
190			nil, nil,
191		),
192	}
193}
194
195// Describe returns all possible prometheus.Desc
196func (c Collector) Describe(ch chan<- *prometheus.Desc) {
197	ch <- c.Accesses
198	ch <- c.Actions
199	ch <- c.Attachments
200	ch <- c.Comments
201	ch <- c.Follows
202	ch <- c.HookTasks
203	ch <- c.Issues
204	ch <- c.IssuesByLabel
205	ch <- c.IssuesByRepository
206	ch <- c.IssuesOpen
207	ch <- c.IssuesClosed
208	ch <- c.Labels
209	ch <- c.LoginSources
210	ch <- c.Milestones
211	ch <- c.Mirrors
212	ch <- c.Oauths
213	ch <- c.Organizations
214	ch <- c.Projects
215	ch <- c.ProjectBoards
216	ch <- c.PublicKeys
217	ch <- c.Releases
218	ch <- c.Repositories
219	ch <- c.Stars
220	ch <- c.Teams
221	ch <- c.UpdateTasks
222	ch <- c.Users
223	ch <- c.Watches
224	ch <- c.Webhooks
225}
226
227// Collect returns the metrics with values
228func (c Collector) Collect(ch chan<- prometheus.Metric) {
229	stats := models.GetStatistic()
230
231	ch <- prometheus.MustNewConstMetric(
232		c.Accesses,
233		prometheus.GaugeValue,
234		float64(stats.Counter.Access),
235	)
236	ch <- prometheus.MustNewConstMetric(
237		c.Actions,
238		prometheus.GaugeValue,
239		float64(stats.Counter.Action),
240	)
241	ch <- prometheus.MustNewConstMetric(
242		c.Attachments,
243		prometheus.GaugeValue,
244		float64(stats.Counter.Attachment),
245	)
246	ch <- prometheus.MustNewConstMetric(
247		c.Comments,
248		prometheus.GaugeValue,
249		float64(stats.Counter.Comment),
250	)
251	ch <- prometheus.MustNewConstMetric(
252		c.Follows,
253		prometheus.GaugeValue,
254		float64(stats.Counter.Follow),
255	)
256	ch <- prometheus.MustNewConstMetric(
257		c.HookTasks,
258		prometheus.GaugeValue,
259		float64(stats.Counter.HookTask),
260	)
261	ch <- prometheus.MustNewConstMetric(
262		c.Issues,
263		prometheus.GaugeValue,
264		float64(stats.Counter.Issue),
265	)
266	for _, il := range stats.Counter.IssueByLabel {
267		ch <- prometheus.MustNewConstMetric(
268			c.IssuesByLabel,
269			prometheus.GaugeValue,
270			float64(il.Count),
271			il.Label,
272		)
273	}
274	for _, ir := range stats.Counter.IssueByRepository {
275		ch <- prometheus.MustNewConstMetric(
276			c.IssuesByRepository,
277			prometheus.GaugeValue,
278			float64(ir.Count),
279			ir.OwnerName+"/"+ir.Repository,
280		)
281	}
282	ch <- prometheus.MustNewConstMetric(
283		c.IssuesClosed,
284		prometheus.GaugeValue,
285		float64(stats.Counter.IssueClosed),
286	)
287	ch <- prometheus.MustNewConstMetric(
288		c.IssuesOpen,
289		prometheus.GaugeValue,
290		float64(stats.Counter.IssueOpen),
291	)
292	ch <- prometheus.MustNewConstMetric(
293		c.Labels,
294		prometheus.GaugeValue,
295		float64(stats.Counter.Label),
296	)
297	ch <- prometheus.MustNewConstMetric(
298		c.LoginSources,
299		prometheus.GaugeValue,
300		float64(stats.Counter.AuthSource),
301	)
302	ch <- prometheus.MustNewConstMetric(
303		c.Milestones,
304		prometheus.GaugeValue,
305		float64(stats.Counter.Milestone),
306	)
307	ch <- prometheus.MustNewConstMetric(
308		c.Mirrors,
309		prometheus.GaugeValue,
310		float64(stats.Counter.Mirror),
311	)
312	ch <- prometheus.MustNewConstMetric(
313		c.Oauths,
314		prometheus.GaugeValue,
315		float64(stats.Counter.Oauth),
316	)
317	ch <- prometheus.MustNewConstMetric(
318		c.Organizations,
319		prometheus.GaugeValue,
320		float64(stats.Counter.Org),
321	)
322	ch <- prometheus.MustNewConstMetric(
323		c.Projects,
324		prometheus.GaugeValue,
325		float64(stats.Counter.Project),
326	)
327	ch <- prometheus.MustNewConstMetric(
328		c.ProjectBoards,
329		prometheus.GaugeValue,
330		float64(stats.Counter.ProjectBoard),
331	)
332	ch <- prometheus.MustNewConstMetric(
333		c.PublicKeys,
334		prometheus.GaugeValue,
335		float64(stats.Counter.PublicKey),
336	)
337	ch <- prometheus.MustNewConstMetric(
338		c.Releases,
339		prometheus.GaugeValue,
340		float64(stats.Counter.Release),
341	)
342	ch <- prometheus.MustNewConstMetric(
343		c.Repositories,
344		prometheus.GaugeValue,
345		float64(stats.Counter.Repo),
346	)
347	ch <- prometheus.MustNewConstMetric(
348		c.Stars,
349		prometheus.GaugeValue,
350		float64(stats.Counter.Star),
351	)
352	ch <- prometheus.MustNewConstMetric(
353		c.Teams,
354		prometheus.GaugeValue,
355		float64(stats.Counter.Team),
356	)
357	ch <- prometheus.MustNewConstMetric(
358		c.UpdateTasks,
359		prometheus.GaugeValue,
360		float64(stats.Counter.UpdateTask),
361	)
362	ch <- prometheus.MustNewConstMetric(
363		c.Users,
364		prometheus.GaugeValue,
365		float64(stats.Counter.User),
366	)
367	ch <- prometheus.MustNewConstMetric(
368		c.Watches,
369		prometheus.GaugeValue,
370		float64(stats.Counter.Watch),
371	)
372	ch <- prometheus.MustNewConstMetric(
373		c.Webhooks,
374		prometheus.GaugeValue,
375		float64(stats.Counter.Webhook),
376	)
377}
378