github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/metric/metrics.go (about) 1 package metric 2 3 import ( 4 "strconv" 5 "strings" 6 "time" 7 8 "github.com/pf-qiu/concourse/v6/atc/db/lock" 9 10 "code.cloudfoundry.org/lager" 11 "github.com/pf-qiu/concourse/v6/atc/db" 12 ) 13 14 type TasksWaitingLabels struct { 15 TeamId string 16 WorkerTags string 17 Platform string 18 } 19 20 type TasksWaitingDuration struct { 21 Labels TasksWaitingLabels 22 Duration time.Duration 23 } 24 25 func (event TasksWaitingDuration) Emit(logger lager.Logger) { 26 Metrics.emit( 27 logger.Session("tasks-waiting-duration"), 28 Event{ 29 Name: "tasks waiting duration", 30 Value: event.Duration.Seconds(), 31 Attributes: map[string]string{ 32 "teamId": event.Labels.TeamId, 33 "workerTags": event.Labels.WorkerTags, 34 "platform": event.Labels.Platform, 35 }, 36 }, 37 ) 38 } 39 40 type BuildCollectorDuration struct { 41 Duration time.Duration 42 } 43 44 func (event BuildCollectorDuration) Emit(logger lager.Logger) { 45 Metrics.emit( 46 logger.Session("gc-build-collector-duration"), 47 Event{ 48 Name: "gc: build collector duration (ms)", 49 Value: ms(event.Duration), 50 }, 51 ) 52 } 53 54 type WorkerCollectorDuration struct { 55 Duration time.Duration 56 } 57 58 func (event WorkerCollectorDuration) Emit(logger lager.Logger) { 59 Metrics.emit( 60 logger.Session("gc-worker-collector-duration"), 61 Event{ 62 Name: "gc: worker collector duration (ms)", 63 Value: ms(event.Duration), 64 }, 65 ) 66 } 67 68 type ResourceCacheUseCollectorDuration struct { 69 Duration time.Duration 70 } 71 72 func (event ResourceCacheUseCollectorDuration) Emit(logger lager.Logger) { 73 Metrics.emit( 74 logger.Session("gc-resource-cache-use-collector-duration"), 75 Event{ 76 Name: "gc: resource cache use collector duration (ms)", 77 Value: ms(event.Duration), 78 }, 79 ) 80 } 81 82 type ResourceConfigCollectorDuration struct { 83 Duration time.Duration 84 } 85 86 func (event ResourceConfigCollectorDuration) Emit(logger lager.Logger) { 87 Metrics.emit( 88 logger.Session("gc-resource-config-collector-duration"), 89 Event{ 90 Name: "gc: resource config collector duration (ms)", 91 Value: ms(event.Duration), 92 }, 93 ) 94 } 95 96 type ResourceCacheCollectorDuration struct { 97 Duration time.Duration 98 } 99 100 func (event ResourceCacheCollectorDuration) Emit(logger lager.Logger) { 101 Metrics.emit( 102 logger.Session("gc-resource-cache-collector-duration"), 103 Event{ 104 Name: "gc: resource cache collector duration (ms)", 105 Value: ms(event.Duration), 106 }, 107 ) 108 } 109 110 type ResourceConfigCheckSessionCollectorDuration struct { 111 Duration time.Duration 112 } 113 114 func (event ResourceConfigCheckSessionCollectorDuration) Emit(logger lager.Logger) { 115 Metrics.emit( 116 logger.Session("gc-resource-config-check-session-collector-duration"), 117 Event{ 118 Name: "gc: resource config check session collector duration (ms)", 119 Value: ms(event.Duration), 120 }, 121 ) 122 } 123 124 type ArtifactCollectorDuration struct { 125 Duration time.Duration 126 } 127 128 func (event ArtifactCollectorDuration) Emit(logger lager.Logger) { 129 Metrics.emit( 130 logger.Session("gc-artifact-collector-duration"), 131 Event{ 132 Name: "gc: artifact collector duration (ms)", 133 Value: ms(event.Duration), 134 }, 135 ) 136 } 137 138 type ContainerCollectorDuration struct { 139 Duration time.Duration 140 } 141 142 func (event ContainerCollectorDuration) Emit(logger lager.Logger) { 143 Metrics.emit( 144 logger.Session("gc-container-collector-duration"), 145 Event{ 146 Name: "gc: container collector duration (ms)", 147 Value: ms(event.Duration), 148 }, 149 ) 150 } 151 152 type VolumeCollectorDuration struct { 153 Duration time.Duration 154 } 155 156 func (event VolumeCollectorDuration) Emit(logger lager.Logger) { 157 Metrics.emit( 158 logger.Session("gc-volume-collector-duration"), 159 Event{ 160 Name: "gc: volume collector duration (ms)", 161 Value: ms(event.Duration), 162 }, 163 ) 164 } 165 166 type SchedulingJobDuration struct { 167 PipelineName string 168 JobName string 169 JobID int 170 Duration time.Duration 171 } 172 173 func (event SchedulingJobDuration) Emit(logger lager.Logger) { 174 Metrics.emit( 175 logger.Session("job-scheduling-duration"), 176 Event{ 177 Name: "scheduling: job duration (ms)", 178 Value: ms(event.Duration), 179 Attributes: map[string]string{ 180 "pipeline": event.PipelineName, 181 "job": event.JobName, 182 "job_id": strconv.Itoa(event.JobID), 183 }, 184 }, 185 ) 186 } 187 188 type WorkerContainers struct { 189 WorkerName string 190 Platform string 191 Containers int 192 TeamName string 193 Tags []string 194 } 195 196 func (event WorkerContainers) Emit(logger lager.Logger) { 197 Metrics.emit( 198 logger.Session("worker-containers"), 199 Event{ 200 Name: "worker containers", 201 Value: float64(event.Containers), 202 Attributes: map[string]string{ 203 "worker": event.WorkerName, 204 "platform": event.Platform, 205 "team_name": event.TeamName, 206 "tags": strings.Join(event.Tags[:], "/"), 207 }, 208 }, 209 ) 210 } 211 212 type WorkerUnknownContainers struct { 213 WorkerName string 214 Containers int 215 } 216 217 func (event WorkerUnknownContainers) Emit(logger lager.Logger) { 218 Metrics.emit( 219 logger.Session("worker-unknown-containers"), 220 Event{ 221 Name: "worker unknown containers", 222 Value: float64(event.Containers), 223 Attributes: map[string]string{ 224 "worker": event.WorkerName, 225 }, 226 }, 227 ) 228 } 229 230 type WorkerVolumes struct { 231 WorkerName string 232 Platform string 233 Volumes int 234 TeamName string 235 Tags []string 236 } 237 238 func (event WorkerVolumes) Emit(logger lager.Logger) { 239 Metrics.emit( 240 logger.Session("worker-volumes"), 241 Event{ 242 Name: "worker volumes", 243 Value: float64(event.Volumes), 244 Attributes: map[string]string{ 245 "worker": event.WorkerName, 246 "platform": event.Platform, 247 "team_name": event.TeamName, 248 "tags": strings.Join(event.Tags[:], "/"), 249 }, 250 }, 251 ) 252 } 253 254 type WorkerUnknownVolumes struct { 255 WorkerName string 256 Volumes int 257 } 258 259 func (event WorkerUnknownVolumes) Emit(logger lager.Logger) { 260 Metrics.emit( 261 logger.Session("worker-unknown-volumes"), 262 Event{ 263 Name: "worker unknown volumes", 264 Value: float64(event.Volumes), 265 Attributes: map[string]string{ 266 "worker": event.WorkerName, 267 }, 268 }, 269 ) 270 } 271 272 type WorkerTasks struct { 273 WorkerName string 274 Platform string 275 Tasks int 276 } 277 278 func (event WorkerTasks) Emit(logger lager.Logger) { 279 Metrics.emit( 280 logger.Session("worker-tasks"), 281 Event{ 282 Name: "worker tasks", 283 Value: float64(event.Tasks), 284 Attributes: map[string]string{ 285 "worker": event.WorkerName, 286 "platform": event.Platform, 287 }, 288 }, 289 ) 290 } 291 292 type VolumesToBeGarbageCollected struct { 293 Volumes int 294 } 295 296 func (event VolumesToBeGarbageCollected) Emit(logger lager.Logger) { 297 Metrics.emit( 298 logger.Session("gc-found-orphaned-volumes-for-deletion"), 299 Event{ 300 Name: "orphaned volumes to be garbage collected", 301 Value: float64(event.Volumes), 302 Attributes: map[string]string{}, 303 }, 304 ) 305 } 306 307 type CreatingContainersToBeGarbageCollected struct { 308 Containers int 309 } 310 311 func (event CreatingContainersToBeGarbageCollected) Emit(logger lager.Logger) { 312 Metrics.emit( 313 logger.Session("gc-found-creating-containers-for-deletion"), 314 Event{ 315 Name: "creating containers to be garbage collected", 316 Value: float64(event.Containers), 317 Attributes: map[string]string{}, 318 }, 319 ) 320 } 321 322 type CreatedContainersToBeGarbageCollected struct { 323 Containers int 324 } 325 326 func (event CreatedContainersToBeGarbageCollected) Emit(logger lager.Logger) { 327 Metrics.emit( 328 logger.Session("gc-found-created-ccontainers-for-deletion"), 329 Event{ 330 Name: "created containers to be garbage collected", 331 Value: float64(event.Containers), 332 Attributes: map[string]string{}, 333 }, 334 ) 335 } 336 337 type DestroyingContainersToBeGarbageCollected struct { 338 Containers int 339 } 340 341 func (event DestroyingContainersToBeGarbageCollected) Emit(logger lager.Logger) { 342 Metrics.emit( 343 logger.Session("gc-found-destroying-containers-for-deletion"), 344 Event{ 345 Name: "destroying containers to be garbage collected", 346 Value: float64(event.Containers), 347 Attributes: map[string]string{}, 348 }, 349 ) 350 } 351 352 type FailedContainersToBeGarbageCollected struct { 353 Containers int 354 } 355 356 func (event FailedContainersToBeGarbageCollected) Emit(logger lager.Logger) { 357 Metrics.emit( 358 logger.Session("gc-found-failed-containers-for-deletion"), 359 Event{ 360 Name: "failed containers to be garbage collected", 361 Value: float64(event.Containers), 362 Attributes: map[string]string{}, 363 }, 364 ) 365 } 366 367 type CreatedVolumesToBeGarbageCollected struct { 368 Volumes int 369 } 370 371 func (event CreatedVolumesToBeGarbageCollected) Emit(logger lager.Logger) { 372 Metrics.emit( 373 logger.Session("gc-found-created-volumes-for-deletion"), 374 Event{ 375 Name: "created volumes to be garbage collected", 376 Value: float64(event.Volumes), 377 Attributes: map[string]string{}, 378 }, 379 ) 380 } 381 382 type DestroyingVolumesToBeGarbageCollected struct { 383 Volumes int 384 } 385 386 func (event DestroyingVolumesToBeGarbageCollected) Emit(logger lager.Logger) { 387 Metrics.emit( 388 logger.Session("gc-found-destroying-volumes-for-deletion"), 389 Event{ 390 Name: "destroying volumes to be garbage collected", 391 Value: float64(event.Volumes), 392 Attributes: map[string]string{}, 393 }, 394 ) 395 } 396 397 type FailedVolumesToBeGarbageCollected struct { 398 Volumes int 399 } 400 401 func (event FailedVolumesToBeGarbageCollected) Emit(logger lager.Logger) { 402 Metrics.emit( 403 logger.Session("gc-found-failed-volumes-for-deletion"), 404 Event{ 405 Name: "failed volumes to be garbage collected", 406 Value: float64(event.Volumes), 407 Attributes: map[string]string{}, 408 }, 409 ) 410 } 411 412 type GarbageCollectionContainerCollectorJobDropped struct { 413 WorkerName string 414 } 415 416 func (event GarbageCollectionContainerCollectorJobDropped) Emit(logger lager.Logger) { 417 Metrics.emit( 418 logger.Session("gc-container-collector-dropped"), 419 Event{ 420 Name: "GC container collector job dropped", 421 Value: 1, 422 Attributes: map[string]string{ 423 "worker": event.WorkerName, 424 }, 425 }, 426 ) 427 } 428 429 type BuildStarted struct { 430 Build db.Build 431 } 432 433 func (event BuildStarted) Emit(logger lager.Logger) { 434 Metrics.emit( 435 logger.Session("build-started"), 436 Event{ 437 Name: "build started", 438 Value: float64(event.Build.ID()), 439 Attributes: event.Build.TracingAttrs(), 440 }, 441 ) 442 } 443 444 type BuildFinished struct { 445 Build db.Build 446 } 447 448 func (event BuildFinished) Emit(logger lager.Logger) { 449 attrs := event.Build.TracingAttrs() 450 attrs["build_status"] = event.Build.Status().String() 451 452 Metrics.emit( 453 logger.Session("build-finished"), 454 Event{ 455 Name: "build finished", 456 Value: ms(event.Build.EndTime().Sub(event.Build.StartTime())), 457 Attributes: attrs, 458 }, 459 ) 460 } 461 462 func ms(duration time.Duration) float64 { 463 return float64(duration) / 1000000 464 } 465 466 type ErrorLog struct { 467 Message string 468 Value int 469 } 470 471 func (e ErrorLog) Emit(logger lager.Logger, m *Monitor) { 472 m.emit( 473 logger.Session("error-log"), 474 Event{ 475 Name: "error log", 476 Value: float64(e.Value), 477 Attributes: map[string]string{ 478 "message": e.Message, 479 }, 480 }, 481 ) 482 } 483 484 type HTTPResponseTime struct { 485 Route string 486 Path string 487 Method string 488 StatusCode int 489 Duration time.Duration 490 } 491 492 func (event HTTPResponseTime) Emit(logger lager.Logger, m *Monitor) { 493 m.emit( 494 logger.Session("http-response-time"), 495 Event{ 496 Name: "http response time", 497 Value: ms(event.Duration), 498 Attributes: map[string]string{ 499 "route": event.Route, 500 "path": event.Path, 501 "method": event.Method, 502 "status": strconv.Itoa(event.StatusCode), 503 }, 504 }, 505 ) 506 } 507 508 var lockTypeNames = map[int]string{ 509 lock.LockTypeResourceConfigChecking: "ResourceConfigChecking", 510 lock.LockTypeBuildTracking: "BuildTracking", 511 lock.LockTypeJobScheduling: "JobScheduling", 512 lock.LockTypeBatch: "Batch", 513 lock.LockTypeVolumeCreating: "VolumeCreating", 514 lock.LockTypeContainerCreating: "ContainerCreating", 515 lock.LockTypeDatabaseMigration: "DatabaseMigration", 516 lock.LockTypeActiveTasks: "ActiveTasks", 517 lock.LockTypeResourceScanning: "ResourceScanning", 518 } 519 520 type LockAcquired struct { 521 LockType string 522 } 523 524 func (event LockAcquired) Emit(logger lager.Logger) { 525 Metrics.emit( 526 logger.Session("lock-acquired"), 527 Event{ 528 Name: "lock held", 529 Value: 1, 530 Attributes: map[string]string{ 531 "type": event.LockType, 532 }, 533 }, 534 ) 535 } 536 537 type LockReleased struct { 538 LockType string 539 } 540 541 func (event LockReleased) Emit(logger lager.Logger) { 542 Metrics.emit( 543 logger.Session("lock-released"), 544 Event{ 545 Name: "lock held", 546 Value: 0, 547 Attributes: map[string]string{ 548 "type": event.LockType, 549 }, 550 }, 551 ) 552 } 553 554 func LogLockAcquired(logger lager.Logger, lockID lock.LockID) { 555 logger.Debug("acquired") 556 557 if len(lockID) == 0 { 558 return 559 } 560 561 if lockType, ok := lockTypeNames[lockID[0]]; ok { 562 LockAcquired{LockType: lockType}.Emit(logger) 563 } 564 } 565 566 func LogLockReleased(logger lager.Logger, lockID lock.LockID) { 567 logger.Debug("released") 568 569 if len(lockID) == 0 { 570 return 571 } 572 573 if lockType, ok := lockTypeNames[lockID[0]]; ok { 574 LockReleased{LockType: lockType}.Emit(logger) 575 } 576 } 577 578 type WorkersState struct { 579 WorkerStateByName map[string]db.WorkerState 580 } 581 582 func (event WorkersState) Emit(logger lager.Logger, m *Monitor) { 583 for _, state := range db.AllWorkerStates() { 584 count := 0 585 for _, workerState := range event.WorkerStateByName { 586 if workerState == state { 587 count += 1 588 } 589 } 590 591 m.emit( 592 logger.Session("worker-state"), 593 Event{ 594 Name: "worker state", 595 Value: float64(count), 596 Attributes: map[string]string{ 597 "state": string(state), 598 }, 599 }, 600 ) 601 } 602 }