overleaf/libraries/metrics/mongodb.js
2020-08-17 14:43:08 +01:00

128 lines
4.7 KiB
JavaScript

/*
* 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("./index");
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");
}
};