diff --git a/ee/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric.rb b/ee/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric.rb index 78d3442d1370ded38e9b485a74a491041772f0f1..9246f4bc8157278ec3464d2c592fd7d9a91e6a12 100644 --- a/ee/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric.rb +++ b/ee/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric.rb @@ -9,6 +9,11 @@ class CountDistinctReportTypesWithResolvedVulnerabilitiesPerProjectMetric < Data timestamp_column('vulnerability_state_transitions.created_at') + # Override sql so that it doesn't use the Vulnerabilities::Read table name + def to_sql + relation.select("COUNT(*)").to_sql + end + # We must override value since we are not able to batch this query due to usage of the count subquery def value relation.count diff --git a/ee/spec/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric_spec.rb b/ee/spec/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric_spec.rb index 6c0eb86a5e60a38e9e7816ac09ec68618927e02d..98ebb9eea5b5bba1c81989372339df25ccc1298d 100644 --- a/ee/spec/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric_spec.rb +++ b/ee/spec/lib/gitlab/usage/metrics/instrumentations/count_distinct_report_types_with_resolved_vulnerabilities_per_project_metric_spec.rb @@ -13,6 +13,16 @@ let_it_be(:project_with_two_resolutions) { create(:project, group: group_with_resolutions) } let_it_be(:project_with_one_resolution) { create(:project, group: child_group_with_resolutions) } let_it_be(:project_with_no_resolutions) { create(:project, group: group_without_resolutions) } + let(:expected_value) { 3 } + let(:expected_query) do + "SELECT COUNT(*) FROM (" \ + "SELECT DISTINCT \"vulnerability_reads\".\"project_id\", \"vulnerability_reads\".\"report_type\" FROM " \ + "\"vulnerability_reads\" INNER JOIN vulnerability_state_transitions\n " \ + "ON vulnerability_state_transitions.vulnerability_id = vulnerability_reads.vulnerability_id " \ + "WHERE \"vulnerability_state_transitions\".\"to_state\" = 3 AND " \ + "\"vulnerability_state_transitions\".\"created_at\" BETWEEN '#{start}' AND '#{finish}' " \ + "GROUP BY \"vulnerability_reads\".\"project_id\", \"vulnerability_reads\".\"report_type\") subquery" + end before do create(:vulnerability, :with_read, :resolved, :sast, @@ -31,16 +41,7 @@ project: project_with_no_resolutions) end - it_behaves_like 'a correct instrumented metric value and query', { time_frame: '28d', data_source: 'database' } do - let(:expected_value) { 3 } - let(:expected_query) do - "SELECT COUNT(\"vulnerability_reads\".\"vulnerability_id\") FROM (" \ - "SELECT DISTINCT \"vulnerability_reads\".\"project_id\", \"vulnerability_reads\".\"report_type\" FROM " \ - "\"vulnerability_reads\" INNER JOIN vulnerability_state_transitions\n " \ - "ON vulnerability_state_transitions.vulnerability_id = vulnerability_reads.vulnerability_id " \ - "WHERE \"vulnerability_state_transitions\".\"to_state\" = 3 AND " \ - "\"vulnerability_state_transitions\".\"created_at\" BETWEEN '#{start}' AND '#{finish}' " \ - "GROUP BY \"vulnerability_reads\".\"project_id\", \"vulnerability_reads\".\"report_type\") subquery" - end - end + it_behaves_like 'a correct instrumented database query execution value', + { time_frame: '28d', data_source: 'database' } + it_behaves_like 'a correct instrumented metric value and query', { time_frame: '28d', data_source: 'database' } end diff --git a/spec/support/shared_examples/metrics_instrumentation_shared_examples.rb b/spec/support/shared_examples/metrics_instrumentation_shared_examples.rb index 367924ab76833b87beed8a1d2586837f7dd46760..db7bbdb1d61b5205acc744e332f09c168e473674 100644 --- a/spec/support/shared_examples/metrics_instrumentation_shared_examples.rb +++ b/spec/support/shared_examples/metrics_instrumentation_shared_examples.rb @@ -41,6 +41,25 @@ end end +RSpec.shared_examples 'a correct instrumented database query execution value' do |params| + let(:time_frame) { params[:time_frame] } + let(:options) { params[:options] } + let(:metric) { described_class.new(time_frame: time_frame, options: options) } + + around do |example| + freeze_time { example.run } + end + + before do + allow(metric.relation).to receive(:transaction_open?).and_return(false) + end + + it 'returns correct value' do + query_result = metric.relation.connection.execute(metric.instrumentation).to_a.first.each_value.first + expect(query_result).to eq(expected_value) + end +end + RSpec.shared_examples 'a correct instrumented metric value and query' do |params| it_behaves_like 'a correct instrumented metric value', params it_behaves_like 'a correct instrumented metric query', params