class GitLab::Monitor::Database::CiBuildsProber

The prober which is called when gathering metrics

Public Class Methods

new(opts, metrics: PrometheusMetrics.new) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 411
def initialize(opts, metrics: PrometheusMetrics.new)
  @metrics = metrics

  collector_opts = { connection_string: opts[:connection_string],
                     allowed_repeated_commands_count: opts[:allowed_repeated_commands_count],
                     created_builds_counting_disabled: opts[:created_builds_counting_disabled],
                     unarchived_traces_offset_minutes: opts[:unarchived_traces_offset_minutes] }
  @collector = CiBuildsCollector.new(collector_opts)
end

Public Instance Methods

probe_db() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 421
def probe_db
  @results = @collector.run

  ci_builds_metrics(@results[:created_builds], "ci_created_builds") if @results[:created_builds]
  ci_builds_metrics(@results[:pending_builds], "ci_pending_builds")
  ci_stale_builds_metrics
  metrics_per_runner
  repeated_commands_metrics
  unarchived_traces_metrics

  self
rescue PG::ConnectionBad
  self
end
write_to(target) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 436
def write_to(target)
  target.write(@metrics.to_s)
end

Private Instance Methods

add_ci_created_pending_builds(metric_name, value, labels) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 462
def add_ci_created_pending_builds(metric_name, value, labels)
  add_metric_with_namespace_label(metric_name,
                                  [:namespace, :shared_runners, :has_minutes],
                                  value,
                                  labels)
end
add_ci_running_builds(value, labels) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 496
def add_ci_running_builds(value, labels)
  add_metric_with_namespace_label(
    "ci_running_builds",
    [:runner, :namespace, :shared_runner, :scheduled,
     :triggered, :mirror, :mirror_trigger_builds, :has_minutes],
    value,
    labels
  )
end
add_metric_with_namespace_label(metric_name, allowed_labels, value, labels) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 506
def add_metric_with_namespace_label(metric_name, allowed_labels, value, labels)
  labels[:namespace] = "" unless labels[:namespace]

  selected_labels = labels.select { |k, _| allowed_labels.include?(k) }.sort.to_h
  @metrics.add(metric_name, value, selected_labels)
end
ci_builds_metrics(results_list, metric_name) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 442
def ci_builds_metrics(results_list, metric_name)
  other_values = {}

  results_list.each do |metric|
    # If we have a low value, put the value into an "other" bucket.
    if metric[:value] < 10
      key = { shared_runners: metric[:shared_runners] }
      key[:has_minutes] = metric[:has_minutes] if metric[:has_minutes]

      other_values[key] ||= 0
      other_values[key] += metric[:value]
    else
      add_ci_created_pending_builds(metric_name, metric[:value], metric)
    end
  end

  # Add metrics for the "other" bucket.
  other_values.each { |key, value| add_ci_created_pending_builds(metric_name, value, key) }
end
ci_stale_builds_metrics() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 469
def ci_stale_builds_metrics
  @metrics.add("ci_stale_builds", @results[:stale_builds])
end
metrics_per_runner() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 473
def metrics_per_runner
  other_values = {}

  @results[:per_runner].each do |metric|
    # If we have a low value, put the value into an "other" bucket.
    if metric[:value] < 10
      key = { runner: metric[:runner], shared_runner: metric[:shared_runner],
              scheduled: metric[:scheduled], triggered: metric[:triggered] }
      key[:mirror] = metric[:mirror] if metric[:mirror]
      key[:mirror_trigger_builds] = metric[:mirror_trigger_builds] if metric[:mirror_trigger_builds]
      key[:has_minutes] = metric[:has_minutes] if metric[:has_minutes]

      other_values[key] ||= 0
      other_values[key] += metric[:value]
    else
      add_ci_running_builds(metric[:value], metric)
    end
  end

  # Add metrics for the "other" bucket.
  other_values.each { |key, value| add_ci_running_builds(value, key) }
end
repeated_commands_metrics() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 513
def repeated_commands_metrics
  @results[:repeated_commands].each do |metric|
    value = metric.delete(:value)

    @metrics.add("ci_repeated_commands_builds", value, metric)
  end
end
unarchived_traces_metrics() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 521
def unarchived_traces_metrics
  @metrics.add("ci_unarchived_traces", @results[:unarchived_traces])
end