PM2に登録するプログラムに監視用のコマンドを仕込む
pm2app.js
var monitor_init = function(){
if (!('send' in process)) {return;}
process.on("message", function (msg) {
if ( "type" in msg ) {
switch(msg.type){
case "process.getinfo":
process.send({type:msg.type, memory:process.memoryUsage()});
break;
default:
break;
}
}
});
}
var main = function(){
monitor_init();
var update = function(){
setTimeout(update, 1000);
}
update();
}
main();
pm2にワーカーを登録する
start.sh
pm2 start pm2app.js -i 2 --name worker
データ取得用のコマンドの作成
モジュールをnpmでインストールする
npm install pm2-interface@0.1.3
ワーカーの情報取得用コマンドを作成する
pm2-monitor.js
#!/usr/bin/env node
var ipm2 = require('pm2-interface')()
var os = require('os');
ipm2.on('ready', function() {
ipm2.bus.on('process.getinfo', function(worker){
console.log({
name : os.hostname()+'.'+worker.process.pm2_env.pm_id,
data : worker.data.memory
});
});
var msg = {type:"process.getinfo"};
ipm2.rpc.msgProcess({name:"worker", msg:msg}, function (err, res) {
setTimeout(function(){
ipm2.disconnect();
}, 100);
});
});
ipm2.disconnectを実行しない限りずっとモニタリングすることもできる(pm2に登録してpubsubやfluentdに流すこともできる)
cronなどでポーリングする場合に癖があってipm2.rpc.msgProcessのコールバックではコマンドを発行したコールバックで
リクエストに対するレスポンスを受け取ることはできない。
なのでsetTimeoutで処理を遅らせている(値が取れないことを考慮したほうがいいかも)
※他にやり方があれば教えて下さい
結果
console
{name: "mymachine.2", data: { rss: 19156992, heapTotal: 11356928, heapUsed: 5831840 } }
{name: "mymachine.3", data: { rss: 19156992, heapTotal: 11356928, heapUsed: 5831840 } }
おまけ
npm install munin-plugin
モジュールのexample内にworkerのメモリを取得するmuninのプラグインが入ってます