diff options
Diffstat (limited to 'spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb')
-rw-r--r-- | spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb | 235 |
1 files changed, 209 insertions, 26 deletions
diff --git a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb index da8098bfee1..5077c3532ef 100644 --- a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb +++ b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb @@ -62,15 +62,15 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s describe 'known_events' do let(:weekly_event) { 'g_analytics_contribution' } - let(:daily_event) { 'g_analytics_search' } + let(:daily_event) { 'g_analytics_issues' } let(:analytics_slot_event) { 'g_analytics_contribution' } let(:compliance_slot_event) { 'g_compliance_dashboard' } - let(:category_analytics_event) { 'g_analytics_search' } + let(:category_analytics_event) { 'g_analytics_issues' } let(:category_productivity_event) { 'g_analytics_productivity' } let(:no_slot) { 'no_slot' } let(:different_aggregation) { 'different_aggregation' } let(:custom_daily_event) { 'g_analytics_custom' } - + let(:event_overridden_for_user) { 'user_created_custom_dashboard' } let(:global_category) { 'global' } let(:compliance_category) { 'compliance' } let(:productivity_category) { 'productivity' } @@ -84,7 +84,8 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s { name: category_productivity_event }, { name: compliance_slot_event }, { name: no_slot }, - { name: different_aggregation } + { name: different_aggregation }, + { name: event_overridden_for_user } ].map(&:with_indifferent_access) end @@ -216,6 +217,97 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s end end end + + describe "property_name" do + before do + stub_feature_flags(redis_hll_property_name_tracking: property_name_flag_enabled) + end + + context "with enabled feature flag" do + let(:property_name_flag_enabled) { true } + + context "with a property_name for an overridden event" do + context "with a property_name sent as a symbol" do + it "tracks the events using the Redis key override" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(event_overridden_for_user, values: entity1, property_name: :user) + end + end + + context "with a property_name sent in string format" do + it "tracks the events using the Redis key override" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(event_overridden_for_user, values: entity1, property_name: 'user.id') + end + end + end + + context "with a property_name for an overridden event that doesn't include this property_name" do + it "tracks the events using a Redis key with the property_name" do + expected_key = "{hll_counters}_#{no_slot}-user-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(no_slot, values: entity1, property_name: 'user') + end + end + + context "with a property_name for a new event" do + it "tracks the events using a Redis key with the property_name" do + expected_key = "{hll_counters}_#{no_slot}-project-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(no_slot, values: entity1, property_name: 'project') + end + end + + context "with no property_name for an overridden event" do + it "tracks the events using a Redis key with no property_name" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(event_overridden_for_user, values: entity1) + end + end + + context "with no property_name for a new event" do + it "tracks the events using a Redis key with no property_name" do + expected_key = "{hll_counters}_#{no_slot}-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(no_slot, values: entity1) + end + end + end + + context "with disabled feature flag" do + let(:property_name_flag_enabled) { false } + + it "uses old Redis key for overridden events" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(event_overridden_for_user, values: entity1, property_name: 'user') + end + + it "uses old Redis key for new events" do + expected_key = "{hll_counters}_#{no_slot}-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(no_slot, values: entity1, property_name: 'project') + end + + it "uses old Redis key for new events when no property name sent" do + expected_key = "{hll_counters}_#{no_slot}-2020-23" + expect(Gitlab::Redis::HLL).to receive(:add).with(hash_including(key: expected_key)) + + described_class.track_event(no_slot, values: entity1) + end + end + end end describe '.unique_events' do @@ -227,7 +319,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s # Events last week described_class.track_event(weekly_event, values: entity1, time: 2.days.ago) described_class.track_event(weekly_event, values: entity1, time: 2.days.ago) - described_class.track_event(no_slot, values: entity1, time: 2.days.ago) + described_class.track_event(no_slot, values: entity1, property_name: 'user.id', time: 2.days.ago) # Events 2 weeks ago described_class.track_event(weekly_event, values: entity1, time: 2.weeks.ago) @@ -274,7 +366,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s end context 'when no slot is set' do - it { expect(described_class.unique_events(event_names: [no_slot], start_date: 7.days.ago, end_date: Date.current)).to eq(1) } + it { expect(described_class.unique_events(event_names: [no_slot], property_name: 'user.id', start_date: 7.days.ago, end_date: Date.current)).to eq(1) } end context 'when data crosses into new year' do @@ -283,6 +375,97 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s .not_to raise_error end end + + describe "property_names" do + before do + stub_feature_flags(redis_hll_property_name_tracking: property_name_flag_enabled) + end + + context "with enabled feature flag" do + let(:property_name_flag_enabled) { true } + + context "with a property_name for an overridden event" do + context "with a property_name sent as a symbol" do + it "tracks the events using the Redis key override" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [event_overridden_for_user], property_name: :user, start_date: 7.days.ago, end_date: Date.current) + end + end + + context "with a property_name sent in string format" do + it "tracks the events using the Redis key override" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [event_overridden_for_user], property_name: 'user.id', start_date: 7.days.ago, end_date: Date.current) + end + end + end + + context "with a property_name for an overridden event that doesn't include this property_name" do + it "tracks the events using a Redis key with the property_name" do + expected_key = "{hll_counters}_#{no_slot}-user-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [no_slot], property_name: 'user', start_date: 7.days.ago, end_date: Date.current) + end + end + + context "with a property_name for a new event" do + it "tracks the events using a Redis key with the property_name" do + expected_key = "{hll_counters}_#{no_slot}-project-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [no_slot], property_name: 'project', start_date: 7.days.ago, end_date: Date.current) + end + end + + context "with no property_name for a overridden event" do + it "tracks the events using a Redis key with no property_name" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [event_overridden_for_user], start_date: 7.days.ago, end_date: Date.current) + end + end + + context "with no property_name for a new event" do + it "tracks the events using a Redis key with no property_name" do + expected_key = "{hll_counters}_#{no_slot}-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [no_slot], start_date: 7.days.ago, end_date: Date.current) + end + end + end + + context "with disabled feature flag" do + let(:property_name_flag_enabled) { false } + + it "uses old Redis key for overridden events" do + expected_key = "{hll_counters}_#{event_overridden_for_user}-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [event_overridden_for_user], property_name: 'user', start_date: 7.days.ago, end_date: Date.current) + end + + it "uses old Redis key for new events" do + expected_key = "{hll_counters}_#{no_slot}-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [no_slot], property_name: 'project', start_date: 7.days.ago, end_date: Date.current) + end + + it "uses old Redis key for new events when no property name sent" do + expected_key = "{hll_counters}_#{no_slot}-2020-22" + expect(Gitlab::Redis::HLL).to receive(:count).with(keys: [expected_key]) + + described_class.unique_events(event_names: [no_slot], start_date: 7.days.ago, end_date: Date.current) + end + end + end end describe 'key overrides file' do @@ -341,43 +524,43 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s let(:time_range) { { start_date: 7.days.ago, end_date: DateTime.current } } let(:known_events) do [ - { name: 'event1_slot' }, - { name: 'event2_slot' }, - { name: 'event3_slot' }, - { name: 'event5_slot' }, - { name: 'event4' } + { name: 'g_compliance_dashboard' }, + { name: 'g_project_management_epic_created' }, + { name: 'g_project_management_epic_closed' }, + { name: 'g_project_management_epic_reopened' }, + { name: 'g_project_management_epic_issue_added' } ].map(&:with_indifferent_access) end before do allow(described_class).to receive(:known_events).and_return(known_events) - described_class.track_event('event1_slot', values: entity1, time: 2.days.ago) - described_class.track_event('event1_slot', values: entity2, time: 2.days.ago) - described_class.track_event('event1_slot', values: entity3, time: 2.days.ago) - described_class.track_event('event2_slot', values: entity1, time: 2.days.ago) - described_class.track_event('event2_slot', values: entity2, time: 3.days.ago) - described_class.track_event('event2_slot', values: entity3, time: 3.days.ago) - described_class.track_event('event3_slot', values: entity1, time: 3.days.ago) - described_class.track_event('event3_slot', values: entity2, time: 3.days.ago) - described_class.track_event('event5_slot', values: entity2, time: 3.days.ago) + described_class.track_event('g_compliance_dashboard', values: entity1, time: 2.days.ago) + described_class.track_event('g_compliance_dashboard', values: entity2, time: 2.days.ago) + described_class.track_event('g_compliance_dashboard', values: entity3, time: 2.days.ago) + described_class.track_event('g_project_management_epic_created', values: entity1, time: 2.days.ago) + described_class.track_event('g_project_management_epic_created', values: entity2, time: 3.days.ago) + described_class.track_event('g_project_management_epic_created', values: entity3, time: 3.days.ago) + described_class.track_event('g_project_management_epic_closed', values: entity1, time: 3.days.ago) + described_class.track_event('g_project_management_epic_closed', values: entity2, time: 3.days.ago) + described_class.track_event('g_project_management_epic_reopened', values: entity2, time: 3.days.ago) # events out of time scope - described_class.track_event('event2_slot', values: entity4, time: 8.days.ago) + described_class.track_event('g_project_management_epic_created', values: entity4, time: 8.days.ago) # events in different slots - described_class.track_event('event4', values: entity1, time: 2.days.ago) - described_class.track_event('event4', values: entity2, time: 2.days.ago) + described_class.track_event('g_project_management_epic_issue_added', values: entity1, time: 2.days.ago) + described_class.track_event('g_project_management_epic_issue_added', values: entity2, time: 2.days.ago) end it 'calculates union of given events', :aggregate_failures do - expect(described_class.calculate_events_union(**time_range.merge(event_names: %w[event4]))).to eq 2 - expect(described_class.calculate_events_union(**time_range.merge(event_names: %w[event1_slot event2_slot event3_slot]))).to eq 3 + expect(described_class.calculate_events_union(**time_range.merge(event_names: %w[g_project_management_epic_issue_added]))).to eq 2 + expect(described_class.calculate_events_union(**time_range.merge(event_names: %w[g_compliance_dashboard g_project_management_epic_created g_project_management_epic_closed]))).to eq 3 end it 'returns 0 if there are no keys for given events' do expect(Gitlab::Redis::HLL).not_to receive(:count) - expect(described_class.calculate_events_union(event_names: %w[event1_slot event2_slot event3_slot], start_date: Date.current, end_date: 4.weeks.ago)).to eq(-1) + expect(described_class.calculate_events_union(event_names: %w[g_compliance_dashboard g_project_management_epic_created g_project_management_epic_closed], start_date: Date.current, end_date: 4.weeks.ago)).to eq(-1) end end |