/* * decaffeinate suggestions: * DS102: Remove unnecessary code created because of implicit returns * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ module.exports = { monitor(mongodb_require_path, logger) { let mongodb, mongodbCore; try { // for the v1 driver the methods to wrap are in the mongodb // module in lib/mongodb/db.js mongodb = require(`${mongodb_require_path}`); } catch (error) {} try { // for the v2 driver the relevant methods are in the mongodb-core // module in lib/topologies/{server,replset,mongos}.js const v2_path = mongodb_require_path.replace(/\/mongodb$/, '/mongodb-core'); mongodbCore = require(v2_path); } catch (error1) {} const Metrics = require("./metrics"); const monitorMethod = function(base, method, type) { let _method; if (base == null) { return; } if ((_method = base[method]) == null) { return; } const arglen = _method.length; const mongo_driver_v1_wrapper = function(db_command, options, callback) { let query; if (typeof callback === 'undefined') { callback = options; options = {}; } const collection = db_command.collectionName; if (collection.match(/\$cmd$/)) { // Ignore noisy command methods like authenticating, ismaster and ping return _method.call(this, db_command, options, callback); } let key = `mongo-requests.${collection}.${type}`; if (db_command.query != null) { query = Object.keys(db_command.query).sort().join("_"); key += "." + query; } const timer = new Metrics.Timer("mongo", {collection, query}); const start = new Date(); return _method.call(this, db_command, options, function() { timer.done(); const time = new Date() - start; logger.log({ query: db_command.query, query_type: type, collection, "response-time": new Date() - start }, "mongo request"); return callback.apply(this, arguments); }); }; const mongo_driver_v2_wrapper = function(ns, ops, options, callback) { let query; if (typeof callback === 'undefined') { callback = options; options = {}; } if (ns.match(/\$cmd$/)) { // Ignore noisy command methods like authenticating, ismaster and ping return _method.call(this, ns, ops, options, callback); } let key = `mongo-requests.${ns}.${type}`; if (ops[0].q != null) { // ops[0].q query = Object.keys(ops[0].q).sort().join("_"); key += "." + query; } const timer = new Metrics.Timer(key); const start = new Date(); return _method.call(this, ns, ops, options, function() { timer.done(); const time = new Date() - start; logger.log({ query: ops[0].q, query_type: type, collection: ns, "response-time": new Date() - start }, "mongo request"); return callback.apply(this, arguments); }); }; if (arglen === 3) { return base[method] = mongo_driver_v1_wrapper; } else if (arglen === 4) { return base[method] = mongo_driver_v2_wrapper; } }; monitorMethod(mongodb != null ? mongodb.Db.prototype : undefined, "_executeQueryCommand", "query"); monitorMethod(mongodb != null ? mongodb.Db.prototype : undefined, "_executeRemoveCommand", "remove"); monitorMethod(mongodb != null ? mongodb.Db.prototype : undefined, "_executeInsertCommand", "insert"); monitorMethod(mongodb != null ? mongodb.Db.prototype : undefined, "_executeUpdateCommand", "update"); monitorMethod(mongodbCore != null ? mongodbCore.Server.prototype : undefined, "command", "command"); monitorMethod(mongodbCore != null ? mongodbCore.Server.prototype : undefined, "remove", "remove"); monitorMethod(mongodbCore != null ? mongodbCore.Server.prototype : undefined, "insert", "insert"); monitorMethod(mongodbCore != null ? mongodbCore.Server.prototype : undefined, "update", "update"); monitorMethod(mongodbCore != null ? mongodbCore.ReplSet.prototype : undefined, "command", "command"); monitorMethod(mongodbCore != null ? mongodbCore.ReplSet.prototype : undefined, "remove", "remove"); monitorMethod(mongodbCore != null ? mongodbCore.ReplSet.prototype : undefined, "insert", "insert"); monitorMethod(mongodbCore != null ? mongodbCore.ReplSet.prototype : undefined, "update", "update"); monitorMethod(mongodbCore != null ? mongodbCore.Mongos.prototype : undefined, "command", "command"); monitorMethod(mongodbCore != null ? mongodbCore.Mongos.prototype : undefined, "remove", "remove"); monitorMethod(mongodbCore != null ? mongodbCore.Mongos.prototype : undefined, "insert", "insert"); return monitorMethod(mongodbCore != null ? mongodbCore.Mongos.prototype : undefined, "update", "update"); } };