mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-08-01 16:46:16 +00:00
99 lines
3.1 KiB
Ruby
99 lines
3.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# WARNING: This module has been deprecated and will be removed in the future
|
|
# Use InternalEvents.track_event instead https://docs.gitlab.com/ee/development/internal_analytics/internal_event_instrumentation/
|
|
|
|
module Gitlab
|
|
module UsageDataCounters
|
|
module RedisCounter
|
|
include Gitlab::Utils::StrongMemoize
|
|
|
|
# This file overrides (or aliases) some keys for legacy Redis metric counters to delay migrating them to new
|
|
# names for now, because doing that in bulk will be a lot easier.
|
|
KEY_OVERRIDES_PATH = Rails.root.join('lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml')
|
|
|
|
def increment(redis_counter_key, expiry: nil)
|
|
if batch_mode?
|
|
batch_key_count[redis_counter_key] += 1
|
|
batch_expires[redis_counter_key] = expiry
|
|
return
|
|
end
|
|
|
|
legacy_redis_counter_key = legacy_key(redis_counter_key)
|
|
|
|
Gitlab::Redis::SharedState.with do |redis|
|
|
redis.incr(legacy_redis_counter_key)
|
|
|
|
unless expiry.nil?
|
|
existing_expiry = redis.ttl(legacy_redis_counter_key) > 0
|
|
redis.expire(legacy_redis_counter_key, expiry) unless existing_expiry
|
|
end
|
|
end
|
|
end
|
|
|
|
def increment_by(redis_counter_key, incr, expiry: nil)
|
|
if batch_mode?
|
|
batch_key_count[redis_counter_key] += incr
|
|
batch_expires[redis_counter_key] = expiry
|
|
return
|
|
end
|
|
|
|
legacy_redis_counter_key = legacy_key(redis_counter_key)
|
|
|
|
Gitlab::Redis::SharedState.with do |redis|
|
|
redis.incrby(legacy_redis_counter_key, incr)
|
|
|
|
unless expiry.nil?
|
|
existing_expiry = redis.ttl(legacy_redis_counter_key) > 0
|
|
redis.expire(legacy_redis_counter_key, expiry) unless existing_expiry
|
|
end
|
|
end
|
|
end
|
|
|
|
def total_count(redis_counter_key)
|
|
legacy_redis_counter_key = legacy_key(redis_counter_key)
|
|
Gitlab::Redis::SharedState.with { |redis| redis.get(legacy_redis_counter_key).to_i }
|
|
end
|
|
|
|
def with_batched_redis_writes
|
|
Thread.current[:redis_counter_batch_mode] = true
|
|
yield
|
|
ensure
|
|
Thread.current[:redis_counter_batch_mode] = false
|
|
flush_redis_batch
|
|
Thread.current[:redis_counter_batch_key_count] = nil
|
|
Thread.current[:redis_counter_batch_expires] = nil
|
|
end
|
|
|
|
private
|
|
|
|
def flush_redis_batch
|
|
batch_key_count.each do |redis_counter_key, count|
|
|
increment_by(redis_counter_key, count, expiry: batch_expires[redis_counter_key])
|
|
end
|
|
end
|
|
|
|
def legacy_key(redis_key)
|
|
key_overrides.fetch(redis_key, redis_key)
|
|
end
|
|
|
|
def key_overrides
|
|
YAML.safe_load(File.read(KEY_OVERRIDES_PATH))
|
|
end
|
|
strong_memoize_attr :key_overrides
|
|
|
|
def batch_mode?
|
|
Thread.current[:redis_counter_batch_mode] == true
|
|
end
|
|
|
|
def batch_key_count
|
|
Thread.current[:redis_counter_batch_key_count] ||= Hash.new(0)
|
|
end
|
|
|
|
def batch_expires
|
|
Thread.current[:redis_counter_batch_expires] ||= {}
|
|
end
|
|
end
|
|
end
|
|
end
|