Promise Profiler

This repo will profile your code by giving the execution time of all promises in a json without disturbing the production level code.

Documentation

  • The documentation can be found here.

Installation

  • Install bluebird-promise-profiler as dev dependency

      npm i --save-dev bluebird-promise-profiler
  • Please upgrade to the latest version for bug free experience.

Usage

  • We will implement routes and model for two function multiply and square (the working examples can be seen in ./examples of this repository).
  • File: ./routes/route.js

      'use strict';
    
      const Promise = require('bluebird');
      const Model = require('../models/Model');
    
      /**
       * Route for calling square function in ../models/Model.js
       * @param num
       * @returns {Promise}
       */
      const squareRoute = function squareRoute (num) {
    
          return Model.square(num)
              // the function name 'squarePromise' will be one of the key in output of the profiler whose value would be around 1000 milliseconds
              .then(function squarePromise (result) {
    
                  return {result};
    
              });
      };
    
      const squareAndMultiplyRoute = function squareAndMultiply (num1, num2) {
    
          return Promise.join(Model.multiply(num1, num2), Model.square(num1))
              // the function name 'spreadFunction' will be one of the key in output of the profiler whose value would be around 2000 milliseconds
              .spread(function spreadFunction (multiplyResult, squareResult) {
                  return {multiplyResult, squareResult};
              });
    
      };
    
      module.exports = {
          squareRoute: squareRoute,
          squareAndMultiplyRoute: squareAndMultiplyRoute
      };
    
  • File: ./models/Model.js

      'use strict';
    
      const Promise = require('bluebird');
    
      /**
       * Makes a delay of one second and returns back a promise which multiplies the two numbers.
       * @param num1
       * @param num2
       * @returns {bluebird} Returns back a promise which multiplies the two numbers.
       */
      const multiply = function multiply (num1, num2) {
    
          return new Promise (function (resolve, reject) {
    
              setTimeout(function promise1Timeout () {
                  resolve(num1 * num2);
              }, 1000);
    
          });
    
      };
    
      /**
       * Makes delay of one second and then calls multiply which further makes a delay of one second, so total delay is two seconds.
       * @param num1
       * @returns {bluebird} Returns back a promise which multiplies the given number.
       */
      const square = function square (num1) {
    
          return new Promise (function (resolve, reject) {
    
              setTimeout(function promise1Timeout () {
    
                  multiply(num1, num1)
                      // the function name 'multiplyPromise' will be one of the key in output of the profiler whose value would be around 1000 milliseconds
                      .then(function multiplyPromise (result) {
                          resolve(result);
                      });
    
              }, 1000);
    
          });
    
      };
    
      module.exports = {
          square: square,
          multiply: multiply
      };
    
  • The above are the files for routes and model respectively for squaring and multiplying numbers.

  • The multiply function in models causes a delay of one second and returns the output, therefore total time taken by square function is one seconds
  • The square function also makes a delay of one second and then calls the multiply function, therefore total time taken by square function is two seconds.
  • So now we need to profile this, without touching the code, now we make a temporary file called profiler.js

  • profiler.js

      'use strict';
      // to run this file type 'node profiler' in the terminal
    
      const route = require('./routes/route');
    
      const promiseProfiler = require('bluebird-promise-profiler');
      promiseProfiler.startProfiling();
    
      //call square route
      route.squareRoute(5).then((res) => {
    
          // { result: 25 }
          console.log(res);
    
          // { multiplyPromise: 1004.3564850000002, squarePromise: 2009.1301549999998 }
          console.log(promiseProfiler.getProfilerResult());
    
          // reset profiler result to analyze other route
          promiseProfiler.resetProfiler();
    
          // call squareAndMultiply route
          route.squareAndMultiplyRoute(4, 5).then((result) => {
    
              // { multiplyResult: 20, squareResult: 16 }
              console.log(result);
    
              // note there is a multiplyPromise included in this response as square function internally calls multiply function
              // { multiplyPromise: 1004.7086040000004, spreadFunction: 2008.4984540000005 }
              console.log(promiseProfiler.getProfilerResult());
    
              // stop the profiler once the profiling is done
              promiseProfiler.stopProfiling();
          });
    
      });
    
  • Profiling would be done according to the function names given in .then() and .spread() functions.

  • Anonymous functions given inside .then() or .spread() will not be profiled. So please do give names into those functions.

Examples

  • Steps to run examples in this repo:

      npm run-script examples

Tests

  • Test without code coverage

      npm test
  • Test with code coverage

      npm run-script test-with-coverage