То, что вы ищете, это командный мониторинг. С Mongoid и драйвером Ruby вы можете создать собственный класс мониторинга команд, который можно использовать для подписки на все команды, выполняемые на сервере.
Я адаптировал это из Руководства по мониторингу команд для драйвера Mon go Ruby.
В этом конкретном примере убедитесь, что в приложении Rails установлен уровень отладки для журнала. Вы можете прочитать больше о Rails logger здесь .
Первое, что вы хотите сделать, это определить класс подписчика. Это класс, который сообщает вашему приложению, что делать, когда Mongo::Client
выполняет команды для базы данных. Вот пример класса из документации:
class CommandLogSubscriber
include Mongo::Loggable
# called when a command is started
def started(event)
log_debug("#{prefix(event)} | STARTED | #{format_command(event.command)}")
end
# called when a command finishes successfully
def succeeded(event)
log_debug("#{prefix(event)} | SUCCEEDED | #{event.duration}s")
end
# called when a command terminates with a failure
def failed(event)
log_debug("#{prefix(event)} | FAILED | #{event.message} | #{event.duration}s")
end
private
def logger
Mongo::Logger.logger
end
def format_command(args)
begin
args.inspect
rescue Exception
'<Unable to inspect arguments>'
end
end
def format_message(message)
format("COMMAND | %s".freeze, message)
end
def prefix(event)
"#{event.address.to_s} | #{event.database_name}.#{event.command_name}"
end
end
(Убедитесь, что этот класс автоматически загружается в вашем приложении Rails.)
Далее, вы хотите присоединить этого подписчика к клиенту вы используете для выполнения команд.
subscriber = CommandLogSubscriber.new
Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::COMMAND, subscriber)
# This is the name of the default client, but it's possible you've defined
# a client with a custom name in config/mongoid.yml
client = Mongoid::Clients.from_name('default')
client.subscribe( Mongo::Monitoring::COMMAND, subscriber)
Теперь, когда Mongoid выполняет какие-либо команды для базы данных, эти команды будут зарегистрированы в вашей консоли.
# For example, if you have a model called Book
Book.create(title: "Narnia")
# => D, [2020-03-27T10:29:07.426209 #43656] DEBUG -- : COMMAND | localhost:27017 | mongoid_test_development.insert | STARTED | {"insert"=>"books", "ordered"=>true, "documents"=>[{"_id"=>BSON::ObjectId('5e7e0db3f8f498aa88b26e5d'), "title"=>"Narnia", "updated_at"=>2020-03-27 14:29:07.42239 UTC, "created_at"=>2020-03-27 14:29:07.42239 UTC}], "lsid"=>{"id"=><BSON::Binary:0x10600 type=uuid data=0xfff8a93b6c964acb...>}}
# => ...
Вы можете изменить CommandLogSubscriber
класс, чтобы делать что-то кроме ведения журнала (например, увеличение глобального счетчика).