From 6315c6eae05563c95967507609d3f7d664d6fa97 Mon Sep 17 00:00:00 2001 From: Stuart Taylor Date: Tue, 29 May 2018 14:08:55 +0100 Subject: [PATCH] feat(reporting): Use rollbarjs for error reporting in production (#17259) --- package-lock.json | 94 ++++++++++++++++++++++++++++ package.json | 1 + sample.env | 2 + server/middlewares/error-reporter.js | 23 ++++++- 4 files changed, 118 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f9a5ffa44..fc64c7c9d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3813,6 +3813,11 @@ "date-now": "0.1.4" } }, + "console-polyfill": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/console-polyfill/-/console-polyfill-0.3.0.tgz", + "integrity": "sha512-w+JSDZS7XML43Xnwo2x5O5vxB0ID7T5BdqDtyqT6uiCAX2kZAgcWxNaGqT97tZfSHzfOcvrfsDAodKcJ3UvnXQ==" + }, "constantinople": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", @@ -4463,6 +4468,15 @@ } } }, + "decache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decache/-/decache-3.1.0.tgz", + "integrity": "sha1-T1A2+9ZYH8yXI3rDlUokS5U2wto=", + "optional": true, + "requires": { + "find": "0.2.9" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -5196,6 +5210,14 @@ "is-arrayish": "0.2.1" } }, + "error-stack-parser": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.3.tgz", + "integrity": "sha1-+tpuOpzSsOCA5tb8dRQYZJc081w=", + "requires": { + "stackframe": "0.3.1" + } + }, "es-abstract": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", @@ -6231,6 +6253,15 @@ } } }, + "find": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/find/-/find-0.2.9.tgz", + "integrity": "sha1-S3Px/55WrZG3bnFkB/5f/mVUu4w=", + "optional": true, + "requires": { + "traverse-chain": "0.1.0" + } + }, "find-cache-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", @@ -9436,6 +9467,11 @@ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", "dev": true }, + "is_js": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz", + "integrity": "sha1-CrlFQFArp6+iTIVqqYVWFmnpxS0=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -15969,6 +16005,14 @@ "uuid": "3.1.0" } }, + "request-ip": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-2.0.2.tgz", + "integrity": "sha1-3urm1K8hdoSX24zQX6NxQ/jxJX4=", + "requires": { + "is_js": "0.9.0" + } + }, "request-promise-core": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", @@ -16266,6 +16310,45 @@ "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, + "rollbar": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/rollbar/-/rollbar-2.4.0.tgz", + "integrity": "sha512-R7AbQkXI5EHgU/2WleXbJykdQXFklOE+LsS2wbXO6Opw/BIROQ/pKAEwd7/EbMxWsiLEbwYbv3FYtqlhYfOnwA==", + "requires": { + "async": "1.2.1", + "console-polyfill": "0.3.0", + "debug": "2.6.9", + "decache": "3.1.0", + "error-stack-parser": "1.3.3", + "extend": "3.0.0", + "json-stringify-safe": "5.0.1", + "lru-cache": "2.2.4", + "request-ip": "2.0.2", + "uuid": "3.0.1" + }, + "dependencies": { + "async": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-1.2.1.tgz", + "integrity": "sha1-pIFqF81f9RbfosdpikUzabl5DeA=" + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=" + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + } + } + }, "rss-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.1.2.tgz", @@ -17590,6 +17673,11 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=" }, + "stackframe": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", + "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=" + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -18906,6 +18994,12 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" }, + "traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=", + "optional": true + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", diff --git a/package.json b/package.json index bbd2454901..0b396bc34c 100644 --- a/package.json +++ b/package.json @@ -141,6 +141,7 @@ "redux-form": "^5.2.3", "request": "^2.65.0", "reselect": "^3.0.0", + "rollbar": "^2.4.0", "rss-parser": "^3.1.2", "rx": "^4.1.0", "rx-dom": "^7.0.3", diff --git a/sample.env b/sample.env index 0dcbb982e6..4eef54c3e6 100644 --- a/sample.env +++ b/sample.env @@ -1,6 +1,8 @@ COMPOSE_PROJECT_NAME=freecodecamp MONGOHQ_URL='mongodb://localhost:27017/freecodecamp' +ROLLBAR_APP_ID='my-rollbar-app-id' + FACEBOOK_ID=stuff FACEBOOK_SECRET=stuff diff --git a/server/middlewares/error-reporter.js b/server/middlewares/error-reporter.js index 24be9d5ec1..b6cabca8b0 100644 --- a/server/middlewares/error-reporter.js +++ b/server/middlewares/error-reporter.js @@ -1,15 +1,30 @@ import debug from 'debug'; - +import Rollbar from 'rollbar'; import { isHandledError, unwrapHandledError } from '../utils/create-handled-error.js'; +const { ROLLBAR_APP_ID } = process.env; + +const rollbar = new Rollbar(ROLLBAR_APP_ID); const log = debug('fcc:middlewares:error-reporter'); +const errTemplate = ({message, ...restError}, req) => ` +Time: ${new Date(Date.now()).toISOString()} +Error: ${message} +Is authenticated user: ${!!req.user} +Route: ${JSON.stringify(req.route, null, 2)} + +${JSON.stringify(restError, null, 2)} + +`; + export default function errrorReporter() { if (process.env.NODE_ENV !== 'production' && process.env.ERROR_REPORTER) { return (err, req, res, next) => { + console.error(errTemplate(err, req)); + if (isHandledError(err)) { // log out user messages in development const handled = unwrapHandledError(err); @@ -18,5 +33,9 @@ export default function errrorReporter() { next(err); }; } - return (err, req, res, next) => next(err); + return (err, req, res, next) => { + console.error(errTemplate(err, req)); + rollbar.error(err.message, err); + next(err); + }; }