class GitLab::Monitor::Database::CiBuildsCollector

A helper class to collect CI builds metrics.

Constants

BUILDS_QUERY_CE
BUILDS_QUERY_EE
DEFAULT_UNARCHIVED_TRACES_OFFSET_MINUTES
MIRROR_COLUMN_QUERY
PER_RUNNER_QUERY_CE
PER_RUNNER_QUERY_EE
REPEATED_COMMANDS_QUERY_CE
REPEATED_COMMANDS_QUERY_EE
SET_RANDOM_PAGE_COST
STALE_BUILDS_QUERY
STATUS_CREATED
STATUS_PENDING
UNARCHIVED_TRACES_QUERY

Public Class Methods

new(opts) click to toggle source
Calls superclass method GitLab::Monitor::Database::Base::new
# File lib/gitlab_monitor/database/ci_builds.rb, line 256
def initialize(opts)
  super(opts)

  @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]
end

Public Instance Methods

run() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 264
def run
  results = {}
  results[:created_builds] = builds(STATUS_CREATED) unless @created_builds_counting_disabled
  results[:pending_builds] = builds(STATUS_PENDING)
  results[:stale_builds] = stale_builds
  results[:per_runner] = per_runner_builds
  results[:repeated_commands] = repeated_commands
  results[:unarchived_traces] = unarchived_traces
  results
end

Private Instance Methods

allowed_repeated_commands_count() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 343
def allowed_repeated_commands_count
  @allowed_repeated_commands_count ||= 2
end
builds(status) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 277
def builds(status)
  results = []

  query = mirror_column? ? BUILDS_QUERY_EE : BUILDS_QUERY_CE
  query = query % [status] # rubocop:disable Style/FormatString
  exec_query_with_custom_random_page_cost(query).each do |row|
    results << transform_builds_row_to_values(row)
  end

  results
rescue PG::UndefinedTable, PG::UndefinedColumn
  results
end
exec_query_with_custom_random_page_cost(query) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 388
def exec_query_with_custom_random_page_cost(query)
  with_connection_pool do |conn|
    conn.transaction do |trans|
      trans.exec(SET_RANDOM_PAGE_COST)
      trans.exec(query)
    end
  end
end
include_bool_if_row_defined(row, field) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 383
def include_bool_if_row_defined(row, field)
  return {} unless row[field.to_s]
  { field => row[field.to_s] == "t" ? "yes" : "no" }
end
include_ee_fields(values, row) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 372
def include_ee_fields(values, row)
  values.merge!(include_bool_if_row_defined(row, :mirror))
  values.merge!(include_bool_if_row_defined(row, :mirror_trigger_builds))
  include_has_minutes_field(values, row)
end
include_has_minutes_field(values, row) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 378
def include_has_minutes_field(values, row)
  values.merge!(include_bool_if_row_defined(row, :has_minutes))
  values
end
mirror_column?() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 397
def mirror_column?
  @mirror_column ||=
    begin
      with_connection_pool do |conn|
        conn.exec(MIRROR_COLUMN_QUERY)[0]["exists"] == "t"
      end
    rescue PG::UndefinedColumn
      false
    end
end
per_runner_builds() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 306
def per_runner_builds
  results = []

  query = mirror_column? ? PER_RUNNER_QUERY_EE : PER_RUNNER_QUERY_CE
  exec_query_with_custom_random_page_cost(query).each do |row|
    results << transform_per_runners_builds_row_to_values(row)
  end

  results
rescue PG::UndefinedTable, PG::UndefinedColumn
  []
end
repeated_commands() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 329
def repeated_commands
  results = []

  query = mirror_column? ? REPEATED_COMMANDS_QUERY_EE : REPEATED_COMMANDS_QUERY_CE
  query = query % [allowed_repeated_commands_count] # rubocop:disable Style/FormatString
  exec_query_with_custom_random_page_cost(query).each do |row|
    results << transform_repeated_commands_row_to_values(row)
  end

  results
rescue PG::UndefinedTable, PG::UndefinedColumn
  []
end
stale_builds() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 298
def stale_builds
  with_connection_pool do |conn|
    conn.exec(STALE_BUILDS_QUERY)[0]["count"].to_i
  end
rescue PG::UndefinedTable, PG::UndefinedColumn
  0
end
transform_builds_row_to_values(row) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 291
def transform_builds_row_to_values(row)
  values = { namespace: row["namespace_id"].to_s,
             shared_runners: row["shared_runners_enabled"] == "t" ? "yes" : "no",
             value: row["count"].to_i }
  include_ee_fields(values, row)
end
transform_per_runners_builds_row_to_values(row) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 319
def transform_per_runners_builds_row_to_values(row)
  values = { runner: row["runner_id"].to_s,
             shared_runner: row["is_shared"] == "t" ? "yes" : "no",
             namespace: row["namespace_id"].to_s,
             scheduled: row["pipeline_schedule_id"] ? "yes" : "no",
             triggered: row["trigger_request_id"] ? "yes" : "no",
             value: row["count"].to_i }
  include_ee_fields(values, row)
end
transform_repeated_commands_row_to_values(row) click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 347
def transform_repeated_commands_row_to_values(row)
  values = { namespace: row["namespace_id"].to_s,
             project: row["project_id"].to_s,
             shared_runners: row["shared_runners_enabled"] == "t" ? "yes" : "no",
             status: row["status"].to_s,
             value: row["count"].to_i }

  include_has_minutes_field(values, row)
end
unarchived_traces() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 357
def unarchived_traces
  time = Time.now - (unarchived_traces_offset_minutes * 60)
  query = UNARCHIVED_TRACES_QUERY % [time.strftime("%F %T")] # rubocop:disable Style/FormatString

  with_connection_pool do |conn|
    conn.exec(query)[0]["count"].to_i
  end
rescue PG::UndefinedTable, PG::UndefinedColumn
  0
end
unarchived_traces_offset_minutes() click to toggle source
# File lib/gitlab_monitor/database/ci_builds.rb, line 368
def unarchived_traces_offset_minutes
  @unarchived_traces_offset_minutes ||= DEFAULT_UNARCHIVED_TRACES_OFFSET_MINUTES
end