Permalink
Please sign in to comment.
Showing
with
104 additions
and 0 deletions.
- +2 −0 .gitignore
- +3 −0 README.md
- +69 −0 index.js
- +30 −0 package.json
2
.gitignore
| @@ -0,0 +1,2 @@ | ||
| +*.env | ||
| +node_modules |
| @@ -0,0 +1,3 @@ | ||
| +PM2 Pager | ||
| + | ||
| +Get notifications on exception from pm2 through nodemailer |
69
index.js
| @@ -0,0 +1,69 @@ | ||
| +require('dotenv').load(); | ||
| +var pm2 = require('pm2'); | ||
| +var nodemailer = require('nodemailer'); | ||
| +var moment = require('moment-timezone'); | ||
| +var _ = require('lodash'); | ||
| + | ||
| +var mailReceiver = process.env.MAIL_RECEIVER || false; | ||
| +var mailSender = process.env.MAIL_SENDER; | ||
| +var user = process.env.MANDRILL_USER || false; | ||
| +var pass = process.env.MANDRILL_PASSWORD; | ||
| + | ||
| +if (!mailReceiver || !user || !pass) { | ||
| + throw new Error('User || pass || receiver not specified'); | ||
| +} | ||
| + | ||
| +var transportOptions = { | ||
| + type: 'smtp', | ||
| + service: 'Mandrill', | ||
| + auth: { | ||
| + user: user, | ||
| + pass: pass | ||
| + } | ||
| +}; | ||
| + | ||
| +var transporter = nodemailer.createTransport(transportOptions); | ||
| + | ||
| +pm2.connect(function(err) { | ||
| + if (err) { throw err; } | ||
| + console.log('connected to pm2'); | ||
| + console.log('setting up exception event listener'); | ||
| + | ||
| + var compiled = _.template( | ||
| + 'An error has occurred on server ' + | ||
| + '<% name %>\n' + | ||
| + 'Stack Trace:\n\n\n<%= stack %>\n\n\n' + | ||
| + 'Context:\n\n<%= text %>' | ||
| + ); | ||
| + | ||
| + pm2.launchBus(function(err, bus) { | ||
| + if (err) { throw err; } | ||
| + | ||
| + console.log('event bus connected'); | ||
| + | ||
| + bus.on('process:exception', function(data) { | ||
| + var text; | ||
| + var stack; | ||
| + var name; | ||
| + try { | ||
| + data.date = moment(data.at || new Date()) | ||
| + .tz('America/Los_Angeles') | ||
| + .format('MMMM Do YYYY, h:mm:ss a z'); | ||
| + | ||
| + text = JSON.stringify(data, null, 2); | ||
| + stack = data.data.stack; | ||
| + name = data.process.name; | ||
| + } catch (e) { | ||
| + console.error('Error parsing exception' + e); | ||
| + return e; | ||
| + } | ||
| + | ||
| + transporter.sendMail({ | ||
| + to: mailReceiver, | ||
| + from: mailSender || user + '@yourserver.com', | ||
| + subject: 'Server exception', | ||
| + text: compiled({ name: name, text: text, stack: stack }) | ||
| + }); | ||
| + }); | ||
| + }); | ||
| +}); |
30
package.json
| @@ -0,0 +1,30 @@ | ||
| +{ | ||
| + "name": "pm2-pager", | ||
| + "version": "0.0.1", | ||
| + "description": "Send email notification on exceptions using pm2 and node mailer", | ||
| + "main": "index.js", | ||
| + "scripts": { | ||
| + "test": "echo 'Happy Coding!'" | ||
| + }, | ||
| + "repository": { | ||
| + "type": "git", | ||
| + "url": "git+https://github.com/FreeCodeCamp/pm2-pager.git" | ||
| + }, | ||
| + "keywords": [ | ||
| + "pm2", | ||
| + "email", | ||
| + "page", | ||
| + "pager" | ||
| + ], | ||
| + "author": "Berkeley Martinez <Berkeley@RoboTie.com> (http://RoboTie.com)", | ||
| + "license": "BSD-3-Clause", | ||
| + "bugs": { | ||
| + "url": "https://github.com/FreeCodeCamp/pm2-pager/issues" | ||
| + }, | ||
| + "homepage": "https://github.com/FreeCodeCamp/pm2-pager#readme", | ||
| + "dependencies": { | ||
| + "dotenv": "^2.0.0", | ||
| + "moment-timezone": "^0.5.0", | ||
| + "nodemailer": "^2.1.0" | ||
| + } | ||
| +} |
0 comments on commit
387d6a2