gitlab-org--gitlab-foss/lib/gitlab/performance_bar/redis_adapter_when_peek_ena...

49 lines
1.6 KiB
Ruby

# frozen_string_literal: true
# Adapted from https://github.com/peek/peek/blob/master/lib/peek/adapters/redis.rb
module Gitlab
module PerformanceBar
module RedisAdapterWhenPeekEnabled
def save(request_id)
return unless ::Gitlab::PerformanceBar.enabled_for_request?
return if request_id.blank?
super
enqueue_stats_job(request_id)
end
# schedules a job which parses peek profile data and adds them
# to a structured log
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def enqueue_stats_job(request_id)
return unless Feature.enabled?(:performance_bar_stats, type: :ops)
@client.sadd(GitlabPerformanceBarStatsWorker::STATS_KEY, request_id)
return unless uuid = Gitlab::ExclusiveLease.new(
GitlabPerformanceBarStatsWorker::LEASE_KEY,
timeout: GitlabPerformanceBarStatsWorker::LEASE_TIMEOUT
).try_obtain
# stats key should be periodically processed and deleted by
# GitlabPerformanceBarStatsWorker but if it doesn't happen for
# some reason, we set expiration for the stats key to avoid
# keeping millions of request ids which would be already expired
# anyway
# rubocop:disable Gitlab/ModuleWithInstanceVariables
@client.expire(
GitlabPerformanceBarStatsWorker::STATS_KEY,
GitlabPerformanceBarStatsWorker::STATS_KEY_EXPIRE
)
GitlabPerformanceBarStatsWorker.perform_in(
GitlabPerformanceBarStatsWorker::WORKER_DELAY,
uuid
)
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
end
end
end