2020-12-09 15:10:12 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class GitlabPerformanceBarStatsWorker
|
|
|
|
include ApplicationWorker
|
|
|
|
|
2021-07-21 12:09:35 +00:00
|
|
|
data_consistency :always
|
2021-08-02 09:10:09 +00:00
|
|
|
worker_resource_boundary :cpu
|
2021-07-21 12:09:35 +00:00
|
|
|
|
2021-04-30 18:10:09 +00:00
|
|
|
sidekiq_options retry: 3
|
|
|
|
|
2020-12-09 15:10:12 +00:00
|
|
|
LEASE_KEY = 'gitlab:performance_bar_stats'
|
|
|
|
LEASE_TIMEOUT = 600
|
|
|
|
WORKER_DELAY = 120
|
|
|
|
STATS_KEY = 'performance_bar_stats:pending_request_ids'
|
2021-01-11 21:10:36 +00:00
|
|
|
STATS_KEY_EXPIRE = 30.minutes.to_i
|
2020-12-09 15:10:12 +00:00
|
|
|
|
|
|
|
feature_category :metrics
|
|
|
|
idempotent!
|
|
|
|
|
|
|
|
def perform(lease_uuid)
|
2022-11-09 18:07:50 +00:00
|
|
|
with_redis do |redis|
|
2020-12-09 15:10:12 +00:00
|
|
|
request_ids = fetch_request_ids(redis, lease_uuid)
|
|
|
|
stats = Gitlab::PerformanceBar::Stats.new(redis)
|
|
|
|
|
|
|
|
request_ids.each do |id|
|
|
|
|
stats.process(id)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2022-11-09 18:07:50 +00:00
|
|
|
def with_redis(&block)
|
|
|
|
Gitlab::Redis::Cache.with(&block) # rubocop:disable CodeReuse/ActiveRecord
|
|
|
|
end
|
|
|
|
|
2020-12-09 15:10:12 +00:00
|
|
|
def fetch_request_ids(redis, lease_uuid)
|
|
|
|
ids = redis.smembers(STATS_KEY)
|
|
|
|
redis.del(STATS_KEY)
|
|
|
|
Gitlab::ExclusiveLease.cancel(LEASE_KEY, lease_uuid)
|
|
|
|
|
|
|
|
ids
|
|
|
|
end
|
|
|
|
end
|