From 86abe907fe88dae85ab4632883e8db7117d11462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Tue, 9 Nov 2021 13:16:44 +0100 Subject: [PATCH 1/3] Allow to enable query analyzers in production This adds `GITLAB_ENABLE_QUERY_ANALYZERS` (disabled by default) to allow enable this in production. --- config/initializers/database_query_analyzers.rb | 4 +++- lib/gitlab/database/query_analyzer.rb | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/config/initializers/database_query_analyzers.rb b/config/initializers/database_query_analyzers.rb index a29cd6552ffd16..b2ddb6bccd1bb1 100644 --- a/config/initializers/database_query_analyzers.rb +++ b/config/initializers/database_query_analyzers.rb @@ -1,4 +1,6 @@ # frozen_string_literal: true # Currently we register validator only for `dev` or `test` environment -Gitlab::Database::QueryAnalyzer.new.hook! if Gitlab.dev_or_test_env? +if Gitlab.dev_or_test_env? || Gitlab::Utils.to_boolean('GITLAB_ENABLE_QUERY_ANALYZERS', default: false) + Gitlab::Database::QueryAnalyzer.instance.hook! +end diff --git a/lib/gitlab/database/query_analyzer.rb b/lib/gitlab/database/query_analyzer.rb index 830ad1383c0478..ceadeec49d909d 100644 --- a/lib/gitlab/database/query_analyzer.rb +++ b/lib/gitlab/database/query_analyzer.rb @@ -11,6 +11,10 @@ class QueryAnalyzer :sql, :connection, :pg ) + def self.instance + @instance ||= new + end + def hook! @subscriber = ActiveSupport::Notifications.subscribe('sql.active_record') do |event| process_sql(event.payload[:sql], event.payload[:connection]) -- GitLab From 352a17b0583c3e3d913607b716298c666c9d65bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Tue, 9 Nov 2021 17:30:44 +0100 Subject: [PATCH 2/3] Use Singleton module This ensures that always only a single instance of a given class can be created. --- lib/gitlab/database/query_analyzer.rb | 6 ++---- spec/lib/gitlab/database/query_analyzer_spec.rb | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/gitlab/database/query_analyzer.rb b/lib/gitlab/database/query_analyzer.rb index ceadeec49d909d..6cbeefa0aae596 100644 --- a/lib/gitlab/database/query_analyzer.rb +++ b/lib/gitlab/database/query_analyzer.rb @@ -5,16 +5,14 @@ module Database # The purpose of this class is to implement a various query analyzers based on `pg_query` # And process them all via `Gitlab::Database::QueryAnalyzers::*` class QueryAnalyzer + include ::Singleton + ANALYZERS = [].freeze Parsed = Struct.new( :sql, :connection, :pg ) - def self.instance - @instance ||= new - end - def hook! @subscriber = ActiveSupport::Notifications.subscribe('sql.active_record') do |event| process_sql(event.payload[:sql], event.payload[:connection]) diff --git a/spec/lib/gitlab/database/query_analyzer_spec.rb b/spec/lib/gitlab/database/query_analyzer_spec.rb index 3567bd6a058783..f0a3021927ba7b 100644 --- a/spec/lib/gitlab/database/query_analyzer_spec.rb +++ b/spec/lib/gitlab/database/query_analyzer_spec.rb @@ -65,7 +65,7 @@ def process_sql(sql) ApplicationRecord.load_balancer.read_write do |connection| - described_class.new.send(:process_sql, sql, connection) + described_class.instance.send(:process_sql, sql, connection) end end end -- GitLab From a012dd323ee6a5e6034e687a6f7697ca25517e18 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Tue, 9 Nov 2021 21:56:49 +0000 Subject: [PATCH 3/3] Fix `ENV['` usage --- config/initializers/database_query_analyzers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/database_query_analyzers.rb b/config/initializers/database_query_analyzers.rb index b2ddb6bccd1bb1..7d4802b76c27fe 100644 --- a/config/initializers/database_query_analyzers.rb +++ b/config/initializers/database_query_analyzers.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true # Currently we register validator only for `dev` or `test` environment -if Gitlab.dev_or_test_env? || Gitlab::Utils.to_boolean('GITLAB_ENABLE_QUERY_ANALYZERS', default: false) +if Gitlab.dev_or_test_env? || Gitlab::Utils.to_boolean(ENV['GITLAB_ENABLE_QUERY_ANALYZERS'], default: false) Gitlab::Database::QueryAnalyzer.instance.hook! end -- GitLab