Add Duo Code Review metrics to the Duo analytics dashboard

What does this MR do and why?

Adds Duo Code Review requests and Duo Code Review comments to the Duo usage metrics table of the GitLab Duo and SDLC trends analytics dashboard.

References

Screenshots or screen recordings

Screenshot_2025-11-19_at_2.49.52_PM

Screenshot_2025-11-20_at_12.41.42_PM

Screenshot_2025-11-20_at_12.41.36_PM

How to set up and validate locally

Apply the following diff to mock permissions and metric values on the backend

Mock data diff
diff --git a/ee/app/graphql/resolvers/analytics/ai_metrics/code_review_metrics_resolver.rb b/ee/app/graphql/resolvers/analytics/ai_metrics/code_review_metrics_resolver.rb
index 54cfeabc32ec..624c6641eb13 100644
--- a/ee/app/graphql/resolvers/analytics/ai_metrics/code_review_metrics_resolver.rb
+++ b/ee/app/graphql/resolvers/analytics/ai_metrics/code_review_metrics_resolver.rb
@@ -9,15 +9,26 @@ class CodeReviewMetricsResolver < BaseResolver
         type ::Types::Analytics::AiMetrics::CodeReviewMetricsType, null: true
 
         def resolve_with_lookahead
-          usage = ::Analytics::AiAnalytics::UsageEventCountService.new(
-            current_user,
-            namespace: context[:ai_metrics_namespace],
-            from: context[:ai_metrics_params][:start_date],
-            to: context[:ai_metrics_params][:end_date],
-            fields: lookahead.selections.map(&:name)
-          ).execute
+          # usage = ::Analytics::AiAnalytics::UsageEventCountService.new(
+          #   current_user,
+          #   namespace: context[:ai_metrics_namespace],
+          #   from: context[:ai_metrics_params][:start_date],
+          #   to: context[:ai_metrics_params][:end_date],
+          #   fields: lookahead.selections.map(&:name)
+          # ).execute
 
-          usage.payload
+          # usage.payload
+          {
+            encounter_duo_code_review_error_during_review_event_count: rand(0..20),
+            find_no_issues_duo_code_review_after_review_event_count: rand(5..50),
+            find_nothing_to_review_duo_code_review_on_mr_event_count: rand(3..30),
+            post_comment_duo_code_review_on_diff_event_count: rand(10..100),
+            react_thumbs_up_on_duo_code_review_comment_event_count: rand(15..80),
+            react_thumbs_down_on_duo_code_review_comment_event_count: rand(2..25),
+            request_review_duo_code_review_on_mr_by_author_event_count: rand(20..120),
+            request_review_duo_code_review_on_mr_by_non_author_event_count: rand(10..60),
+            excluded_files_from_duo_code_review_event_count: rand(5..40)
+          }
         end
       end
     end
diff --git a/ee/app/graphql/resolvers/analytics/ai_metrics/namespace_metrics_resolver.rb b/ee/app/graphql/resolvers/analytics/ai_metrics/namespace_metrics_resolver.rb
index 3aa7edf35f6d..ef66b387c25b 100644
--- a/ee/app/graphql/resolvers/analytics/ai_metrics/namespace_metrics_resolver.rb
+++ b/ee/app/graphql/resolvers/analytics/ai_metrics/namespace_metrics_resolver.rb
@@ -10,7 +10,6 @@ class NamespaceMetricsResolver < BaseResolver
         type ::Types::Analytics::AiMetrics::NamespaceMetricsType, null: true
 
         authorizes_object!
-        authorize :read_pro_ai_analytics
 
         argument :start_date, Types::DateType,
           required: false,
diff --git a/ee/app/models/ee/user.rb b/ee/app/models/ee/user.rb
index 3da50eae35c4..e55e8e2a5d1f 100644
--- a/ee/app/models/ee/user.rb
+++ b/ee/app/models/ee/user.rb
@@ -538,6 +538,7 @@ def using_gitlab_com_seat?(namespace)
     end
 
     def assigned_to_duo_enterprise?(container)
+      return true
       namespace = ::Gitlab::Saas.feature_available?(:gitlab_duo_saas_only) ? container.root_ancestor : nil
 
       GitlabSubscriptions::AddOnPurchase

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Related to #573979 (closed)

Edited by Alex Pennells

Merge request reports

Loading