модуль ActiveRecord::QueryLogs
Журналы запросов Active Record
Автоматически добавляет комментарии к SQL-запросам с метками информации о времени выполнения. Это можно использовать для отслеживания проблемных SQL-запросов до кода приложения, который сгенерировал эти запросы.
Журналы запросов можно включить через конфигурацию Rails в config/application.rb или в инициализаторе:
config.active_record.query_log_tags_enabled = true
По умолчанию регистрируется имя приложения, имя и действие контроллера или имя задачи. По умолчанию используется формат SQLCommenter. Метки, отображаемые в комментариях к запросам, можно настроить через конфигурацию Rails:
config.active_record.query_log_tags = [ :application, :controller, :action, :job ]
Active Record определяет доступные по умолчанию метки:
-
application -
pid -
socket -
db_host -
database
Action Controller добавляет метки по умолчанию при загрузке:
-
controller -
action -
namespaced_controller
Active Job добавляет метки по умолчанию при загрузке:
-
job
Новые метки комментариев можно определить, добавив их в Hash к меткам Array. Метки могут содержать динамическое содержимое, задав значение Proc или лямбда-значение в Hash, и могут ссылаться на любые значения, сохранённые Rails в объекте context. ActiveSupport::CurrentAttributes можно использовать для хранения значений приложения. Метки с nil значениями опускаются из комментария к запросу.
Экранирование выполняется для строки, возвращаемой функцией, однако не следует использовать недоверенные данные пользователя.
Пример:
config.active_record.query_log_tags = [
:namespaced_controller,
:action,
:job,
{
request_id: ->(context) { context[:controller]&.request&.request_id },
job_id: ->(context) { context[:job]&.job_id },
tenant_id: -> { Current.tenant&.id },
static: "value",
},
]
По умолчанию имя приложения, имя и действие контроллера или имя задачи регистрируются с использованием формата SQLCommenter. Это можно изменить через config.active_record.query_log_tags_format
Комментарии меток можно добавлять в начало запроса:
ActiveRecord::QueryLogs.prepend_comment = true
Для приложений, где содержимое не будет меняться в течение времени выполнения запроса или задачи, метки могут кэшироваться для повторного использования в каждом запросе:
config.active_record.cache_query_log_tags = true
Методы публичного класса
# File activerecord/lib/active_record/query_logs.rb, line 99
def update_formatter(format)
self.tags_formatter =
case format
when :legacy
LegacyFormatter.new
when :sqlcommenter
SQLCommenter.new
else
raise ArgumentError, "Formatter is unsupported: #{formatter}"
end
end Обновляет форматер на указанный формат.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.