Commit 7b344cf6 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Add metrics for build queue push/pop operations

parent 063a8c8c
...@@ -17,10 +17,10 @@ module Ci ...@@ -17,10 +17,10 @@ module Ci
raise InvalidQueueTransition unless transition.to == 'pending' raise InvalidQueueTransition unless transition.to == 'pending'
transition.within_transaction do transition.within_transaction do
::Ci::PendingBuild.create!(build: build, project: build.project) ::Ci::PendingBuild.create!(build: build, project: build.project).tap do
metrics.increment_queue_operation(:build_queue_push)
end
end end
# TODO increment pending builds counter
end end
## ##
...@@ -30,10 +30,14 @@ module Ci ...@@ -30,10 +30,14 @@ module Ci
raise InvalidQueueTransition unless transition.from == 'pending' raise InvalidQueueTransition unless transition.from == 'pending'
transition.within_transaction do transition.within_transaction do
::Ci::PendingBuild.find_by(build_id: build.id)&.destroy! # rubocop:disable CodeReuse/ActiveRecord ::Ci::PendingBuild.find_by(build_id: build.id).tap do |queued| # rubocop:disable CodeReuse/ActiveRecord
end next unless queued.present?
# TODO decrement pending builds counter queued.destroy!
metrics.increment_queue_operation(:build_queue_pop)
end
end
end end
## ##
......
...@@ -20,6 +20,8 @@ module Gitlab ...@@ -20,6 +20,8 @@ module Gitlab
:build_can_pick, :build_can_pick,
:build_not_pick, :build_not_pick,
:build_not_pending, :build_not_pending,
:build_queue_push,
:build_queue_pop,
:build_temporary_locked, :build_temporary_locked,
:build_conflict_lock, :build_conflict_lock,
:build_conflict_exception, :build_conflict_exception,
...@@ -77,11 +79,7 @@ module Gitlab ...@@ -77,11 +79,7 @@ module Gitlab
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
def increment_queue_operation(operation) def increment_queue_operation(operation)
if !Rails.env.production? && !OPERATION_COUNTERS.include?(operation) self.class.increment_queue_operation(operation)
raise ArgumentError, "unknown queue operation: #{operation}"
end
self.class.queue_operations_total.increment(operation: operation)
end end
def observe_queue_depth(queue, size) def observe_queue_depth(queue, size)
...@@ -121,6 +119,14 @@ module Gitlab ...@@ -121,6 +119,14 @@ module Gitlab
result result
end end
def self.increment_queue_operation(operation)
if !Rails.env.production? && !OPERATION_COUNTERS.include?(operation)
raise ArgumentError, "unknown queue operation: #{operation}"
end
queue_operations_total.increment(operation: operation)
end
def self.observe_active_runners(runners_proc) def self.observe_active_runners(runners_proc)
return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false) return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
......
...@@ -18,6 +18,18 @@ RSpec.describe Ci::UpdateBuildQueueService do ...@@ -18,6 +18,18 @@ RSpec.describe Ci::UpdateBuildQueueService do
expect(queued.project).to eq project expect(queued.project).to eq project
end end
it 'increments queue push metric' do
metrics = spy('metrics')
transition = double(to: 'pending')
allow(transition).to receive(:within_transaction).and_yield
described_class.new(metrics).push(build, transition)
expect(metrics)
.to have_received(:increment_queue_operation)
.with(:build_queue_push)
end
it 'raises an error when invalid transition is detected' do it 'raises an error when invalid transition is detected' do
transition = double(to: 'created') transition = double(to: 'created')
...@@ -27,10 +39,10 @@ RSpec.describe Ci::UpdateBuildQueueService do ...@@ -27,10 +39,10 @@ RSpec.describe Ci::UpdateBuildQueueService do
end end
describe '#pop' do describe '#pop' do
it 'it removes pending build in a transaction' do it 'removes pending build in a transaction' do
transition = double(from: 'pending') transition = double(from: 'pending')
allow(transition).to receive(:within_transaction).and_yield allow(transition).to receive(:within_transaction).and_yield
queued = Ci::PendingBuild.create!(build: build, project: project) Ci::PendingBuild.create!(build: build, project: project)
dequeued = subject.pop(build, transition) dequeued = subject.pop(build, transition)
...@@ -39,6 +51,19 @@ RSpec.describe Ci::UpdateBuildQueueService do ...@@ -39,6 +51,19 @@ RSpec.describe Ci::UpdateBuildQueueService do
expect(dequeued).to be_destroyed expect(dequeued).to be_destroyed
end end
it 'increments queue pop metric' do
metrics = spy('metrics')
transition = double(from: 'pending')
allow(transition).to receive(:within_transaction).and_yield
Ci::PendingBuild.create!(build: build, project: project)
described_class.new(metrics).pop(build, transition)
expect(metrics)
.to have_received(:increment_queue_operation)
.with(:build_queue_pop)
end
it 'does nothing if there is no pending build to remove' do it 'does nothing if there is no pending build to remove' do
transition = double(from: 'pending') transition = double(from: 'pending')
allow(transition).to receive(:within_transaction).and_yield allow(transition).to receive(:within_transaction).and_yield
...@@ -59,13 +84,13 @@ RSpec.describe Ci::UpdateBuildQueueService do ...@@ -59,13 +84,13 @@ RSpec.describe Ci::UpdateBuildQueueService do
describe '#tick' do describe '#tick' do
shared_examples 'refreshes runner' do shared_examples 'refreshes runner' do
it 'ticks runner queue value' do it 'ticks runner queue value' do
expect { subject.tick!(build) }.to change { runner.ensure_runner_queue_value } expect { subject.tick(build) }.to change { runner.ensure_runner_queue_value }
end end
end end
shared_examples 'does not refresh runner' do shared_examples 'does not refresh runner' do
it 'ticks runner queue value' do it 'ticks runner queue value' do
expect { subject.tick!(build) }.not_to change { runner.ensure_runner_queue_value } expect { subject.tick(build) }.not_to change { runner.ensure_runner_queue_value }
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment