diff --git a/api-server/server/index.js b/api-server/server/index.js index c53e57a213..633fd2a5a6 100755 --- a/api-server/server/index.js +++ b/api-server/server/index.js @@ -7,14 +7,26 @@ const loopback = require('loopback'); const boot = require('loopback-boot'); const expressState = require('express-state'); const createDebugger = require('debug'); +const Sentry = require('@sentry/node'); +const { sentry } = require('../../config/secrets'); const { setupPassport } = require('./component-passport'); const log = createDebugger('fcc:server'); + // force logger to always output // this may be brittle log.enabled = true; +if (sentry.dns === 'dsn_from_sentry_dashboard') { + log('Sentry reporting disabled unless DSN is provided.'); +} else { + Sentry.init({ + dsn: sentry.dns + }); + log('Sentry initialized'); +} + Rx.config.longStackSupport = process.env.NODE_DEBUG !== 'production'; const app = loopback(); diff --git a/api-server/server/middleware.json b/api-server/server/middleware.json index 6f420826c1..6bc7998f79 100644 --- a/api-server/server/middleware.json +++ b/api-server/server/middleware.json @@ -1,5 +1,6 @@ { "initial:before": { + "./middlewares/sentry-request-handler": {}, "loopback#favicon": { "params": "$!../public/favicon.ico" }, @@ -59,7 +60,7 @@ }, "files": {}, "final:after": { - "./middlewares/error-reporter": {}, + "./middlewares/sentry-error-handler": {}, "./middlewares/error-handlers": {}, "strong-error-handler": { "params": { diff --git a/api-server/server/middlewares/sentry-error-handler.js b/api-server/server/middlewares/sentry-error-handler.js new file mode 100644 index 0000000000..8f9fc0a02a --- /dev/null +++ b/api-server/server/middlewares/sentry-error-handler.js @@ -0,0 +1,19 @@ +import { Handlers, captureException } from '@sentry/node'; +import { sentry } from '../../../config/secrets'; + +export function reportError(err) { + return sentry.dns === 'dsn_from_sentry_dashboard' + ? console.error(err) + : captureException(err); +} + +export default function sentryErrorHandler() { + return sentry.dns === 'dsn_from_sentry_dashboard' + ? (req, res, next) => next() + : Handlers.errorHandler({ + shouldHandleError(error) { + // NOTE: 400 is too low, this is just for debugging + return !error.status || error.status >= 400; + } + }); +} diff --git a/api-server/server/middlewares/sentry-request-handler.js b/api-server/server/middlewares/sentry-request-handler.js new file mode 100644 index 0000000000..e9bd7551bf --- /dev/null +++ b/api-server/server/middlewares/sentry-request-handler.js @@ -0,0 +1,8 @@ +import { Handlers } from '@sentry/node'; +import { sentry } from '../../../config/secrets'; + +export default function sentryRequestHandler() { + return sentry.dns === 'dsn_from_sentry_dashboard' + ? (req, res, next) => next() + : Handlers.requestHandler(); +} diff --git a/api-server/server/models/donation.js b/api-server/server/models/donation.js index 5f43c8067e..7fc30c3a5f 100644 --- a/api-server/server/models/donation.js +++ b/api-server/server/models/donation.js @@ -1,7 +1,7 @@ import { Observable } from 'rx'; import debug from 'debug'; -import { reportError } from '../middlewares/error-reporter'; +import { reportError } from '../middlewares/sentry-error-handler.js'; import InMemoryCache from '../utils/in-memory-cache'; const log = debug('fcc:boot:donate'); diff --git a/config/secrets.js b/config/secrets.js index 890dd6b4f5..bd28a5d1f8 100644 --- a/config/secrets.js +++ b/config/secrets.js @@ -27,8 +27,7 @@ const { TWITTER_TOKEN, TWITTER_TOKEN_SECRET, - ROLLBAR_APP_ID, - ROLLBAR_CLIENT_ID, + SENTRY_DSN, STRIPE_PUBLIC_KEY, STRIPE_SECRET_KEY, @@ -95,9 +94,8 @@ module.exports = { passReqToCallback: true }, - rollbar: { - appId: ROLLBAR_APP_ID, - clientId: ROLLBAR_CLIENT_ID + sentry: { + dns: SENTRY_DSN }, stripe: { diff --git a/sample.env b/sample.env index b25f854adc..458a5e5982 100644 --- a/sample.env +++ b/sample.env @@ -53,3 +53,5 @@ TEST_CHALLENGES_FOR_LANGS=english DOCKER_HOST_LOCATION=localhost GHOST_CLIENT_KEY=123abc + +SENTRY_DSN=dsn_from_sentry_dashboard