From c1d4f20c09d427cd5cfa728926736b237c48a3b1 Mon Sep 17 00:00:00 2001 From: Rogerio Chaves Date: Wed, 15 Apr 2020 18:26:45 +0200 Subject: [PATCH] Add sentry to log errors --- app/lib/express.js | 26 ++++++++++ app/package-lock.json | 117 ++++++++++++++++++++++++++++++++++++++++++ app/package.json | 3 +- app/views/error.ejs | 7 +++ 4 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 app/views/error.ejs diff --git a/app/lib/express.js b/app/lib/express.js index 91c27e9..0b56886 100644 --- a/app/lib/express.js +++ b/app/lib/express.js @@ -18,6 +18,7 @@ const serveBlobs = require("./serve-blobs"); const cookieParser = require("cookie-parser"); const debug = require("debug")("express"); const fileUpload = require("express-fileupload"); +const Sentry = require("@sentry/node"); let ssbServer; let mode = process.env.MODE || "client"; @@ -51,6 +52,14 @@ let profileUrl = (id, path = "") => { return `/profile/${id}${path}`; }; +const SENTRY_DSN = process.env.SENTRY_DSN; +if (SENTRY_DSN) { + Sentry.init({ + dsn: SENTRY_DSN, + }); + // Sentry request handler must be the first middleware on the app + app.use(Sentry.Handlers.requestHandler()); +} app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.set("view engine", "ejs"); @@ -378,6 +387,13 @@ router.get("/debug", async (req, res) => { res.render("debug", { entries, query }); }); +router.get("/debug-error", (_req, res) => { + const object = {}; + object.isUndefinedAFunction(); + + res.send("should never reach here"); +}); + router.get("/search", async (req, res) => { const query = req.query.query; @@ -394,6 +410,16 @@ router.get("/syncing", (req, res) => { res.json({ syncing }); }); +if (SENTRY_DSN) { + // The error handler must be before any other error middleware and after all controllers + app.use(Sentry.Handlers.errorHandler()); +} + +app.use((error, _req, res, _next) => { + res.statusCode = 500; + res.render("error", { error }); +}); + const expressServer = app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`) ); diff --git a/app/package-lock.json b/app/package-lock.json index 5980e55..6ca351a 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -20,6 +20,99 @@ "sumchecker": "^3.0.1" } }, + "@sentry/apm": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/apm/-/apm-5.15.4.tgz", + "integrity": "sha512-gcW225Jls1ShyBXMWN6zZyuVJwBOIQ63sI+URI2NSFsdpBpdpZ8yennIm+oMlSfb25Nzt9SId7TRSjPhlSbTZQ==", + "requires": { + "@sentry/browser": "5.15.4", + "@sentry/hub": "5.15.4", + "@sentry/minimal": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/browser": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.15.4.tgz", + "integrity": "sha512-l/auT1HtZM3KxjCGQHYO/K51ygnlcuOrM+7Ga8gUUbU9ZXDYw6jRi0+Af9aqXKmdDw1naNxr7OCSy6NBrLWVZw==", + "requires": { + "@sentry/core": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/core": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.15.4.tgz", + "integrity": "sha512-9KP4NM4SqfV5NixpvAymC7Nvp36Zj4dU2fowmxiq7OIbzTxGXDhwuN/t0Uh8xiqlkpkQqSECZ1OjSFXrBldetQ==", + "requires": { + "@sentry/hub": "5.15.4", + "@sentry/minimal": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.15.4.tgz", + "integrity": "sha512-1XJ1SVqadkbUT4zLS0TVIVl99si7oHizLmghR8LMFl5wOkGEgehHSoOydQkIAX2C7sJmaF5TZ47ORBHgkqclUg==", + "requires": { + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.15.4.tgz", + "integrity": "sha512-GL4GZ3drS9ge+wmxkHBAMEwulaE7DMvAEfKQPDAjg2p3MfcCMhAYfuY4jJByAC9rg9OwBGGehz7UmhWMFjE0tw==", + "requires": { + "@sentry/hub": "5.15.4", + "@sentry/types": "5.15.4", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.15.4.tgz", + "integrity": "sha512-OfdhNEvOJZ55ZkCUcVgctjaZkOw7rmLzO5VyDTSgevA4uLsPaTNXSAeK2GSQBXc5J0KdRpNz4sSIyuxOS4Z7Vg==", + "requires": { + "@sentry/apm": "5.15.4", + "@sentry/core": "5.15.4", + "@sentry/hub": "5.15.4", + "@sentry/types": "5.15.4", + "@sentry/utils": "5.15.4", + "cookie": "^0.3.1", + "https-proxy-agent": "^4.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + } + } + }, + "@sentry/types": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.15.4.tgz", + "integrity": "sha512-quPHPpeAuwID48HLPmqBiyXE3xEiZLZ5D3CEbU3c3YuvvAg8qmfOOTI6z4Z3Eedi7flvYpnx3n7N3dXIEz30Eg==" + }, + "@sentry/utils": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.15.4.tgz", + "integrity": "sha512-lO8SLBjrUDGADl0LOkd55R5oL510d/1SaI08/IBHZCxCUwI4TiYo5EPECq8mrj3XGfgCyq9osw33bymRlIDuSQ==", + "requires": { + "@sentry/types": "5.15.4", + "tslib": "^1.9.3" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -79,6 +172,11 @@ "negotiator": "0.6.2" } }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -1457,6 +1555,15 @@ } } }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1944,6 +2051,11 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" + }, "ltgt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", @@ -10404,6 +10516,11 @@ "utf8-byte-length": "^1.0.1" } }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, "tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", diff --git a/app/package.json b/app/package.json index 12f55f0..24b5529 100644 --- a/app/package.json +++ b/app/package.json @@ -14,6 +14,7 @@ "author": "", "license": "ISC", "dependencies": { + "@sentry/node": "^5.15.4", "chokidar": "^3.3.1", "cookie-parser": "^1.4.5", "debug": "^4.1.1", @@ -49,4 +50,4 @@ "devDependencies": { "electron": "^8.2.0" } -} \ No newline at end of file +} diff --git a/app/views/error.ejs b/app/views/error.ejs new file mode 100644 index 0000000..440d3fa --- /dev/null +++ b/app/views/error.ejs @@ -0,0 +1,7 @@ +<%- include('_header') %> + +

Social had an error

+

If you are a developer, this should help:

+
<%- error.stack %>
+ +<%- include('_footer') %> \ No newline at end of file