Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
loop-ping / src / index.js
Size: Mime:
var _ = require("lodash"),
    Joi = require("joi"),
    Usage = require("usage");

module.exports = function(options){

    var internals = {
        options : {
            checkIntervalMs : 2000,
            warnDelayMs : 500,
            pid : process.pid,
            logger : {
                info : function(message) {
                    console.log(JSON.stringify(message));
                },
                warn : function(message) {
                    console.log(JSON.stringify(message));
                }
            }
        },
        schema : Joi.object().keys({
            checkIntervalMs : Joi.number().integer().min(1),
            warnDelayMs : Joi.number().integer().min(1),
            logger : Joi.object().keys({
                info : Joi.func().required(),
                warn : Joi.func().required()
            })
        })
    };

    validate(options);

    internals.options = _.assign(internals.options, options);

    function validate(options){
        Joi.validate(options, internals.schema, { allowUnknown : true }, function(err){
            if(err){
                throw err;
            }
        });
    }

    setInterval(function(){
        var time = Date.now();
        setImmediate(function(){
            Usage.lookup(internals.options.pid, function(err, result){

                var message = {
                    message : "event loop detector",
                    status : {
                        loopLagMs : Math.abs(Date.now() - time),
                        memory : process.memoryUsage(),
                        cpu : result.cpu
                    }
                };

                if(!err && result.cpu){
                    message.status.cpu = result.cpu;
                }

                if(message.status.loopLagMs >= internals.options.warnDelayMs)
                    internals.options.logger.warn(message);
                else
                    internals.options.logger.info(message);
            });
        });
    }, internals.options.checkIntervalMs);
};