Как подсчитать количество обращений / запросов к базе данных через Mongoid? - PullRequest
2 голосов
/ 25 марта 2020

Я использую Mongoid в проекте Rails. Чтобы повысить производительность больших запросов, я использую включает метод для быстрой загрузки отношений.

Я хотел бы знать, есть ли простой способ подсчета действительного числа запросы выполняются блоком кода, чтобы я мог проверить, действительно ли мои includes сократили количество обращений к БД, как ожидалось. Что-то вроде:

# It will perform a large query to gather data from companies and their relationships
count = Mongoid.count_queries do
  Company.to_csv
end

puts count # Number of DB access

Я хочу использовать эту функцию для добавления тестов Rspe c, чтобы доказать, что мой запрос остается эффективным после изменений (например, при добавлении данных из нового отношения). Например, в Django Framework python для этой цели можно использовать метод assertNumQueries .

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Проверка на r ubygems.org не принесла ничего, что, кажется, делает то, что вы хотите. Возможно, вам лучше воспользоваться инструментами для повышения производительности приложений, такими как New Reli c, Scout или DataDog . Вы можете получить некоторые из характеристик бенчмаркинга ворот с помощью

https://github.com/piotrmurach/rspec-benchmark

0 голосов
/ 27 марта 2020

То, что вы ищете, это командный мониторинг. С 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 класс, чтобы делать что-то кроме ведения журнала (например, увеличение глобального счетчика).

...