event_loop.js 1.1 KB

123456789101112131415161718192021222324252627282930
  1. /*
  2. * decaffeinate suggestions:
  3. * DS102: Remove unnecessary code created because of implicit returns
  4. * DS207: Consider shorter variations of null checks
  5. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  6. */
  7. let EventLoopMonitor;
  8. module.exports = (EventLoopMonitor = {
  9. monitor(logger, interval, log_threshold) {
  10. if (interval == null) { interval = 1000; }
  11. if (log_threshold == null) { log_threshold = 100; }
  12. const Metrics = require("./metrics");
  13. // check for logger on startup to avoid exceptions later if undefined
  14. if ((logger == null)) { throw new Error("logger is undefined"); }
  15. // monitor delay in setInterval to detect event loop blocking
  16. let previous = Date.now();
  17. const intervalId = setInterval(function() {
  18. const now = Date.now();
  19. const offset = now - previous - interval;
  20. if (offset > log_threshold) {
  21. logger.warn({offset}, "slow event loop");
  22. }
  23. previous = now;
  24. return Metrics.timing("event-loop-millsec", offset);
  25. }
  26. , interval);
  27. return Metrics.registerDestructor(() => clearInterval(intervalId));
  28. }
  29. });