From ee6a54eafb9fa1e611ed598ce129d01c4aa4b4ea Mon Sep 17 00:00:00 2001 From: krisberry-ext Date: Mon, 6 Mar 2023 17:00:06 +0200 Subject: [PATCH 1/2] Extend redis hll metrics for github import Currently redis hll counts only started, failed and overall finished GitHub imports with metrics: 'redis_hll_counters.importer.github_import_project_start_monthly', 'redis_hll_counters.importer.github_import_project_success_monthly', 'redis_hll_counters.importer.github_import_project_failure_monthly' 'redis_hll_counters.importer.github_import_project_start_weekly', 'redis_hll_counters.importer.github_import_project_success_weekly', 'redis_hll_counters.importer.github_import_project_failure_weekly' Add additional metrics to count cancelled and partially completed: github_import_project_partially_completed_monthly github_import_project_cancelled_monthly github_import_project_partially_completed_weekly github_import_project_cancelled_weekly Details: https://gitlab.com/gitlab-org/gitlab/-/issues/381500 Changelog: other --- .../github/cancel_project_import_service.rb | 2 +- ...ithub_import_project_cancelled_monthly.yml | 26 ++++ ...rt_project_partially_completed_monthly.yml | 26 ++++ ...github_import_project_cancelled_weekly.yml | 26 ++++ ...ort_project_partially_completed_weekly.yml | 26 ++++ lib/gitlab/import/import_failure_service.rb | 7 +- lib/gitlab/import/metrics.rb | 29 +++-- .../known_events/importer_events.yml | 6 + .../import/import_failure_service_spec.rb | 1 - spec/lib/gitlab/import/metrics_spec.rb | 112 +++++++++++------- .../cancel_project_import_service_spec.rb | 2 +- 11 files changed, 204 insertions(+), 59 deletions(-) create mode 100644 config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml create mode 100644 config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml create mode 100644 config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml create mode 100644 config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml diff --git a/app/services/import/github/cancel_project_import_service.rb b/app/services/import/github/cancel_project_import_service.rb index 616ae54451fa99..62cd0c95eaf7fb 100644 --- a/app/services/import/github/cancel_project_import_service.rb +++ b/app/services/import/github/cancel_project_import_service.rb @@ -9,7 +9,7 @@ def execute if project.import_in_progress? project.import_state.cancel - metrics.track_import_state + metrics.track_canceled_import success(project: project) else diff --git a/config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml b/config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml new file mode 100644 index 00000000000000..f5a5638e6d8c04 --- /dev/null +++ b/config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml @@ -0,0 +1,26 @@ +--- +key_path: redis_hll_counters.importer.github_import_project_cancelled_monthly +description: The number of github projects that were cancelled monthly +product_section: dev +product_stage: manage +product_group: import +product_category: +value_type: number +status: active +milestone: "15.10" +introduced_by_url: +time_frame: 28d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - github_import_project_cancelled +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml b/config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml new file mode 100644 index 00000000000000..ac735aac0c915d --- /dev/null +++ b/config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml @@ -0,0 +1,26 @@ +--- +key_path: redis_hll_counters.importer.github_import_project_partially_completed_monthly +description: The number of github projects that were partially completed monthly +product_section: dev +product_stage: manage +product_group: import +product_category: +value_type: number +status: active +milestone: "15.10" +introduced_by_url: +time_frame: 28d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - github_import_project_partially_completed +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml b/config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml new file mode 100644 index 00000000000000..22109182100c27 --- /dev/null +++ b/config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml @@ -0,0 +1,26 @@ +--- +key_path: redis_hll_counters.importer.github_import_project_cancelled_weekly +description: The number of github projects that were cancelled weekly +product_section: dev +product_stage: manage +product_group: import +product_category: +value_type: number +status: active +milestone: "15.10" +introduced_by_url: +time_frame: 7d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - github_import_project_cancelled +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml b/config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml new file mode 100644 index 00000000000000..1f54842b529be2 --- /dev/null +++ b/config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml @@ -0,0 +1,26 @@ +--- +key_path: redis_hll_counters.importer.github_import_project_partially_completed_weekly +description: The number of github projects that were partially completed weekly +product_section: dev +product_stage: manage +product_group: import +product_category: +value_type: number +status: active +milestone: "15.10" +introduced_by_url: +time_frame: 7d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - github_import_project_partially_completed +performance_indicator_type: [] +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/lib/gitlab/import/import_failure_service.rb b/lib/gitlab/import/import_failure_service.rb index 2f6ffc4c844920..8e6022463007d9 100644 --- a/lib/gitlab/import/import_failure_service.rb +++ b/lib/gitlab/import/import_failure_service.rb @@ -89,13 +89,8 @@ def persist_failure ) end - def import_metrics - @import_metrics ||= Gitlab::Import::Metrics.new("#{project.import_type}_importer", project) - end - def track_metrics - import_metrics.track_failed_import - import_metrics.track_import_state + Gitlab::Import::Metrics.new("#{project.import_type}_importer", project).track_failed_import end end end diff --git a/lib/gitlab/import/metrics.rb b/lib/gitlab/import/metrics.rb index 82f8cf8dbc6662..36755b3e602b97 100644 --- a/lib/gitlab/import/metrics.rb +++ b/lib/gitlab/import/metrics.rb @@ -33,18 +33,14 @@ def track_failed_import return unless project.github_import? track_usage_event(:github_import_project_failure, project.id) + track_import_state end - def track_import_state + def track_canceled_import return unless project.github_import? - Gitlab::Tracking.event( - importer, - 'create', - label: 'github_import_project_state', - project: project, - extra: { import_type: 'github', state: project.beautified_import_status_name } - ) + track_usage_event(:github_import_project_cancelled, project.id) + track_import_state end def issues_counter @@ -88,7 +84,22 @@ def observe_histogram def track_finish_metric return unless project.github_import? - track_usage_event(:github_import_project_success, project.id) + case project.beautified_import_status_name + when 'partially completed' + track_usage_event(:github_import_project_partially_completed, project.id) + when 'completed' + track_usage_event(:github_import_project_success, project.id) + end + end + + def track_import_state + Gitlab::Tracking.event( + importer, + 'create', + label: 'github_import_project_state', + project: project, + extra: { import_type: 'github', state: project.beautified_import_status_name } + ) end end end diff --git a/lib/gitlab/usage_data_counters/known_events/importer_events.yml b/lib/gitlab/usage_data_counters/known_events/importer_events.yml index ece8cd6aa45da3..3050fff5d92aae 100644 --- a/lib/gitlab/usage_data_counters/known_events/importer_events.yml +++ b/lib/gitlab/usage_data_counters/known_events/importer_events.yml @@ -9,3 +9,9 @@ - name: github_import_project_failure redis_slot: import aggregation: weekly +- name: github_import_project_cancelled + redis_slot: import + aggregation: weekly +- name: github_import_project_partially_completed + redis_slot: import + aggregation: weekly diff --git a/spec/lib/gitlab/import/import_failure_service_spec.rb b/spec/lib/gitlab/import/import_failure_service_spec.rb index fc02c6bd4cae70..eb71b307b8d67d 100644 --- a/spec/lib/gitlab/import/import_failure_service_spec.rb +++ b/spec/lib/gitlab/import/import_failure_service_spec.rb @@ -141,7 +141,6 @@ .with("#{project.import_type}_importer", project) .and_return(metrics_double) expect(metrics_double).to receive(:track_failed_import) - expect(metrics_double).to receive(:track_import_state) service.execute end diff --git a/spec/lib/gitlab/import/metrics_spec.rb b/spec/lib/gitlab/import/metrics_spec.rb index f0140a975b12e7..1a988af0dbd51b 100644 --- a/spec/lib/gitlab/import/metrics_spec.rb +++ b/spec/lib/gitlab/import/metrics_spec.rb @@ -11,7 +11,6 @@ subject { described_class.new(importer, project) } before do - allow(Gitlab::Metrics).to receive(:counter) { counter } allow(counter).to receive(:increment) allow(histogram).to receive(:observe) end @@ -42,6 +41,13 @@ context 'when project is not a github import' do it 'does not emit importer metrics' do expect(subject).not_to receive(:track_usage_event) + expect_no_snowplow_event( + category: :test_importer, + action: 'create', + label: 'github_import_project_state', + project: project, + extra: { import_type: 'github', state: 'failed' } + ) subject.track_failed_import end @@ -50,22 +56,15 @@ context 'when project is a github import' do before do project.import_type = 'github' + allow(project).to receive(:import_status).and_return('failed') end it 'emits importer metrics' do expect(subject).to receive(:track_usage_event).with(:github_import_project_failure, project.id) subject.track_failed_import - end - end - end - - describe '#track_import_state' do - context 'when project is not a github import' do - it 'does not emit importer metrics' do - subject.track_import_state - expect_no_snowplow_event( + expect_snowplow_event( category: :test_importer, action: 'create', label: 'github_import_project_state', @@ -74,50 +73,64 @@ ) end end + end + describe '#track_finished_import' do context 'when project is a github import' do before do project.import_type = 'github' - allow(project).to receive(:import_status).and_return('failed') + allow(Gitlab::Metrics).to receive(:counter) { counter } + allow(Gitlab::Metrics).to receive(:histogram) { histogram } + allow(project).to receive(:beautified_import_status_name).and_return('completed') end it 'emits importer metrics' do - subject.track_import_state + expect(Gitlab::Metrics).to receive(:counter).with( + :test_importer_imported_projects_total, + 'The number of imported projects' + ) + + expect(Gitlab::Metrics).to receive(:histogram).with( + :test_importer_total_duration_seconds, + 'Total time spent importing projects, in seconds', + {}, + described_class::IMPORT_DURATION_BUCKETS + ) + + expect(counter).to receive(:increment) + + subject.track_finished_import expect_snowplow_event( category: :test_importer, action: 'create', label: 'github_import_project_state', project: project, - extra: { import_type: 'github', state: 'failed' } + extra: { import_type: 'github', state: 'completed' } ) - end - end - end - describe '#track_finished_import' do - before do - allow(Gitlab::Metrics).to receive(:histogram) { histogram } - end - - it 'emits importer metrics' do - expect(Gitlab::Metrics).to receive(:counter).with( - :test_importer_imported_projects_total, - 'The number of imported projects' - ) + expect(subject.duration).not_to be_nil + end - expect(Gitlab::Metrics).to receive(:histogram).with( - :test_importer_total_duration_seconds, - 'Total time spent importing projects, in seconds', - {}, - described_class::IMPORT_DURATION_BUCKETS - ) + context 'when import is partially completed' do + before do + allow(project).to receive(:beautified_import_status_name).and_return('partially completed') + end - expect(counter).to receive(:increment) + it 'emits snowplow metrics' do + expect(subject).to receive(:track_usage_event).with(:github_import_project_partially_completed, project.id) - subject.track_finished_import + subject.track_finished_import - expect(subject.duration).not_to be_nil + expect_snowplow_event( + category: :test_importer, + action: 'create', + label: 'github_import_project_state', + project: project, + extra: { import_type: 'github', state: 'partially completed' } + ) + end + end end context 'when project is not a github import' do @@ -126,7 +139,6 @@ subject.track_finished_import - expect(histogram).to have_received(:observe).with({ importer: :test_importer }, anything) expect_no_snowplow_event( category: :test_importer, action: 'create', @@ -136,23 +148,41 @@ ) end end + end + + describe '#track_cancelled_import' do + context 'when project is not a github import' do + it 'does not emit importer metrics' do + expect(subject).not_to receive(:track_usage_event) + expect_no_snowplow_event( + category: :test_importer, + action: 'create', + label: 'github_import_project_state', + project: project, + extra: { import_type: 'github', state: 'canceled' } + ) + + subject.track_canceled_import + end + end context 'when project is a github import' do before do project.import_type = 'github' - allow(project).to receive(:import_status).and_return('finished') - allow(project).to receive(:import_finished?).and_return(true) + allow(project).to receive(:import_status).and_return('canceled') end - it 'emits snowplow metrics' do - subject.track_finished_import + it 'emits importer metrics' do + expect(subject).to receive(:track_usage_event).with(:github_import_project_cancelled, project.id) + + subject.track_canceled_import expect_snowplow_event( category: :test_importer, action: 'create', label: 'github_import_project_state', project: project, - extra: { import_type: 'github', state: 'completed' } + extra: { import_type: 'github', state: 'canceled' } ) end end diff --git a/spec/services/import/github/cancel_project_import_service_spec.rb b/spec/services/import/github/cancel_project_import_service_spec.rb index 17d5e0fa44327f..d8ea303fa50e29 100644 --- a/spec/services/import/github/cancel_project_import_service_spec.rb +++ b/spec/services/import/github/cancel_project_import_service_spec.rb @@ -22,7 +22,7 @@ .to receive(:new) .with(:github_importer, project) .and_return(metrics_double) - expect(metrics_double).to receive(:track_import_state) + expect(metrics_double).to receive(:track_canceled_import) import_cancel.execute end -- GitLab From e8b6bc498e74afe4efc37614304f0e6ce433f46e Mon Sep 17 00:00:00 2001 From: krisberry-ext Date: Fri, 10 Mar 2023 12:48:08 +0200 Subject: [PATCH 2/2] Address review comments --- ...4018_github_import_project_cancelled_monthly.yml | 4 ++-- ...b_import_project_partially_completed_monthly.yml | 4 ++-- ...33608_github_import_project_cancelled_weekly.yml | 4 ++-- ...ub_import_project_partially_completed_weekly.yml | 4 ++-- lib/gitlab/import/metrics.rb | 13 +++++++------ 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml b/config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml index f5a5638e6d8c04..f398fa3c16fce5 100644 --- a/config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml +++ b/config/metrics/counts_28d/20230306134018_github_import_project_cancelled_monthly.yml @@ -4,11 +4,11 @@ description: The number of github projects that were cancelled monthly product_section: dev product_stage: manage product_group: import -product_category: +product_category: importers value_type: number status: active milestone: "15.10" -introduced_by_url: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113724 time_frame: 28d data_source: redis_hll data_category: optional diff --git a/config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml b/config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml index ac735aac0c915d..10344cffe5fc69 100644 --- a/config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml +++ b/config/metrics/counts_28d/20230306134609_github_import_project_partially_completed_monthly.yml @@ -4,11 +4,11 @@ description: The number of github projects that were partially completed monthly product_section: dev product_stage: manage product_group: import -product_category: +product_category: importers value_type: number status: active milestone: "15.10" -introduced_by_url: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113724 time_frame: 28d data_source: redis_hll data_category: optional diff --git a/config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml b/config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml index 22109182100c27..2d76d88e2e7d61 100644 --- a/config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml +++ b/config/metrics/counts_7d/20230306133608_github_import_project_cancelled_weekly.yml @@ -4,11 +4,11 @@ description: The number of github projects that were cancelled weekly product_section: dev product_stage: manage product_group: import -product_category: +product_category: importers value_type: number status: active milestone: "15.10" -introduced_by_url: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113724 time_frame: 7d data_source: redis_hll data_category: optional diff --git a/config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml b/config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml index 1f54842b529be2..9bc42eafd232c3 100644 --- a/config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml +++ b/config/metrics/counts_7d/20230306134308_github_import_project_partially_completed_weekly.yml @@ -4,11 +4,11 @@ description: The number of github projects that were partially completed weekly product_section: dev product_stage: manage product_group: import -product_category: +product_category: importers value_type: number status: active milestone: "15.10" -introduced_by_url: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113724 time_frame: 7d data_source: redis_hll data_category: optional diff --git a/lib/gitlab/import/metrics.rb b/lib/gitlab/import/metrics.rb index 36755b3e602b97..e457d9ec57c988 100644 --- a/lib/gitlab/import/metrics.rb +++ b/lib/gitlab/import/metrics.rb @@ -26,21 +26,20 @@ def track_finished_import observe_histogram projects_counter.increment track_finish_metric - track_import_state end def track_failed_import return unless project.github_import? track_usage_event(:github_import_project_failure, project.id) - track_import_state + track_import_state('github') end def track_canceled_import return unless project.github_import? track_usage_event(:github_import_project_cancelled, project.id) - track_import_state + track_import_state('github') end def issues_counter @@ -84,6 +83,8 @@ def observe_histogram def track_finish_metric return unless project.github_import? + track_import_state('github') + case project.beautified_import_status_name when 'partially completed' track_usage_event(:github_import_project_partially_completed, project.id) @@ -92,13 +93,13 @@ def track_finish_metric end end - def track_import_state + def track_import_state(type) Gitlab::Tracking.event( importer, 'create', - label: 'github_import_project_state', + label: "#{type}_import_project_state", project: project, - extra: { import_type: 'github', state: project.beautified_import_status_name } + extra: { import_type: type, state: project.beautified_import_status_name } ) end end -- GitLab