From be32f492e66e1e99160178ff7f1b21a1aaa1ebd8 Mon Sep 17 00:00:00 2001
From: Daniele Rossetti <drossetti@gitlab.com>
Date: Tue, 16 Jul 2024 16:03:52 +0000
Subject: [PATCH] Add new observability feature and policy

Changelog: changed
---
 .../operations/_observability.html.haml       |   2 +-
 .../development/observability_metrics.yml     |   8 -
 .../wip/observability_features.yml            |   8 +
 .../feature_flags/wip/observability_logs.yml  |   8 -
 .../controllers/projects/logs_controller.rb   |   2 +-
 .../projects/metrics_controller.rb            |   2 +-
 .../projects/tracing_controller.rb            |   2 +-
 .../models/gitlab_subscriptions/features.rb   |   4 +-
 ee/app/policies/ee/project_policy.rb          |  44 +--
 .../tabs_content/_observability.html.haml     |   2 +-
 .../sidebars/projects/menus/monitor_menu.rb   |   6 +-
 .../projects/menus/monitor_menu_spec.rb       |  19 +-
 ee/spec/policies/project_policy_spec.rb       | 254 ++----------------
 .../requests/projects/logs_controller_spec.rb |   9 +-
 .../projects/metrics_controller_spec.rb       |   9 +-
 .../projects/tracing_controller_spec.rb       |   9 +-
 lib/gitlab/observability.rb                   |   3 +-
 spec/lib/gitlab/auth_spec.rb                  |   2 +-
 spec/lib/gitlab/observability_spec.rb         |   2 +-
 19 files changed, 72 insertions(+), 323 deletions(-)
 delete mode 100644 config/feature_flags/development/observability_metrics.yml
 create mode 100644 config/feature_flags/wip/observability_features.yml
 delete mode 100644 config/feature_flags/wip/observability_logs.yml

diff --git a/app/views/projects/settings/operations/_observability.html.haml b/app/views/projects/settings/operations/_observability.html.haml
index 482a0703b8de..5c88b0521764 100644
--- a/app/views/projects/settings/operations/_observability.html.haml
+++ b/app/views/projects/settings/operations/_observability.html.haml
@@ -1,3 +1,3 @@
-- return unless can?(current_user, :read_tracing, @project) || can?(current_user, :read_observability_metrics, @project) || can?(current_user, :read_observability_logs, @project)
+- return unless can?(current_user, :read_observability, @project)
 
 .js-observability-settings
diff --git a/config/feature_flags/development/observability_metrics.yml b/config/feature_flags/development/observability_metrics.yml
deleted file mode 100644
index c8bb1d3c2e28..000000000000
--- a/config/feature_flags/development/observability_metrics.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: observability_metrics
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/134393
-rollout_issue_url: https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2444
-milestone: '16.6'
-type: development
-group: group::observability
-default_enabled: false
diff --git a/config/feature_flags/wip/observability_features.yml b/config/feature_flags/wip/observability_features.yml
new file mode 100644
index 000000000000..d878d66174bb
--- /dev/null
+++ b/config/feature_flags/wip/observability_features.yml
@@ -0,0 +1,8 @@
+---
+name: observability_features
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/158786
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/472815
+milestone: '17.3'
+type: wip
+group: group::observability
+default_enabled: false
\ No newline at end of file
diff --git a/config/feature_flags/wip/observability_logs.yml b/config/feature_flags/wip/observability_logs.yml
deleted file mode 100644
index 8b262d268b37..000000000000
--- a/config/feature_flags/wip/observability_logs.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: observability_logs
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/142989
-rollout_issue_url: https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2643
-milestone: '16.9'
-type: wip
-group: group::observability
-default_enabled: false
diff --git a/ee/app/controllers/projects/logs_controller.rb b/ee/app/controllers/projects/logs_controller.rb
index 5370bf695c77..d1833325e3a3 100644
--- a/ee/app/controllers/projects/logs_controller.rb
+++ b/ee/app/controllers/projects/logs_controller.rb
@@ -6,7 +6,7 @@ class LogsController < Projects::ApplicationController
 
     feature_category :metrics
 
-    before_action :authorize_read_observability_logs!
+    before_action :authorize_read_observability!
 
     def index; end
   end
diff --git a/ee/app/controllers/projects/metrics_controller.rb b/ee/app/controllers/projects/metrics_controller.rb
index f7dcb6097547..84a93adcabc2 100644
--- a/ee/app/controllers/projects/metrics_controller.rb
+++ b/ee/app/controllers/projects/metrics_controller.rb
@@ -6,7 +6,7 @@ class MetricsController < Projects::ApplicationController
 
     feature_category :metrics
 
-    before_action :authorize_read_observability_metrics!
+    before_action :authorize_read_observability!
 
     def index; end
 
diff --git a/ee/app/controllers/projects/tracing_controller.rb b/ee/app/controllers/projects/tracing_controller.rb
index cf82c4409530..838174ac4d9b 100644
--- a/ee/app/controllers/projects/tracing_controller.rb
+++ b/ee/app/controllers/projects/tracing_controller.rb
@@ -6,7 +6,7 @@ class TracingController < Projects::ApplicationController
 
     feature_category :tracing
 
-    before_action :authorize_read_tracing!
+    before_action :authorize_read_observability!
 
     def index; end
 
diff --git a/ee/app/models/gitlab_subscriptions/features.rb b/ee/app/models/gitlab_subscriptions/features.rb
index 627857413829..a1a169c44c95 100644
--- a/ee/app/models/gitlab_subscriptions/features.rb
+++ b/ee/app/models/gitlab_subscriptions/features.rb
@@ -134,8 +134,6 @@ class Features
       admin_merge_request_approvers_rules
       merge_trains
       metrics_reports
-      metrics_observability
-      logs_observability
       multiple_alert_http_integrations
       multiple_approval_rules
       multiple_group_issue_boards
@@ -262,7 +260,7 @@ class Features
       status_page
       suggested_reviewers
       subepics
-      tracing
+      observability
       unique_project_download_limit
       vulnerability_finding_signatures
       container_scanning_for_registry
diff --git a/ee/app/policies/ee/project_policy.rb b/ee/app/policies/ee/project_policy.rb
index 10a6c36a1fec..12946c191f3a 100644
--- a/ee/app/policies/ee/project_policy.rb
+++ b/ee/app/policies/ee/project_policy.rb
@@ -253,22 +253,10 @@ module ProjectPolicy
         project.project_feature&.private?(:merge_requests)
       end
 
-      condition(:tracing_enabled) do
-        # Can be enabled for all projects in root namespace. Maintains backward
-        # compatibility by falling back to checking against project
-        (::Feature.enabled?(:observability_tracing,
-          @subject.root_namespace) || ::Feature.enabled?(:observability_tracing, @subject)) &&
-          @subject.licensed_feature_available?(:tracing)
-      end
-
-      condition(:observability_metrics_enabled) do
-        ::Feature.enabled?(:observability_metrics, @subject.root_namespace) &&
-          @subject.licensed_feature_available?(:metrics_observability)
-      end
-
-      condition(:observability_logs_enabled) do
-        ::Feature.enabled?(:observability_logs, @subject.root_namespace, type: :wip) &&
-          @subject.licensed_feature_available?(:logs_observability)
+      condition(:observability_enabled) do
+        # temporarily checking :observability_tracing for backward compability until all existing users have the new FF enabled
+        (::Feature.enabled?(:observability_tracing, @subject.root_namespace) || ::Feature.enabled?(:observability_features, @subject.root_namespace)) &&
+          @subject.licensed_feature_available?(:observability)
       end
 
       # We are overriding the already defined condition in CE version
@@ -840,28 +828,8 @@ module ProjectPolicy
         (maintainer | owner | admin) & pages_multiple_versions_available
       end.enable :pages_multiple_versions
 
-      rule { can?(:reporter_access) & tracing_enabled }.policy do
-        enable :read_tracing
-      end
-
-      rule { can?(:developer_access) & tracing_enabled }.policy do
-        enable :write_tracing
-      end
-
-      rule { can?(:reporter_access) & observability_metrics_enabled }.policy do
-        enable :read_observability_metrics
-      end
-
-      rule { can?(:developer_access) & observability_metrics_enabled }.policy do
-        enable :write_observability_metrics
-      end
-
-      rule { can?(:reporter_access) & observability_logs_enabled }.policy do
-        enable :read_observability_logs
-      end
-
-      rule { can?(:developer_access) & observability_logs_enabled }.policy do
-        enable :write_observability_logs
+      rule { can?(:reporter_access) & observability_enabled }.policy do
+        enable :read_observability
       end
 
       rule { ci_cancellation_maintainers_only & ~can?(:maintainer_access) }.policy do
diff --git a/ee/app/views/shared/usage_quotas/tabs_content/_observability.html.haml b/ee/app/views/shared/usage_quotas/tabs_content/_observability.html.haml
index c52ed546056d..19ae09df377d 100644
--- a/ee/app/views/shared/usage_quotas/tabs_content/_observability.html.haml
+++ b/ee/app/views/shared/usage_quotas/tabs_content/_observability.html.haml
@@ -1,3 +1,3 @@
-- return unless can?(current_user, :read_tracing, @project) || can?(current_user, :read_observability_metrics, @project) || can?(current_user, :read_observability_logs, @project)
+- return unless can?(current_user, :read_observability, @project)
 
 #js-observability-usage-quota-app{ data: { view_model: observability_usage_quota_view_model(@project) } }
diff --git a/ee/lib/ee/sidebars/projects/menus/monitor_menu.rb b/ee/lib/ee/sidebars/projects/menus/monitor_menu.rb
index 686f8339829b..a8751affc5da 100644
--- a/ee/lib/ee/sidebars/projects/menus/monitor_menu.rb
+++ b/ee/lib/ee/sidebars/projects/menus/monitor_menu.rb
@@ -51,7 +51,7 @@ def escalation_policies_menu_item
           end
 
           def tracing_menu_item
-            unless can?(context.current_user, :read_tracing, context.project)
+            unless can?(context.current_user, :read_observability, context.project)
               return ::Sidebars::NilMenuItem.new(item_id: :tracing)
             end
 
@@ -65,7 +65,7 @@ def tracing_menu_item
           end
 
           def metrics_menu_item
-            unless can?(context.current_user, :read_observability_metrics, context.project)
+            unless can?(context.current_user, :read_observability, context.project)
               return ::Sidebars::NilMenuItem.new(item_id: :metrics)
             end
 
@@ -79,7 +79,7 @@ def metrics_menu_item
           end
 
           def logs_menu_item
-            unless can?(context.current_user, :read_observability_logs, context.project)
+            unless can?(context.current_user, :read_observability, context.project)
               return ::Sidebars::NilMenuItem.new(item_id: :logs)
             end
 
diff --git a/ee/spec/lib/ee/sidebars/projects/menus/monitor_menu_spec.rb b/ee/spec/lib/ee/sidebars/projects/menus/monitor_menu_spec.rb
index af8000c6dd41..c5396e1988bd 100644
--- a/ee/spec/lib/ee/sidebars/projects/menus/monitor_menu_spec.rb
+++ b/ee/spec/lib/ee/sidebars/projects/menus/monitor_menu_spec.rb
@@ -48,7 +48,7 @@
       let(:role) { :reporter }
 
       before do
-        stub_licensed_features(tracing: true)
+        stub_licensed_features(observability: true)
         stub_member_access_level(project, role => user)
       end
 
@@ -56,6 +56,7 @@
 
       describe 'when feature flag is disabled' do
         before do
+          stub_feature_flags(observability_features: false)
           stub_feature_flags(observability_tracing: false)
         end
 
@@ -64,7 +65,7 @@
 
       describe 'when unlicensed' do
         before do
-          stub_licensed_features(tracing: false)
+          stub_licensed_features(observability: false)
         end
 
         it { is_expected.to be_nil }
@@ -83,7 +84,7 @@
       let(:role) { :reporter }
 
       before do
-        stub_licensed_features(metrics_observability: true)
+        stub_licensed_features(observability: true)
         stub_member_access_level(project, role => user)
       end
 
@@ -91,7 +92,8 @@
 
       describe 'when feature flag is disabled' do
         before do
-          stub_feature_flags(observability_metrics: false)
+          stub_feature_flags(observability_features: false)
+          stub_feature_flags(observability_tracing: false)
         end
 
         it { is_expected.to be_nil }
@@ -99,7 +101,7 @@
 
       describe 'when unlicensed' do
         before do
-          stub_licensed_features(metrics_observability: false)
+          stub_licensed_features(observability: false)
         end
 
         it { is_expected.to be_nil }
@@ -118,7 +120,7 @@
       let(:role) { :reporter }
 
       before do
-        stub_licensed_features(logs_observability: true)
+        stub_licensed_features(observability: true)
         stub_member_access_level(project, role => user)
       end
 
@@ -126,7 +128,8 @@
 
       describe 'when feature flag is disabled' do
         before do
-          stub_feature_flags(observability_logs: false)
+          stub_feature_flags(observability_features: false)
+          stub_feature_flags(observability_tracing: false)
         end
 
         it { is_expected.to be_nil }
@@ -134,7 +137,7 @@
 
       describe 'when unlicensed' do
         before do
-          stub_licensed_features(logs_observability: false)
+          stub_licensed_features(observability: false)
         end
 
         it { is_expected.to be_nil }
diff --git a/ee/spec/policies/project_policy_spec.rb b/ee/spec/policies/project_policy_spec.rb
index 34bbba7bb2dc..1c3d16433105 100644
--- a/ee/spec/policies/project_policy_spec.rb
+++ b/ee/spec/policies/project_policy_spec.rb
@@ -3367,107 +3367,65 @@ def create_member_role(member, abilities = member_role_abilities)
     end
   end
 
-  describe 'read_tracing policy' do
+  describe 'read_observability policy' do
     let(:current_user) { reporter }
 
     before do
-      stub_licensed_features(tracing: true)
+      stub_licensed_features(observability: true)
     end
 
-    describe 'when feature flag is disabled' do
+    describe 'when observability and observability_tracing feature flags are disabled' do
       before do
+        stub_feature_flags(observability_features: false)
         stub_feature_flags(observability_tracing: false)
       end
 
-      it { is_expected.to be_disallowed(:read_tracing) }
+      it { is_expected.to be_disallowed(:read_observability) }
     end
 
-    describe 'when feature flag is enabled for project' do
+    describe 'when observability feature flag is enabled for root namespace' do
       before do
-        stub_feature_flags(observability_tracing: false)
-        stub_feature_flags(observability_tracing: project)
+        stub_feature_flags(observability_features: project.root_namespace)
       end
 
-      it { is_expected.to be_allowed(:read_tracing) }
+      it { is_expected.to be_allowed(:read_observability) }
     end
 
-    describe 'when feature flag is enabled for root namespace' do
+    describe 'when observability_tracing feature flag is enabled for root namespace' do
       before do
-        stub_feature_flags(observability_tracing: false)
         stub_feature_flags(observability_tracing: project.root_namespace)
       end
 
-      it { is_expected.to be_allowed(:read_tracing) }
+      it { is_expected.to be_allowed(:read_observability) }
     end
 
     describe 'when the project does not have the correct license' do
       before do
-        stub_licensed_features(tracing: false)
+        stub_feature_flags(observability_features: true)
+        stub_licensed_features(observability: false)
       end
 
-      it { is_expected.to be_disallowed(:read_tracing) }
+      it { is_expected.to be_disallowed(:read_observability) }
     end
 
     describe 'when the user does not have permission' do
       let(:current_user) { guest }
 
-      it { is_expected.to be_disallowed(:read_tracing) }
-    end
-
-    describe 'when the user has permission' do
-      it { is_expected.to be_allowed(:read_tracing) }
-    end
-  end
-
-  describe 'write_tracing policy' do
-    let(:current_user) { developer }
-
-    before do
-      stub_licensed_features(tracing: true)
-    end
-
-    describe 'when feature flag is disabled' do
-      before do
-        stub_feature_flags(observability_tracing: false)
-      end
-
-      it { is_expected.to be_disallowed(:write_tracing) }
-    end
-
-    describe 'when feature flag is enabled for project' do
-      before do
-        stub_feature_flags(observability_tracing: false)
-        stub_feature_flags(observability_tracing: project)
-      end
-
-      it { is_expected.to be_allowed(:write_tracing) }
-    end
-
-    describe 'when feature flag is enabled for root namespace' do
       before do
-        stub_feature_flags(observability_tracing: false)
-        stub_feature_flags(observability_tracing: project.root_namespace)
+        stub_feature_flags(observability_features: true)
+        stub_licensed_features(observability: true)
       end
 
-      it { is_expected.to be_allowed(:write_tracing) }
+      it { is_expected.to be_disallowed(:read_observability) }
     end
 
-    describe 'when the project does not have the correct license' do
+    describe 'when the user has permission' do
       before do
-        stub_licensed_features(tracing: false)
+        stub_feature_flags(observability_features: true)
+        stub_licensed_features(observability: true)
       end
 
-      it { is_expected.to be_disallowed(:write_tracing) }
-    end
-
-    describe 'when the user does not have permission' do
-      let(:current_user) { reporter }
-
-      it { is_expected.to be_disallowed(:write_tracing) }
-    end
-
-    describe 'when the user has permission' do
-      it { is_expected.to be_allowed(:write_tracing) }
+      it { is_expected.to be_allowed(:read_observability) }
     end
   end
 
@@ -3507,178 +3465,6 @@ def create_member_role(member, abilities = member_role_abilities)
     end
   end
 
-  describe 'read_observability_metrics policy' do
-    let(:current_user) { reporter }
-
-    before do
-      stub_licensed_features(metrics_observability: true)
-    end
-
-    describe 'when feature flag is disabled' do
-      before do
-        stub_feature_flags(observability_metrics: false)
-      end
-
-      it { is_expected.to be_disallowed(:read_observability_metrics) }
-    end
-
-    describe 'when feature flag is enabled for root namespace' do
-      before do
-        stub_feature_flags(observability_metrics: false)
-        stub_feature_flags(observability_metrics: project.root_namespace)
-      end
-
-      it { is_expected.to be_allowed(:read_observability_metrics) }
-    end
-
-    describe 'when the project does not have the correct license' do
-      before do
-        stub_licensed_features(metrics_observability: false)
-      end
-
-      it { is_expected.to be_disallowed(:read_observability_metrics) }
-    end
-
-    describe 'when the user does not have permission' do
-      let(:current_user) { guest }
-
-      it { is_expected.to be_disallowed(:read_observability_metrics) }
-    end
-
-    describe 'when the user has permission' do
-      it { is_expected.to be_allowed(:read_observability_metrics) }
-    end
-  end
-
-  describe 'write_observability_metrics policy' do
-    let(:current_user) { developer }
-
-    before do
-      stub_licensed_features(metrics_observability: true)
-    end
-
-    describe 'when feature flag is disabled' do
-      before do
-        stub_feature_flags(observability_metrics: false)
-      end
-
-      it { is_expected.to be_disallowed(:write_observability_metrics) }
-    end
-
-    describe 'when feature flag is enabled for root namespace' do
-      before do
-        stub_feature_flags(observability_metrics: false)
-        stub_feature_flags(observability_metrics: project.root_namespace)
-      end
-
-      it { is_expected.to be_allowed(:write_observability_metrics) }
-    end
-
-    describe 'when the project does not have the correct license' do
-      before do
-        stub_licensed_features(metrics_observability: false)
-      end
-
-      it { is_expected.to be_disallowed(:write_observability_metrics) }
-    end
-
-    describe 'when the user does not have permission' do
-      let(:current_user) { reporter }
-
-      it { is_expected.to be_disallowed(:write_observability_metrics) }
-    end
-
-    describe 'when the user has permission' do
-      it { is_expected.to be_allowed(:write_observability_metrics) }
-    end
-  end
-
-  describe 'read_observability_logs policy' do
-    let(:current_user) { reporter }
-
-    before do
-      stub_licensed_features(logs_observability: true)
-    end
-
-    describe 'when feature flag is disabled' do
-      before do
-        stub_feature_flags(observability_logs: false)
-      end
-
-      it { is_expected.to be_disallowed(:read_observability_logs) }
-    end
-
-    describe 'when feature flag is enabled for root namespace' do
-      before do
-        stub_feature_flags(observability_logs: false)
-        stub_feature_flags(observability_logs: project.root_namespace)
-      end
-
-      it { is_expected.to be_allowed(:read_observability_logs) }
-    end
-
-    describe 'when the project does not have the correct license' do
-      before do
-        stub_licensed_features(logs_observability: false)
-      end
-
-      it { is_expected.to be_disallowed(:read_observability_logs) }
-    end
-
-    describe 'when the user does not have permission' do
-      let(:current_user) { guest }
-
-      it { is_expected.to be_disallowed(:read_observability_logs) }
-    end
-
-    describe 'when the user has permission' do
-      it { is_expected.to be_allowed(:read_observability_logs) }
-    end
-  end
-
-  describe 'write_observability_logs policy' do
-    let(:current_user) { developer }
-
-    before do
-      stub_licensed_features(logs_observability: true)
-    end
-
-    describe 'when feature flag is disabled' do
-      before do
-        stub_feature_flags(observability_logs: false)
-      end
-
-      it { is_expected.to be_disallowed(:write_observability_logs) }
-    end
-
-    describe 'when feature flag is enabled for root namespace' do
-      before do
-        stub_feature_flags(observability_logs: false)
-        stub_feature_flags(observability_logs: project.root_namespace)
-      end
-
-      it { is_expected.to be_allowed(:write_observability_logs) }
-    end
-
-    describe 'when the project does not have the correct license' do
-      before do
-        stub_licensed_features(logs_observability: false)
-      end
-
-      it { is_expected.to be_disallowed(:write_observability_logs) }
-    end
-
-    describe 'when the user does not have permission' do
-      let(:current_user) { reporter }
-
-      it { is_expected.to be_disallowed(:write_observability_logs) }
-    end
-
-    describe 'when the user has permission' do
-      it { is_expected.to be_allowed(:write_observability_logs) }
-    end
-  end
-
   describe 'generate_cube_query policy' do
     let(:current_user) { owner }
 
diff --git a/ee/spec/requests/projects/logs_controller_spec.rb b/ee/spec/requests/projects/logs_controller_spec.rb
index db845b560c76..452a3c7ec1d1 100644
--- a/ee/spec/requests/projects/logs_controller_spec.rb
+++ b/ee/spec/requests/projects/logs_controller_spec.rb
@@ -7,7 +7,7 @@
   let_it_be(:project) { create(:project, group: group) }
   let_it_be(:user) { create(:user) }
   let(:path) { nil }
-  let(:observability_logs_ff) { true }
+  let(:observability_ff) { true }
   let(:expected_api_config) do
     {
       oauthUrl: Gitlab::Observability.oauth_url,
@@ -31,8 +31,9 @@
   end
 
   before do
-    stub_licensed_features(logs_observability: true)
-    stub_feature_flags(observability_logs: observability_logs_ff)
+    stub_licensed_features(observability: true)
+    stub_feature_flags(observability_features: observability_ff)
+    stub_feature_flags(observability_tracing: observability_ff)
     sign_in(user)
   end
 
@@ -65,7 +66,7 @@
       end
 
       context 'when feature is disabled' do
-        let(:observability_logs_ff) { false }
+        let(:observability_ff) { false }
 
         it 'returns 404' do
           expect(html_response).to have_gitlab_http_status(:not_found)
diff --git a/ee/spec/requests/projects/metrics_controller_spec.rb b/ee/spec/requests/projects/metrics_controller_spec.rb
index ea6cda42f22b..ed25e5bea565 100644
--- a/ee/spec/requests/projects/metrics_controller_spec.rb
+++ b/ee/spec/requests/projects/metrics_controller_spec.rb
@@ -7,7 +7,7 @@
   let_it_be(:project) { create(:project, group: group) }
   let_it_be(:user) { create(:user) }
   let(:path) { nil }
-  let(:observability_metrics_ff) { true }
+  let(:observability_ff) { true }
   let(:expected_api_config) do
     {
       oauthUrl: Gitlab::Observability.oauth_url,
@@ -31,8 +31,9 @@
   end
 
   before do
-    stub_licensed_features(metrics_observability: true)
-    stub_feature_flags(observability_metrics: observability_metrics_ff)
+    stub_licensed_features(observability: true)
+    stub_feature_flags(observability_tracing: observability_ff)
+    stub_feature_flags(observability_features: observability_ff)
     sign_in(user)
   end
 
@@ -65,7 +66,7 @@
       end
 
       context 'when feature is disabled' do
-        let(:observability_metrics_ff) { false }
+        let(:observability_ff) { false }
 
         it 'returns 404' do
           expect(html_response).to have_gitlab_http_status(:not_found)
diff --git a/ee/spec/requests/projects/tracing_controller_spec.rb b/ee/spec/requests/projects/tracing_controller_spec.rb
index 570208fc0a5f..280b86d46035 100644
--- a/ee/spec/requests/projects/tracing_controller_spec.rb
+++ b/ee/spec/requests/projects/tracing_controller_spec.rb
@@ -7,7 +7,7 @@
   let_it_be(:project) { create(:project, group: group) }
   let_it_be(:user) { create(:user) }
   let(:path) { nil }
-  let(:observability_tracing_ff) { true }
+  let(:observability_ff) { true }
   let(:expected_api_config) do
     {
       oauthUrl: Gitlab::Observability.oauth_url,
@@ -31,8 +31,9 @@
   end
 
   before do
-    stub_licensed_features(tracing: true)
-    stub_feature_flags(observability_tracing: observability_tracing_ff)
+    stub_licensed_features(observability: true)
+    stub_feature_flags(observability_tracing: observability_ff)
+    stub_feature_flags(observability_features: observability_ff)
     sign_in(user)
   end
 
@@ -65,7 +66,7 @@
       end
 
       context 'when feature is disabled' do
-        let(:observability_tracing_ff) { false }
+        let(:observability_ff) { false }
 
         it 'returns 404' do
           expect(subject).to have_gitlab_http_status(:not_found)
diff --git a/lib/gitlab/observability.rb b/lib/gitlab/observability.rb
index 14af6975b809..d1e6fad6e9ee 100644
--- a/lib/gitlab/observability.rb
+++ b/lib/gitlab/observability.rb
@@ -26,8 +26,7 @@ def should_enable_observability_auth_scopes?(resource)
       # Enable the needed oauth scopes if tracing is enabled.
       if resource.is_a?(Group) || resource.is_a?(Project)
         return Feature.enabled?(:observability_tracing, resource.root_ancestor) ||
-            Feature.enabled?(:observability_metrics, resource.root_ancestor) ||
-            Feature.enabled?(:observability_logs, resource.root_ancestor)
+            Feature.enabled?(:observability_features, resource.root_ancestor)
       end
 
       false
diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb
index f259db1f749b..551197add7f4 100644
--- a/spec/lib/gitlab/auth_spec.rb
+++ b/spec/lib/gitlab/auth_spec.rb
@@ -95,7 +95,7 @@
     end
 
     context 'with observability feature flags' do
-      feature_flags = [:observability_tracing, :observability_metrics, :observability_logs]
+      feature_flags = [:observability_tracing, :observability_features]
 
       context 'when all disabled' do
         before do
diff --git a/spec/lib/gitlab/observability_spec.rb b/spec/lib/gitlab/observability_spec.rb
index 3a5abd393bd1..f8fa67735ebf 100644
--- a/spec/lib/gitlab/observability_spec.rb
+++ b/spec/lib/gitlab/observability_spec.rb
@@ -56,7 +56,7 @@
       end
     end
 
-    feature_flags = [:observability_tracing, :observability_metrics, :observability_logs]
+    feature_flags = [:observability_tracing, :observability_features]
     flag_states = [true, false].repeated_permutation(feature_flags.length)
     flag_tests = flag_states.map { |flags| Hash[feature_flags.zip(flags)] }
 
-- 
GitLab