github.com/nilium/gitlab-runner@v12.5.0+incompatible/helpers/prometheus/failures_collector.go (about) 1 package prometheus 2 3 import ( 4 "sync" 5 6 "github.com/prometheus/client_golang/prometheus" 7 8 "gitlab.com/gitlab-org/gitlab-runner/common" 9 ) 10 11 var numJobFailuresDesc = prometheus.NewDesc( 12 "gitlab_runner_failed_jobs_total", 13 "Total number of failed jobs", 14 []string{"runner", "failure_reason"}, 15 nil, 16 ) 17 18 type failurePermutation struct { 19 runnerDescription string 20 reason common.JobFailureReason 21 } 22 23 type FailuresCollector struct { 24 lock sync.RWMutex 25 26 failures map[failurePermutation]int64 27 } 28 29 func (fc *FailuresCollector) RecordFailure(reason common.JobFailureReason, runnerDescription string) { 30 failure := failurePermutation{ 31 runnerDescription: runnerDescription, 32 reason: reason, 33 } 34 35 fc.lock.Lock() 36 defer fc.lock.Unlock() 37 38 if _, ok := fc.failures[failure]; ok { 39 fc.failures[failure]++ 40 } else { 41 fc.failures[failure] = 1 42 } 43 } 44 45 func (fc *FailuresCollector) Describe(ch chan<- *prometheus.Desc) { 46 ch <- numJobFailuresDesc 47 } 48 49 func (fc *FailuresCollector) Collect(ch chan<- prometheus.Metric) { 50 fc.lock.RLock() 51 defer fc.lock.RUnlock() 52 53 for failure, number := range fc.failures { 54 ch <- prometheus.MustNewConstMetric( 55 numJobFailuresDesc, 56 prometheus.CounterValue, 57 float64(number), 58 failure.runnerDescription, 59 string(failure.reason), 60 ) 61 } 62 } 63 64 func NewFailuresCollector() *FailuresCollector { 65 return &FailuresCollector{ 66 failures: make(map[failurePermutation]int64), 67 } 68 }