debian-mirror-gitlab/spec/lib/gitlab/sidekiq_middleware_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

155 lines
5 KiB
Ruby
Raw Normal View History

2020-01-01 13:55:28 +05:30
# frozen_string_literal: true
require 'spec_helper'
require 'sidekiq/testing'
2020-07-28 23:09:34 +05:30
RSpec.describe Gitlab::SidekiqMiddleware do
2021-09-04 01:27:46 +05:30
let(:job_args) { [0.01] }
let(:disabled_sidekiq_middlewares) { [] }
let(:chain) { Sidekiq::Middleware::Chain.new }
let(:queue) { 'test' }
let(:enabled_sidekiq_middlewares) { all_sidekiq_middlewares - disabled_sidekiq_middlewares }
let(:worker_class) do
Class.new do
def self.name
'TestWorker'
end
2020-01-01 13:55:28 +05:30
2020-05-24 23:13:21 +05:30
include ApplicationWorker
2021-09-04 01:27:46 +05:30
def perform(*args)
2020-05-24 23:13:21 +05:30
Gitlab::SafeRequestStore['gitaly_call_actual'] = 1
2020-06-23 00:09:42 +05:30
Gitlab::SafeRequestStore[:gitaly_query_time] = 5
2020-05-24 23:13:21 +05:30
end
2020-01-01 13:55:28 +05:30
end
end
2021-09-04 01:27:46 +05:30
before do
stub_const('TestWorker', worker_class)
2020-01-01 13:55:28 +05:30
end
2021-11-18 22:05:49 +05:30
shared_examples "a middleware chain" do
2021-09-04 01:27:46 +05:30
before do
configurator.call(chain)
end
2020-04-22 19:07:51 +05:30
2021-09-04 01:27:46 +05:30
it "passes through the right middlewares", :aggregate_failures do
enabled_sidekiq_middlewares.each do |middleware|
expect_next_instances_of(middleware, 1, true) do |middleware_instance|
expect(middleware_instance).to receive(:call).with(*middleware_expected_args).once.and_call_original
end
2020-04-22 19:07:51 +05:30
end
2021-09-04 01:27:46 +05:30
expect { |b| chain.invoke(*worker_args, &b) }.to yield_control.once
2020-01-01 13:55:28 +05:30
end
2021-09-04 01:27:46 +05:30
end
2021-11-18 22:05:49 +05:30
shared_examples "a middleware chain for mailer" do
2021-09-04 01:27:46 +05:30
let(:worker_class) { ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper }
2020-01-01 13:55:28 +05:30
2021-11-18 22:05:49 +05:30
it_behaves_like "a middleware chain"
2021-09-04 01:27:46 +05:30
end
describe '.server_configurator' do
let(:configurator) { described_class.server_configurator }
let(:worker_args) { [worker_class.new, { 'args' => job_args }, queue] }
let(:middleware_expected_args) { [a_kind_of(worker_class), hash_including({ 'args' => job_args }), queue] }
2020-01-01 13:55:28 +05:30
let(:all_sidekiq_middlewares) do
[
2021-09-04 01:27:46 +05:30
::Gitlab::SidekiqMiddleware::Monitor,
2021-11-18 22:05:49 +05:30
::Labkit::Middleware::Sidekiq::Server,
2021-09-04 01:27:46 +05:30
::Gitlab::SidekiqMiddleware::ServerMetrics,
::Gitlab::SidekiqMiddleware::ArgumentsLogger,
::Gitlab::SidekiqMiddleware::MemoryKiller,
::Gitlab::SidekiqMiddleware::RequestStoreMiddleware,
::Gitlab::SidekiqMiddleware::ExtraDoneLogMetadata,
::Gitlab::SidekiqMiddleware::BatchLoader,
::Gitlab::SidekiqMiddleware::InstrumentationLogger,
::Gitlab::SidekiqMiddleware::AdminMode::Server,
::Gitlab::SidekiqVersioning::Middleware,
::Gitlab::SidekiqStatus::ServerMiddleware,
::Gitlab::SidekiqMiddleware::WorkerContext::Server,
2021-11-11 11:23:49 +05:30
::Gitlab::SidekiqMiddleware::DuplicateJobs::Server,
::Gitlab::Database::LoadBalancing::SidekiqServerMiddleware
2020-01-01 13:55:28 +05:30
]
end
2020-10-24 23:57:45 +05:30
2021-09-04 01:27:46 +05:30
describe "server metrics" do
around do |example|
with_sidekiq_server_middleware do |chain|
described_class.server_configurator(
metrics: true,
arguments_logger: true,
memory_killer: true
).call(chain)
2020-01-01 13:55:28 +05:30
2021-09-04 01:27:46 +05:30
Sidekiq::Testing.inline! { example.run }
2020-04-22 19:07:51 +05:30
end
2021-09-04 01:27:46 +05:30
end
let(:gitaly_histogram) { double(:gitaly_histogram) }
2020-01-01 13:55:28 +05:30
2021-09-04 01:27:46 +05:30
before do
allow(Gitlab::Metrics).to receive(:histogram).and_call_original
allow(Gitlab::Metrics).to receive(:histogram)
.with(:sidekiq_jobs_gitaly_seconds, anything, anything, anything)
.and_return(gitaly_histogram)
end
it "records correct Gitaly duration" do
expect(gitaly_histogram).to receive(:observe).with(anything, 5.0)
2020-04-22 19:07:51 +05:30
worker_class.perform_async(*job_args)
2020-01-01 13:55:28 +05:30
end
end
2021-09-04 01:27:46 +05:30
context "all optional middlewares on" do
2021-11-18 22:05:49 +05:30
it_behaves_like "a middleware chain"
it_behaves_like "a middleware chain for mailer"
2020-01-01 13:55:28 +05:30
end
2021-09-04 01:27:46 +05:30
context "all optional middlewares off" do
let(:configurator) do
described_class.server_configurator(
metrics: false,
arguments_logger: false,
memory_killer: false
)
end
2020-04-08 14:13:33 +05:30
2021-11-18 22:05:49 +05:30
let(:disabled_sidekiq_middlewares) do
[
Gitlab::SidekiqMiddleware::ServerMetrics,
Gitlab::SidekiqMiddleware::ArgumentsLogger,
Gitlab::SidekiqMiddleware::MemoryKiller
]
2021-09-04 01:27:46 +05:30
end
2020-04-08 14:13:33 +05:30
2021-11-18 22:05:49 +05:30
it_behaves_like "a middleware chain"
it_behaves_like "a middleware chain for mailer"
2020-01-01 13:55:28 +05:30
end
end
describe '.client_configurator' do
2021-09-04 01:27:46 +05:30
let(:configurator) { described_class.client_configurator }
2020-01-01 13:55:28 +05:30
let(:redis_pool) { Sidekiq.redis_pool }
2021-09-04 01:27:46 +05:30
let(:middleware_expected_args) { [worker_class, hash_including({ 'args' => job_args }), queue, redis_pool] }
let(:worker_args) { [worker_class, { 'args' => job_args }, queue, redis_pool] }
let(:all_sidekiq_middlewares) do
2020-03-13 15:44:24 +05:30
[
2021-09-04 01:27:46 +05:30
::Gitlab::SidekiqMiddleware::WorkerContext::Client,
::Labkit::Middleware::Sidekiq::Client,
2021-11-11 11:23:49 +05:30
::Gitlab::Database::LoadBalancing::SidekiqClientMiddleware,
2021-09-04 01:27:46 +05:30
::Gitlab::SidekiqMiddleware::DuplicateJobs::Client,
::Gitlab::SidekiqStatus::ClientMiddleware,
::Gitlab::SidekiqMiddleware::AdminMode::Client,
::Gitlab::SidekiqMiddleware::SizeLimiter::Client,
2021-11-11 11:23:49 +05:30
::Gitlab::SidekiqMiddleware::ClientMetrics
2020-03-13 15:44:24 +05:30
]
end
2020-01-01 13:55:28 +05:30
2021-11-18 22:05:49 +05:30
it_behaves_like "a middleware chain"
it_behaves_like "a middleware chain for mailer"
2020-01-01 13:55:28 +05:30
end
end