dashboard with specific socket connection

This commit is contained in:
Tjatse 2015-12-27 22:14:36 +08:00
parent 798e4a957c
commit bda5ddcd3b
5 changed files with 81 additions and 47 deletions

View File

@ -18,7 +18,7 @@ function Layout(options) {
if (!(this instanceof Layout)) {
return new Layout(options);
}
options = options || {};
options = _.clone(options || {});
if (!options.host) {
options.host = '127.0.0.1';
}
@ -40,12 +40,11 @@ Layout.prototype.render = function () {
// Preparing all socket.io clients.
Object.keys(conf.NSP).forEach(function (ns) {
jobs[ns.toLowerCase()] = function (next) {
console.info('connecting to socket.io/' + ns);
self._connectSocketIO(conf.NSP[ns], function (err, socket) {
if (err) {
console.error('failed due to', err.message);
console.error('Failed due to', err.message);
} else {
console.info('successful!');
console.info('Successful!');
}
next(err, socket);
});
@ -172,13 +171,16 @@ Layout.prototype._bindProcesses = function () {
*
*/
Layout.prototype._describeInfo = function (index) {
var jsonData = this._procs.data[index];
if (jsonData.pm2_env && jsonData.pm2_env.env) {
// Remove useless large-bytes attributes.
delete jsonData.pm2_env.env['LS_COLORS'];
var pm2 = this._dataOf(index);
if (!pm2) {
return this._eles.json.setContent(_formatJSON({message: 'There is no process running!'}));
}
delete jsonData.monit;
this._eles.json.setContent(_formatJSON(jsonData));
if (pm2.pm2_env && pm2.pm2_env.env) {
// Remove useless large-bytes attributes.
delete pm2.pm2_env.env['LS_COLORS'];
}
delete pm2.monit;
this._eles.json.setContent(_formatJSON(pm2));
};
/**
@ -187,7 +189,10 @@ Layout.prototype._describeInfo = function (index) {
*
*/
Layout.prototype._cpuAndMemUsage = function (index) {
var pm2 = this._procs.data[index];
var pm2 = this._dataOf(index);
if (!pm2) {
return;
}
if (!this._usages) {
this._usages = {
mem: [],
@ -219,8 +224,8 @@ Layout.prototype._cpuAndMemUsage = function (index) {
* @return {[type]} [description]
*/
Layout.prototype._displayLogs = function (index) {
var pm2 = this._procs.data[index];
if (this._lastLogPMId == pm2.pm_id) {
var pm2 = this._dataOf(index);
if (!pm2 || this._lastLogPMId == pm2.pm_id) {
return;
}
this._killLogs();
@ -238,6 +243,18 @@ Layout.prototype._killLogs = function () {
this._socket(conf.NSP.LOG).emit('tail_kill', this._lastLogPMId);
};
/**
* Get data by index.
* @param {Number} index
* @return {Object}
*/
Layout.prototype._dataOf = function (index) {
if (!this._procs || !Array.isArray(this._procs.data) || index >= this._procs.data.length) {
return null;
}
return this._procs.data[index];
};
/**
* Draw elements.
*/
@ -307,10 +324,15 @@ Layout.prototype._draw = function () {
* @param {Function} callback
*/
Layout.prototype._connectSocketIO = function (ns, callback) {
var socket = io('http://' + this.options.host + ':' + this.options.port + ns);
var serverUri = 'http://' + this.options.host + ':' + this.options.port + ns;
console.info('Connecting to', serverUri);
var socket = io(serverUri);
socket.on('connect', function () {
callback(null, socket);
});
socket.on('error', function (err) {
console.log(err);
});
};
/**

View File

@ -134,21 +134,11 @@ Monitor.prototype.quit = function () {
/**
* Monitor dashboard.
* @param {Object} options
*/
Monitor.prototype.dashboard = function () {
Log({
level: 1000
});
// Socket.io server.
var port = this.options.port;
this.sockio = require('socket.io')();
this._sockio.listen(port);
this.run();
Monitor.prototype.dashboard = function (options) {
// Render screen.
layout({
port: port
}).render();
layout(options).render();
};
/**
@ -189,7 +179,6 @@ Monitor.prototype._connectSysSock = function (socket) {
// Grep system states once and again.
(this._status != 'R') && this._nextTick(this.options.refresh || 5000);
console.info('connected to ' + socket.nsp.name + '!');
};
/**
@ -251,7 +240,7 @@ Monitor.prototype._connectLogSock = function (socket) {
socket.on('disconnect', self._killTailProcess.bind(self));
socket.on('tail_kill', self._killTailProcess.bind(self));
socket.on('tail', startTailProcess);
console.info('connected to ' + socket.nsp.name + '!');
console.info('Connected to ' + socket.nsp.name + '!');
};
/**
@ -323,7 +312,7 @@ Monitor.prototype._connectProcSock = function (socket) {
socket.on('disconnect', killObserver);
socket.on('proc', runObserver);
console.info('connected to ' + socket.nsp.name + '!');
console.info('Connected to ' + socket.nsp.name + '!');
};
/**
@ -499,14 +488,21 @@ Monitor.prototype._killTailProcess = function (pm_id) {
* Listening all the nsp.
*/
Monitor.prototype._listeningSocketIO = function () {
if (!this._sockio) {
if (!this._sockio || this._sockio._listening) {
console.warn('Avoid duplicated listening!');
return;
}
// Listen connection event.
this._sockio.of(conf.NSP.SYS).on('connection', this._connectSysSock.bind(this));
this._sockio.of(conf.NSP.LOG).on('connection', this._connectLogSock.bind(this));
this._sockio.of(conf.NSP.PROC).on('connection', this._connectProcSock.bind(this));
this._sockio._listening = true;
for (var nsp in conf.NSP) {
this._sockio.of(conf.NSP[nsp]).on('connection', this['_connect' + (nsp[0] + nsp.toLowerCase().slice(1)) + 'Sock'].bind(this));
console.info('Listening connection event on socket.io/' + nsp.toLowerCase());
}
this._sockio.use(function (socket, next) {
// console.log(socket.handshake);
next();
})
};
Object.defineProperty(Monitor.prototype, 'sockio', {
@ -516,10 +512,6 @@ Object.defineProperty(Monitor.prototype, 'sockio', {
}
this._sockio = io;
this._listeningSocketIO();
this._sockio.use(function (socket, next) {
// console.log(socket.handshake);
next();
})
},
get: function () {
return this._sockio;

View File

@ -2,7 +2,7 @@
node="$(which node)"
pidfile="pm2-gui.pid"
prefixINFO="\033[1;32m[INFO]\033[0m"
prefixWARN="\033[1;33m[WARNING]\033[0m"
prefixWARN="\033[1;33m[WARN]\033[0m"
function isRunning() {
if [ ! -f $pidfile ];
@ -69,13 +69,14 @@ EOF
case "$1" in
start)
server "$@";
server "$@"; # bash < v4.1 did not support ;&
;;
agent)
server "$@";
;;
mon)
server "$@";
;;
stop)
isRunning;
if [ 0 -eq $? ];

View File

@ -11,6 +11,7 @@ level = log
[agent]
authorization = AuTh
offline = false
[remotes]
pm_loc = AuTh@127.0.0.1:8088

View File

@ -68,6 +68,10 @@ function startAgent(confFile) {
});
var options = monitor.options;
if (options.agent && options.agent.offline) {
console.error('Agent is offline, can not start it.');
return process.exit(0);
}
options.port = options.port || 8088;
var sockio = socketIO();
sockio.listen(options.port);
@ -76,13 +80,27 @@ function startAgent(confFile) {
}
function dashboard(confFile) {
var monitor = slave({
confFile: confFile
}),
options = monitor.options;
if (options.agent && options.agent.offline) {
console.error('Agent is offline, can not start it.');
return process.exit(0);
}
options.port = options.port || 8088;
var sockio = socketIO();
sockio.listen(options.port);
monitor.sockio = sockio;
/*
Log({
level: 1000
});
var monitor = slave({
confFile: confFile
});
monitor.dashboard();
*/
monitor.run();
monitor.dashboard(options);
}
function exitGraceful(code, signal) {