pm2-slack-monitor
Version:
A CLI tool to monitor PM2 processes and send error logs to individual Slack channels via webhook.
45 lines (36 loc) • 1.7 kB
JavaScript
const pm2 = require('pm2');
const slack = require('./slack');
const config = require('./config');
async function start() {
const monitored = config.getProcesses();
pm2.connect(err => {
if (err) {
console.error('❌ PM2 connection error', err);
process.exit(2);
}
pm2.launchBus((err, bus) => {
console.log('✅ Monitoring PM2 process events...');
bus.on('process:event', data => {
const { process, event } = data;
const name = process.name;
if (monitored.includes(name) && ['exit', 'error', 'exception'].includes(event)) {
const webhook = config.getWebhookForProcess(name);
if (!webhook) return;
// Fetch process logs
pm2.describe(name, (err, list) => {
if (err || !list || list.length === 0) {
return slack.send(`🚨 *${name}* had an event: *${event}* (but log fetch failed)`, webhook);
}
const info = list[0];
const lastLogs = ['exit', 'error', 'exception'].includes(event) ? info.pm2_env?.pm_err_log_path : info.pm2_env?.pm_out_log_path;
const fs = require('fs');
const tail = fs.readFileSync(lastLogs, 'utf8').split('\n').slice(-10).join('\n');
const msg = `🚨 *${name}* triggered *${event}*\n\`\`\`\n${tail}\n\`\`\``;
slack.send(msg, webhook);
});
}
});
});
});
}
module.exports = { start };