Add sentry to log errors

This commit is contained in:
Rogerio Chaves 2020-04-15 18:26:45 +02:00
parent 9a054f4c5b
commit c1d4f20c09
No known key found for this signature in database
GPG Key ID: E6AF5440509B1D94
4 changed files with 152 additions and 1 deletions

View File

@ -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}`)
);

117
app/package-lock.json generated
View File

@ -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",

View File

@ -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"
}
}
}

7
app/views/error.ejs Normal file
View File

@ -0,0 +1,7 @@
<%- include('_header') %>
<h1 style="margin-top: 50px">Social had an error</h1>
<p style="margin: 30px 0">If you are a developer, this should help:</p>
<pre style="white-space: pre-wrap"><%- error.stack %></pre>
<%- include('_footer') %>