You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

collector.go 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. // Copyright 2018 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package metrics
  4. import (
  5. "runtime"
  6. activities_model "code.gitea.io/gitea/models/activities"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/modules/setting"
  9. "github.com/prometheus/client_golang/prometheus"
  10. )
  11. const namespace = "gitea_"
  12. // Collector implements the prometheus.Collector interface and
  13. // exposes gitea metrics for prometheus
  14. type Collector struct {
  15. Accesses *prometheus.Desc
  16. Attachments *prometheus.Desc
  17. BuildInfo *prometheus.Desc
  18. Comments *prometheus.Desc
  19. Follows *prometheus.Desc
  20. HookTasks *prometheus.Desc
  21. Issues *prometheus.Desc
  22. IssuesOpen *prometheus.Desc
  23. IssuesClosed *prometheus.Desc
  24. IssuesByLabel *prometheus.Desc
  25. IssuesByRepository *prometheus.Desc
  26. Labels *prometheus.Desc
  27. LoginSources *prometheus.Desc
  28. Milestones *prometheus.Desc
  29. Mirrors *prometheus.Desc
  30. Oauths *prometheus.Desc
  31. Organizations *prometheus.Desc
  32. Projects *prometheus.Desc
  33. ProjectBoards *prometheus.Desc
  34. PublicKeys *prometheus.Desc
  35. Releases *prometheus.Desc
  36. Repositories *prometheus.Desc
  37. Stars *prometheus.Desc
  38. Teams *prometheus.Desc
  39. UpdateTasks *prometheus.Desc
  40. Users *prometheus.Desc
  41. Watches *prometheus.Desc
  42. Webhooks *prometheus.Desc
  43. }
  44. // NewCollector returns a new Collector with all prometheus.Desc initialized
  45. func NewCollector() Collector {
  46. return Collector{
  47. Accesses: prometheus.NewDesc(
  48. namespace+"accesses",
  49. "Number of Accesses",
  50. nil, nil,
  51. ),
  52. Attachments: prometheus.NewDesc(
  53. namespace+"attachments",
  54. "Number of Attachments",
  55. nil, nil,
  56. ),
  57. BuildInfo: prometheus.NewDesc(
  58. namespace+"build_info",
  59. "Build information",
  60. []string{
  61. "goarch",
  62. "goos",
  63. "goversion",
  64. "version",
  65. }, 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. // Describe returns all possible prometheus.Desc
  195. func (c Collector) Describe(ch chan<- *prometheus.Desc) {
  196. ch <- c.Accesses
  197. ch <- c.Attachments
  198. ch <- c.BuildInfo
  199. ch <- c.Comments
  200. ch <- c.Follows
  201. ch <- c.HookTasks
  202. ch <- c.Issues
  203. ch <- c.IssuesByLabel
  204. ch <- c.IssuesByRepository
  205. ch <- c.IssuesOpen
  206. ch <- c.IssuesClosed
  207. ch <- c.Labels
  208. ch <- c.LoginSources
  209. ch <- c.Milestones
  210. ch <- c.Mirrors
  211. ch <- c.Oauths
  212. ch <- c.Organizations
  213. ch <- c.Projects
  214. ch <- c.ProjectBoards
  215. ch <- c.PublicKeys
  216. ch <- c.Releases
  217. ch <- c.Repositories
  218. ch <- c.Stars
  219. ch <- c.Teams
  220. ch <- c.UpdateTasks
  221. ch <- c.Users
  222. ch <- c.Watches
  223. ch <- c.Webhooks
  224. }
  225. // Collect returns the metrics with values
  226. func (c Collector) Collect(ch chan<- prometheus.Metric) {
  227. stats := activities_model.GetStatistic(db.DefaultContext)
  228. ch <- prometheus.MustNewConstMetric(
  229. c.Accesses,
  230. prometheus.GaugeValue,
  231. float64(stats.Counter.Access),
  232. )
  233. ch <- prometheus.MustNewConstMetric(
  234. c.Attachments,
  235. prometheus.GaugeValue,
  236. float64(stats.Counter.Attachment),
  237. )
  238. ch <- prometheus.MustNewConstMetric(
  239. c.BuildInfo,
  240. prometheus.GaugeValue,
  241. 1,
  242. runtime.GOARCH,
  243. runtime.GOOS,
  244. runtime.Version(),
  245. setting.AppVer,
  246. )
  247. ch <- prometheus.MustNewConstMetric(
  248. c.Comments,
  249. prometheus.GaugeValue,
  250. float64(stats.Counter.Comment),
  251. )
  252. ch <- prometheus.MustNewConstMetric(
  253. c.Follows,
  254. prometheus.GaugeValue,
  255. float64(stats.Counter.Follow),
  256. )
  257. ch <- prometheus.MustNewConstMetric(
  258. c.HookTasks,
  259. prometheus.GaugeValue,
  260. float64(stats.Counter.HookTask),
  261. )
  262. ch <- prometheus.MustNewConstMetric(
  263. c.Issues,
  264. prometheus.GaugeValue,
  265. float64(stats.Counter.Issue),
  266. )
  267. for _, il := range stats.Counter.IssueByLabel {
  268. ch <- prometheus.MustNewConstMetric(
  269. c.IssuesByLabel,
  270. prometheus.GaugeValue,
  271. float64(il.Count),
  272. il.Label,
  273. )
  274. }
  275. for _, ir := range stats.Counter.IssueByRepository {
  276. ch <- prometheus.MustNewConstMetric(
  277. c.IssuesByRepository,
  278. prometheus.GaugeValue,
  279. float64(ir.Count),
  280. ir.OwnerName+"/"+ir.Repository,
  281. )
  282. }
  283. ch <- prometheus.MustNewConstMetric(
  284. c.IssuesClosed,
  285. prometheus.GaugeValue,
  286. float64(stats.Counter.IssueClosed),
  287. )
  288. ch <- prometheus.MustNewConstMetric(
  289. c.IssuesOpen,
  290. prometheus.GaugeValue,
  291. float64(stats.Counter.IssueOpen),
  292. )
  293. ch <- prometheus.MustNewConstMetric(
  294. c.Labels,
  295. prometheus.GaugeValue,
  296. float64(stats.Counter.Label),
  297. )
  298. ch <- prometheus.MustNewConstMetric(
  299. c.LoginSources,
  300. prometheus.GaugeValue,
  301. float64(stats.Counter.AuthSource),
  302. )
  303. ch <- prometheus.MustNewConstMetric(
  304. c.Milestones,
  305. prometheus.GaugeValue,
  306. float64(stats.Counter.Milestone),
  307. )
  308. ch <- prometheus.MustNewConstMetric(
  309. c.Mirrors,
  310. prometheus.GaugeValue,
  311. float64(stats.Counter.Mirror),
  312. )
  313. ch <- prometheus.MustNewConstMetric(
  314. c.Oauths,
  315. prometheus.GaugeValue,
  316. float64(stats.Counter.Oauth),
  317. )
  318. ch <- prometheus.MustNewConstMetric(
  319. c.Organizations,
  320. prometheus.GaugeValue,
  321. float64(stats.Counter.Org),
  322. )
  323. ch <- prometheus.MustNewConstMetric(
  324. c.Projects,
  325. prometheus.GaugeValue,
  326. float64(stats.Counter.Project),
  327. )
  328. ch <- prometheus.MustNewConstMetric(
  329. c.ProjectBoards,
  330. prometheus.GaugeValue,
  331. float64(stats.Counter.ProjectBoard),
  332. )
  333. ch <- prometheus.MustNewConstMetric(
  334. c.PublicKeys,
  335. prometheus.GaugeValue,
  336. float64(stats.Counter.PublicKey),
  337. )
  338. ch <- prometheus.MustNewConstMetric(
  339. c.Releases,
  340. prometheus.GaugeValue,
  341. float64(stats.Counter.Release),
  342. )
  343. ch <- prometheus.MustNewConstMetric(
  344. c.Repositories,
  345. prometheus.GaugeValue,
  346. float64(stats.Counter.Repo),
  347. )
  348. ch <- prometheus.MustNewConstMetric(
  349. c.Stars,
  350. prometheus.GaugeValue,
  351. float64(stats.Counter.Star),
  352. )
  353. ch <- prometheus.MustNewConstMetric(
  354. c.Teams,
  355. prometheus.GaugeValue,
  356. float64(stats.Counter.Team),
  357. )
  358. ch <- prometheus.MustNewConstMetric(
  359. c.UpdateTasks,
  360. prometheus.GaugeValue,
  361. float64(stats.Counter.UpdateTask),
  362. )
  363. ch <- prometheus.MustNewConstMetric(
  364. c.Users,
  365. prometheus.GaugeValue,
  366. float64(stats.Counter.User),
  367. )
  368. ch <- prometheus.MustNewConstMetric(
  369. c.Watches,
  370. prometheus.GaugeValue,
  371. float64(stats.Counter.Watch),
  372. )
  373. ch <- prometheus.MustNewConstMetric(
  374. c.Webhooks,
  375. prometheus.GaugeValue,
  376. float64(stats.Counter.Webhook),
  377. )
  378. }