MongoDB.coffee 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. Connection = require("mongoose/node_modules/mongodb/lib/mongodb/connection/connection").Connection
  2. MongoReply = require("mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply").MongoReply
  3. Metrics = require("../Metrics")
  4. logger = require "logger-sharelatex"
  5. _ = require("underscore")
  6. connectionMonitor =
  7. newConnection: (id, db) ->
  8. Metrics.inc "mongo-requests"
  9. @connections[id] =
  10. timer: new Metrics.Timer("mongo-request-times")
  11. db: db
  12. start: new Date()
  13. setTimeout (=> @connectionDone(id)), 60000
  14. connectionDone: (id) ->
  15. queryIsNoise = (query)->
  16. isNoise = false
  17. if query? && _.isObject(query)
  18. keys = _.keys(query)
  19. if keys[0] == "ismaster" or keys[0] == "ping"
  20. isNoise = true
  21. return isNoise
  22. logItOut = (db)->
  23. logger.log
  24. request_id: db.requestId,
  25. query: db.query,
  26. collection: db.collectionName,
  27. "response-time": new Date() - start
  28. "mongo request"
  29. if @connections[id]?
  30. @connections[id].timer.done()
  31. db = @connections[id].db
  32. start = @connections[id].start
  33. if !queryIsNoise(db.query)
  34. logItOut(db)
  35. delete @connections[id]
  36. connections: {}
  37. monkeyPatchMongo = () ->
  38. write = Connection::write
  39. Connection::write = (db) ->
  40. write.apply(this, arguments)
  41. connectionMonitor.newConnection db.requestId, db
  42. parseHeader = MongoReply::parseHeader
  43. MongoReply::parseHeader = () ->
  44. parseHeader.apply this, arguments
  45. connectionMonitor.connectionDone this.responseTo
  46. module.exports.monitor = monkeyPatchMongo