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