| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /*
- * 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(mongodbRequirePath, 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(mongodbRequirePath)
- } catch (error) {}
- try {
- // for the v2 driver the relevant methods are in the mongodb-core
- // module in lib/topologies/{server,replset,mongos}.js
- const v2Path = mongodbRequirePath.replace(/\/mongodb$/, '/mongodb-core')
- mongodbCore = require(v2Path)
- } 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 mongoDriverV1Wrapper = function (dbCommand, options, callback) {
- let query
- if (typeof callback === 'undefined') {
- callback = options
- options = {}
- }
- const collection = dbCommand.collectionName
- if (collection.match(/\$cmd$/)) {
- // Ignore noisy command methods like authenticating, ismaster and ping
- return _method.call(this, dbCommand, options, callback)
- }
- if (dbCommand.query != null) {
- query = Object.keys(dbCommand.query).sort().join('_')
- }
- const timer = new Metrics.Timer('mongo', { collection, query })
- const start = new Date()
- return _method.call(this, dbCommand, options, function () {
- timer.done()
- logger.debug(
- {
- query: dbCommand.query,
- query_type: type,
- collection,
- 'response-time': new Date() - start,
- },
- 'mongo request'
- )
- return callback.apply(this, arguments)
- })
- }
- const mongoDriverV2Wrapper = 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()
- logger.debug(
- {
- 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] = mongoDriverV1Wrapper)
- } else if (arglen === 4) {
- return (base[method] = mongoDriverV2Wrapper)
- }
- }
- 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'
- )
- },
- }
|