common/config/runner/monitoring/job_queuing_durations.go (59 lines of code) (raw):

package monitoring import ( "fmt" "regexp" "time" "gitlab.com/gitlab-org/gitlab-runner/helpers/timeperiod" ) type JobQueuingDurations []*JobQueuingDuration func (d JobQueuingDurations) Compile() error { var err error for id, q := range d { err = q.Compile() if err != nil { return fmt.Errorf("entry %d: %w", id, err) } } return nil } func (d JobQueuingDurations) GetActiveConfiguration() *JobQueuingDuration { for i := len(d) - 1; i >= 0; i-- { if d[i].InPeriod() { return d[i] } } return nil } type JobQueuingDuration struct { Periods []string `toml:"periods" long:"periods"` Timezone string `toml:"timezone" long:"timezone" json:",omitempty"` Threshold time.Duration `toml:"threshold" long:"threshold"` JobsRunningForProject string `toml:"jobs_running_for_project,omitempty" long:"jobs-running-for-project" json:",omitempty"` jobsRunningForProjectRx *regexp.Regexp timePeriod *timeperiod.TimePeriod timer func() time.Time } func (d *JobQueuingDuration) Compile() error { var err error if d.timer == nil { d.timer = time.Now } d.timePeriod, err = timeperiod.TimePeriodsWithTimer(d.Periods, d.Timezone, d.timer) if err != nil { return fmt.Errorf("periods: %w", err) } d.jobsRunningForProjectRx, err = regexp.Compile(d.JobsRunningForProject) if err != nil { return fmt.Errorf("jobs_running_for_project: %w", err) } return nil } func (d *JobQueuingDuration) InPeriod() bool { return d.timePeriod.InPeriod() } func (d *JobQueuingDuration) JobsRunningForProjectMatched(s string) bool { // If regexp was invalid or not configured at all, we ignore this part of the check if d.jobsRunningForProjectRx == nil { return true } return d.jobsRunningForProjectRx.MatchString(s) }