module 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
ПРЕДУПРЕЖДЕНИЕ: вычисление source_location запроса может быть медленным, поэтому при использовании в производственной среде следует учитывать влияние на производительность.
См. также config.active_record.verbose_query_logs.
При загрузке Action Controller добавляет теги по умолчанию:
-
controller -
action -
namespaced_controller
При загрузке Active Job добавляет теги по умолчанию:
-
job
Новые теги комментариев можно определить, добавив их в Hash массива тегов Array. Теги могут содержать динамические данные: для этого задайте значение Proc или lambda в Hash. Теги могут ссылаться на любое значение, хранящееся в объекте context Rails. Для хранения значений приложения можно использовать 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
Комментарии с тегами можно добавлять в начало запроса:
config.active_record.query_log_tags_prepend_comment = true
В приложениях, где содержимое не меняется в течение запроса или выполнения задания, теги можно кэшировать и повторно использовать для каждого запроса:
config.active_record.cache_query_log_tags = true
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.