Вопрос:
Я просто хотел знать, есть ли способ отслеживать запросы mongoDB. Я пробовал использовать функции объяснения, предоставляемые оболочкой mongo. Но очень тяжело вручную отслеживать каждый запрос. Я использую мангуст как ODM.
Тот, который я пробовал:
db.customer.find({},{name:1, active:1}).explain()
Я получил объект с планом запроса, временем и многими другими вещами.
Лучший ответ:
Mongoose из коробки поддерживает только базовую отладку:
mongoose.set(‘debug’, true);
Но это не измеряет время запроса, поэтому почти не используется для профилирования. Поскольку mongoose 4. * вы можете использовать промежуточное программное обеспечение для измерения времени запроса: http://mongoosejs.com/docs/middleware.html
Есть несколько nodejs libs для измерения времени выполнения различных блоков кода и производительности приложения:
Ответ №1
Количество операций чтения (запроса, getmore) и записи (вставки, удаления, обновления) сообщается в opcounters в команде serverStatus. Помните, что вы также должны сопоставлять эту статистику пропускной способности вместе с метриками насыщения ресурсов, такими как currentQueue.readers и currentQueue.writers (также часть serverStatus).
Ниже приведены подробные сведения о различных способах сбора необходимых показателей: с помощью утилиты, команд или инструментов мониторинга, интегрированных с MongoDB (в той же серии вы также найдете всю статистику, необходимую для правильного мониторинга MongoDB).
Ответ №2
Вам нужен режим отладки:
Все выполненные методы сбора будут регистрировать вывод своих аргументов на консоль
mongoose.set(‘debug’, true);
Или вы можете добавить обратный вызов в качестве третьего аргумента, который позволяет получить дополнительную информацию:
mongoose.set(‘debug’, function (collection, method, query, doc [, options]) { console.log(/* your log format */); });
MongoDB также обеспечивает мониторинг вашего сервера mongod в облаке с помощью MMS
EDIT: чтобы сохранить ваши запросы в csv, вы можете использовать модуль csv-write-stream со следующим примером:
var csvWriter = require(‘csv-write-stream’); var fs = require(‘fs’); var writer = csvWriter(); // create write stream to ‘queries.csv’ file writer.pipe(fs.createWriteStream(‘queries.csv’)); mongoose.set(‘debug’, function (collection, method, query, doc [, options]) { writer.write({collection: collection, method: method, query: query, doc: JSON.strinfigy(doc)}); }); // close stream on mongoose disconnected mongoose.connection.on(‘disconnected’, function () { writer.end(); }); Ответ №3
Используйте db.setProfilingLevel() для регистрации медленных запросов или всех запросов. Затем используйте ElasticSearch + Kibana + Logstash для анализа и мониторинга запросов mongoDB.
Ответ №4
Я нашел лучший способ сделать это, используя профилировщик mongoDB. Он записывает результат профиля в коллекцию, называемую system.profile которая может быть запрошена как другие коллекции и также может быть экспортирована.
Существует два способа включения профилировщика:
- Включить профилировщик для всех баз данных сразу
- Включить профилировщик для конкретной базы данных.
Доступны следующие уровни профилирования:
0: нет профилирования, 1: медленные операции профиля и 3: профилировать всю операцию
См.: db.setProfilingLevel(2) и db.getProfilingStatus()