diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb index 4a4d41f3e6fe735d1cb451a07d2c802fe6f1c3dc..474593cdacefad0210e562986dc877c2d02100cb 100644 --- a/app/controllers/ide_controller.rb +++ b/app/controllers/ide_controller.rb @@ -4,6 +4,7 @@ class IdeController < ApplicationController include WebIdeCSP include StaticObjectExternalStorageCSP include Gitlab::Utils::StrongMemoize + include ProductAnalyticsTracking before_action :authorize_read_project!, only: [:index] before_action :ensure_web_ide_oauth_application!, only: [:index] @@ -17,13 +18,10 @@ class IdeController < ApplicationController urgency :low - def index - Gitlab::UsageDataCounters::WebIdeCounter.increment_views_count + track_internal_event :index, name: 'web_ide_viewed' - if project - Gitlab::Tracking.event(self.class.to_s, 'web_ide_views', namespace: project.namespace, user: current_user) - @fork_info = fork_info(project, params[:branch]) - end + def index + @fork_info = fork_info(project, params[:branch]) render layout: helpers.use_new_web_ide? ? 'fullscreen' : 'application' end @@ -71,4 +69,12 @@ def project Project.find_by_full_path(params[:project_id]) end end + + def tracking_namespace_source + project.namespace + end + + def tracking_project_source + project + end end diff --git a/config/events/web_ide_viewed.yml b/config/events/web_ide_viewed.yml new file mode 100644 index 0000000000000000000000000000000000000000..6126d7788bf9846d0f3bb94ac34bc9defc6b01ca --- /dev/null +++ b/config/events/web_ide_viewed.yml @@ -0,0 +1,24 @@ +--- +description: Tracks when Web IDE is viewed +category: InternalEventTracking +action: web_ide_viewed +label_description: +property_description: +value_description: +extra_properties: +identifiers: +- project +- user +- namespace +product_section: dev +product_stage: create +product_group: ide +milestone: "16.10" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143495 +distributions: +- ce +- ee +tiers: +- free +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216180244_web_ide_views.yml b/config/metrics/counts_all/20210216180244_web_ide_views.yml index 84c1455f8ade635ed82cb8f7eb6cfe6dc2fd8409..bad4c3ad534c3a4f9598bb1b84dd4a553417be0d 100644 --- a/config/metrics/counts_all/20210216180244_web_ide_views.yml +++ b/config/metrics/counts_all/20210216180244_web_ide_views.yml @@ -8,12 +8,12 @@ product_group: ide value_type: number status: active time_frame: all -data_source: redis -instrumentation_class: RedisMetric +data_source: internal_events +events: + - name: web_ide_viewed options: - prefix: web_ide - event: views_count - include_usage_prefix: false + events: + - web_ide_viewed distribution: - ce - ee diff --git a/lib/gitlab/internal_events.rb b/lib/gitlab/internal_events.rb index c216f2583a6209d662447b0b866c67b153a46e2d..fc60d1b719e89133a26e5f2891e74f5f53f0a9af 100644 --- a/lib/gitlab/internal_events.rb +++ b/lib/gitlab/internal_events.rb @@ -11,6 +11,7 @@ module InternalEvents class << self include Gitlab::Tracking::Helpers include Gitlab::Utils::StrongMemoize + include Gitlab::UsageDataCounters::RedisCounter def track_event(event_name, category: nil, send_snowplow_event: true, **kwargs) raise UnknownEventError, "Unknown event: #{event_name}" unless EventDefinitions.known_event?(event_name) @@ -50,15 +51,15 @@ def validate_property!(kwargs, property_name, *class_names) end def increase_total_counter(event_name) - redis_counter_key = - Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name) - Gitlab::Redis::SharedState.with { |redis| redis.incr(redis_counter_key) } + redis_counter_key = Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name) + + increment(redis_counter_key) end def increase_weekly_total_counter(event_name) - redis_counter_key = - Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name, Date.today) - Gitlab::Redis::SharedState.with { |redis| redis.incr(redis_counter_key) } + redis_counter_key = Gitlab::Usage::Metrics::Instrumentations::TotalCountMetric.redis_key(event_name, Date.today) + + increment(redis_counter_key) end def update_unique_counters(event_name, kwargs) diff --git a/lib/gitlab/usage_data_counters/redis_counter.rb b/lib/gitlab/usage_data_counters/redis_counter.rb index 3f16681b6427cb87e1d6ac279a1221e9bbc3e8f7..5b28d7b579858eb4b992d450c772ad56cb830456 100644 --- a/lib/gitlab/usage_data_counters/redis_counter.rb +++ b/lib/gitlab/usage_data_counters/redis_counter.rb @@ -6,17 +6,37 @@ 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) - Gitlab::Redis::SharedState.with { |redis| redis.incr(redis_counter_key) } + legacy_redis_counter_key = legacy_key(redis_counter_key) + Gitlab::Redis::SharedState.with { |redis| redis.incr(legacy_redis_counter_key) } end def increment_by(redis_counter_key, incr) - Gitlab::Redis::SharedState.with { |redis| redis.incrby(redis_counter_key, incr) } + legacy_redis_counter_key = legacy_key(redis_counter_key) + Gitlab::Redis::SharedState.with { |redis| redis.incrby(legacy_redis_counter_key, incr) } end def total_count(redis_counter_key) - Gitlab::Redis::SharedState.with { |redis| redis.get(redis_counter_key).to_i } + legacy_redis_counter_key = legacy_key(redis_counter_key) + Gitlab::Redis::SharedState.with { |redis| redis.get(legacy_redis_counter_key).to_i } + end + + private + + 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 end end end diff --git a/lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml b/lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml new file mode 100644 index 0000000000000000000000000000000000000000..f882ee768bab6b89adb43b25f8402e15867e1a36 --- /dev/null +++ b/lib/gitlab/usage_data_counters/total_counter_redis_key_overrides.yml @@ -0,0 +1,10 @@ +# This file holds a list of Redis keys for Internal Events tracking total +# counters in the new format, mapped to the existing legacy keys, in order +# to keep the continuity of past data and not have to migrate the keys. +# +# Format: +# NEW_KEY_1: LEGACY_KEY_1 +# NEW_KEY_2: LEGACY_KEY_2 +# ... +# +'{event_counters}_web_ide_viewed': WEB_IDE_VIEWS_COUNT diff --git a/lib/gitlab/usage_data_counters/web_ide_counter.rb b/lib/gitlab/usage_data_counters/web_ide_counter.rb index 904729f114fab436bff848eeb580a99f6ea63117..5c5b58f3f38926cbaaec2f4c09a940aa0e8a1f2f 100644 --- a/lib/gitlab/usage_data_counters/web_ide_counter.rb +++ b/lib/gitlab/usage_data_counters/web_ide_counter.rb @@ -15,10 +15,6 @@ def increment_merge_requests_count count('merge_requests') end - def increment_views_count - count('views') - end - def increment_terminals_count count('terminals') end diff --git a/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb index 9cecaa01885937718f026d3a4adcaeade630eb3c..4a31191d75f6de0caaa83c5fed00bad2c2fe1624 100644 --- a/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb +++ b/spec/lib/gitlab/usage_data_counters/base_counter_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require 'fast_spec_helper' +require 'spec_helper' RSpec.describe Gitlab::UsageDataCounters::BaseCounter do describe '.fetch_supported_event' do diff --git a/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb index 39d48b7b938ad7f10f16aab0e5df050f5a30b587..d04f43bfb3ade5456630ac2e75ef3ceb0e98b4c4 100644 --- a/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb +++ b/spec/lib/gitlab/usage_data_counters/redis_counter_spec.rb @@ -13,6 +13,14 @@ subject.increment(redis_key) end.to change { subject.total_count(redis_key) }.by(1) end + + context 'with aliased legacy key' do + let(:redis_key) { '{event_counters}_web_ide_viewed' } + + it 'counter is increased for a legacy key' do + expect { subject.increment(redis_key) }.to change { subject.total_count('WEB_IDE_VIEWS_COUNT') }.by(1) + end + end end describe '.increment_by' do diff --git a/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb index d79fa66b9832ff7bf33ef530797d65b60458f511..5e04deb95c091814742e99ac38037719b1b57e40 100644 --- a/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb +++ b/spec/lib/gitlab/usage_data_counters/web_ide_counter_spec.rb @@ -22,10 +22,6 @@ it_behaves_like 'counter examples', 'merge_requests' end - describe 'views counter' do - it_behaves_like 'counter examples', 'views' - end - describe 'terminals counter' do it_behaves_like 'counter examples', 'terminals' end @@ -37,14 +33,12 @@ describe '.totals' do commits = 5 merge_requests = 3 - views = 2 terminals = 1 pipelines = 2 before do commits.times { described_class.increment_commits_count } merge_requests.times { described_class.increment_merge_requests_count } - views.times { described_class.increment_views_count } terminals.times { described_class.increment_terminals_count } pipelines.times { described_class.increment_pipelines_count } end @@ -52,7 +46,6 @@ it 'can report all totals' do expect(described_class.totals).to include( web_ide_commits: commits, - web_ide_views: views, web_ide_merge_requests: merge_requests, web_ide_terminals: terminals ) diff --git a/spec/lib/gitlab/usage_data_counters_spec.rb b/spec/lib/gitlab/usage_data_counters_spec.rb index 040b5deca540e5105e187be35aed7879fadc7ace..0696b375eb55c077115a19495b003d064cdb36c0 100644 --- a/spec/lib/gitlab/usage_data_counters_spec.rb +++ b/spec/lib/gitlab/usage_data_counters_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require 'fast_spec_helper' +require 'spec_helper' RSpec.describe Gitlab::UsageDataCounters do describe '.usage_data_counters' do diff --git a/spec/requests/ide_controller_spec.rb b/spec/requests/ide_controller_spec.rb index 20d890fadbf12a4f8d03373284ef5e65bd39c1c5..925484810e9c24906c9e71613558eacb1b8ffb27 100644 --- a/spec/requests/ide_controller_spec.rb +++ b/spec/requests/ide_controller_spec.rb @@ -30,7 +30,13 @@ shared_examples 'user access rights check' do context 'when user can read project' do it 'increases the views counter' do - expect(Gitlab::UsageDataCounters::WebIdeCounter).to receive(:increment_views_count) + expect(Gitlab::InternalEvents).to receive(:track_event) + .with( + 'web_ide_viewed', + user: user, + project: project, + namespace: project.namespace + ).once subject end @@ -141,19 +147,6 @@ end end - describe 'Snowplow view event', :snowplow do - it 'is tracked' do - subject - - expect_snowplow_event( - category: described_class.to_s, - action: 'web_ide_views', - namespace: project.namespace, - user: user - ) - end - end - describe 'legacy Web IDE' do before do stub_feature_flags(vscode_web_ide: false)