mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
128 lines
4.7 KiB
JavaScript
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("./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");
|
|
}
|
|
};
|