mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-07-25 17:08:32 +00:00
109 lines
5.3 KiB
Ruby
109 lines
5.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
# The SidekiqMiddleware class is responsible for configuring the
|
|
# middleware stacks used in the client and server middlewares
|
|
module SidekiqMiddleware
|
|
class Client
|
|
def self.middlewares
|
|
[
|
|
# ConcurrencyLimit::Resume needs to be first and before Labkit and ConcurrencyLimit::Client
|
|
::Gitlab::SidekiqMiddleware::ConcurrencyLimit::Resume,
|
|
::Gitlab::SidekiqMiddleware::WorkerContext::Client, # needs to be before the Labkit middleware
|
|
::Labkit::Middleware::Sidekiq::Client,
|
|
# Sidekiq Client Middleware should be placed before DuplicateJobs::Client middleware,
|
|
# so we can store WAL location before we deduplicate the job.
|
|
::Gitlab::Database::LoadBalancing::SidekiqClientMiddleware,
|
|
::Gitlab::SidekiqMiddleware::PauseControl::Client,
|
|
::Gitlab::SidekiqMiddleware::ConcurrencyLimit::Client,
|
|
# NOTE: Everything from DuplicateJobs::Client to DuplicateJobs::Server must yield
|
|
# no returning or job interception as it will leave the duplicate job redis key
|
|
# dangling and errorneously deduplicating future jobs until key expires.
|
|
::Gitlab::SidekiqMiddleware::DuplicateJobs::Client,
|
|
::Gitlab::SidekiqStatus::ClientMiddleware,
|
|
::Gitlab::SidekiqMiddleware::AdminMode::Client,
|
|
# Size limiter should be placed at the bottom, but before the metrics middleware
|
|
# NOTE: this raises error after the duplicate jobs middleware but is acceptable
|
|
# since jobs that are too large should not be enqueued.
|
|
::Gitlab::SidekiqMiddleware::SizeLimiter::Client,
|
|
::Gitlab::SidekiqMiddleware::ClientMetrics,
|
|
::Gitlab::SidekiqMiddleware::Identity::Passthrough
|
|
]
|
|
end
|
|
|
|
# The result of this method should be passed to
|
|
# Sidekiq's `config.client_middleware` method
|
|
# eg: `config.client_middleware(&Gitlab::SidekiqMiddleware::Client.configurator)`
|
|
def self.configurator
|
|
->(chain) do
|
|
middlewares.each { |middleware| chain.add(middleware) }
|
|
end
|
|
end
|
|
end
|
|
|
|
class Server
|
|
def self.middlewares(metrics: true, arguments_logger: true, skip_jobs: true)
|
|
[
|
|
# Size limiter should be placed at the top
|
|
::Gitlab::SidekiqMiddleware::SizeLimiter::Server,
|
|
::Gitlab::SidekiqMiddleware::ShardAwarenessValidator,
|
|
::Gitlab::SidekiqMiddleware::Monitor,
|
|
|
|
# Labkit wraps the job in the `Labkit::Context` resurrected from
|
|
# the job-hash. We need properties from the context for
|
|
# recording metrics, so this needs to be before
|
|
# `::Gitlab::SidekiqMiddleware::ServerMetrics` (if we're using
|
|
# that).
|
|
::Labkit::Middleware::Sidekiq::Server,
|
|
::Gitlab::SidekiqMiddleware::RequestStoreMiddleware,
|
|
|
|
::Gitlab::QueryLimiting.enabled_for_env? ? ::Gitlab::QueryLimiting::SidekiqMiddleware : nil,
|
|
|
|
metrics ? ::Gitlab::SidekiqMiddleware::ServerMetrics : nil,
|
|
|
|
arguments_logger ? ::Gitlab::SidekiqMiddleware::ArgumentsLogger : nil,
|
|
::Gitlab::SidekiqMiddleware::ExtraDoneLogMetadata,
|
|
::Gitlab::SidekiqMiddleware::BatchLoader,
|
|
::Gitlab::SidekiqMiddleware::InstrumentationLogger,
|
|
::Gitlab::SidekiqMiddleware::SetIpAddress,
|
|
::Gitlab::SidekiqMiddleware::AdminMode::Server,
|
|
::Gitlab::SidekiqMiddleware::QueryAnalyzer,
|
|
::Gitlab::SidekiqVersioning::Middleware,
|
|
::Gitlab::SidekiqStatus::ServerMiddleware,
|
|
::Gitlab::SidekiqMiddleware::WorkerContext::Server,
|
|
::ClickHouse::MigrationSupport::SidekiqMiddleware,
|
|
# DuplicateJobs::Server should be placed at the bottom, but before the SidekiqServerMiddleware,
|
|
# so we can compare the latest WAL location against replica
|
|
# NOTE: Everything from DuplicateJobs::Client to DuplicateJobs::Server must yield
|
|
# no returning or job interception as it will leave the duplicate job redis key
|
|
# dangling and errorneously deduplicating future jobs until key expires.
|
|
# Any middlewares after DuplicateJobs::Server can return/intercept jobs.
|
|
::Gitlab::SidekiqMiddleware::DuplicateJobs::Server,
|
|
::Gitlab::SidekiqMiddleware::PauseControl::Server,
|
|
::Gitlab::SidekiqMiddleware::Throttling::Server,
|
|
::Gitlab::SidekiqMiddleware::ConcurrencyLimit::Server,
|
|
skip_jobs ? ::Gitlab::SidekiqMiddleware::SkipJobs : nil,
|
|
::Gitlab::Database::LoadBalancing::SidekiqServerMiddleware,
|
|
::Gitlab::SidekiqMiddleware::ResourceUsageLimit::Server,
|
|
::Gitlab::SidekiqMiddleware::Identity::Restore
|
|
].compact
|
|
end
|
|
|
|
# The result of this method should be passed to
|
|
# Sidekiq's `config.server_middleware` method
|
|
# eg: `config.server_middleware(&Gitlab::SidekiqMiddleware::Server.configurator)`
|
|
def self.configurator(metrics: true, arguments_logger: true, skip_jobs: true)
|
|
->(chain) do
|
|
middlewares(metrics: metrics, arguments_logger: arguments_logger, skip_jobs: skip_jobs).each do |middleware|
|
|
chain.add(middleware)
|
|
end
|
|
::Gitlab::SidekiqMiddleware::ServerMetrics.initialize_process_metrics if metrics
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
Gitlab::SidekiqMiddleware::Client.prepend_mod
|
|
Gitlab::SidekiqMiddleware::Server.prepend_mod
|