summaryrefslogtreecommitdiff
path: root/db/post_migrate/20230317004428_migrate_daily_redis_hll_events_to_weekly_aggregation.rb
blob: b4468c851aed7bc487315e64f0da8c7985939e26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# frozen_string_literal: true

class MigrateDailyRedisHllEventsToWeeklyAggregation < Gitlab::Database::Migration[2.1]
  disable_ddl_transaction!

  def up
    days_back = 29.days
    start_date = Date.today - days_back - 1.day
    end_date = Date.today + 1.day
    keys = {}

    Gitlab::UsageDataCounters::HLLRedisCounter.known_events.each do |event|
      next unless event[:aggregation].to_sym == :daily

      (start_date..end_date).each do |date|
        daily_key = redis_key(event, date, :daily)
        weekly_key = redis_key(event, date, :weekly)

        keys.key?(weekly_key) ? keys[weekly_key] << daily_key : keys[weekly_key] = [daily_key]
      end
    end

    keys.each do |weekly_key, daily_keys|
      Gitlab::Redis::SharedState.with do |redis|
        redis.pfmerge(weekly_key, *daily_keys)
        redis.expire(weekly_key, 6.weeks)
      end
    end
  end

  def down
    # no-op
  end

  # can't set daily key in HLLRedisCounter anymore, so need to duplicate logic here
  def redis_key(event, time, aggregation)
    key = "{hll_counters}_#{event[:name]}"
    if aggregation.to_sym == :daily
      year_day = time.strftime('%G-%j')
      "#{year_day}-#{key}"
    else
      year_week = time.strftime('%G-%V')
      "#{key}-#{year_week}"
    end
  end
end