summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2018-08-02 12:04:35 +0200
committerKamil Trzciński <ayufan@ayufan.eu>2018-08-07 19:53:16 +0200
commitcf04146ae834a4692f03b5ab989d78eb789858dc (patch)
treef21956ccd3e0f386d6f363144cbd603d86752ef1
parente72388246b0ab9badfd96cc5888b8d4807daeb89 (diff)
downloadgitlab-ce-cf04146ae834a4692f03b5ab989d78eb789858dc.tar.gz
Enable verbose query loggingenable-verbose-query-logs
This backports the https://github.com/rails/rails/pull/26815 and enables that for non-Rails5 and non-production environments.
-rw-r--r--config/initializers/active_record_verbose_query_logs.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/config/initializers/active_record_verbose_query_logs.rb b/config/initializers/active_record_verbose_query_logs.rb
new file mode 100644
index 00000000000..44f86fec7e0
--- /dev/null
+++ b/config/initializers/active_record_verbose_query_logs.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+# This is backport of https://github.com/rails/rails/pull/26815/files
+# Enabled by default for every non-production environment
+
+module ActiveRecord
+ class LogSubscriber
+ module VerboseQueryLogs
+ def debug(progname = nil, &block)
+ return unless super
+
+ log_query_source
+ end
+
+ def log_query_source
+ source_line, line_number = extract_callstack(caller_locations)
+
+ if source_line
+ if defined?(::Rails.root)
+ app_root = "#{::Rails.root}/".freeze
+ source_line = source_line.sub(app_root, "")
+ end
+
+ logger.debug(" ↳ #{source_line}:#{line_number}")
+ end
+ end
+
+ def extract_callstack(callstack)
+ line = callstack.find do |frame|
+ frame.absolute_path && !ignored_callstack(frame.absolute_path)
+ end
+
+ offending_line = line || callstack.first
+ [
+ offending_line.path,
+ offending_line.lineno,
+ offending_line.label
+ ]
+ end
+
+ LOG_SUBSCRIBER_FILE = ActiveRecord::LogSubscriber.method(:logger).source_location.first
+ RAILS_GEM_ROOT = File.expand_path("../../../..", LOG_SUBSCRIBER_FILE) + "/"
+ APP_CONFIG_ROOT = File.expand_path("..", __dir__) + "/"
+
+ def ignored_callstack(path)
+ path.start_with?(APP_CONFIG_ROOT, RAILS_GEM_ROOT, RbConfig::CONFIG["rubylibdir"])
+ end
+ end
+
+ unless Gitlab.rails5?
+ prepend(VerboseQueryLogs) unless Rails.env.production?
+ end
+ end
+end