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