модуль 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 -
source_location
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
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.