mirror of
https://github.com/jakejarvis/jarv.is.git
synced 2025-10-28 15:05:47 -04:00
extract sentry config/init
This commit is contained in:
@@ -14,22 +14,26 @@ const HitCounter = ({ slug, className }: HitCounterProps) => {
|
|||||||
revalidateOnFocus: false,
|
revalidateOnFocus: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
// show spinning loading indicator if data isn't fetched yet
|
try {
|
||||||
if (!data) {
|
// show spinning loading indicator if data isn't fetched yet
|
||||||
return <Loading boxes={3} width={20} />;
|
if (!data) {
|
||||||
}
|
return <Loading boxes={3} width={20} />;
|
||||||
|
}
|
||||||
|
|
||||||
// fail secretly
|
// fail secretly
|
||||||
if (error) {
|
if (error) {
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// we have data!
|
// we have data!
|
||||||
return (
|
return (
|
||||||
<span title={`${data.hits.toLocaleString("en-US")} ${data.hits === 1 ? "view" : "views"}`} className={className}>
|
<span title={`${data.hits.toLocaleString("en-US")} ${data.hits === 1 ? "view" : "views"}`} className={className}>
|
||||||
{data.hits.toLocaleString("en-US")}
|
{data.hits.toLocaleString("en-US")}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
|
} catch (error) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default HitCounter;
|
export default HitCounter;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const VNC = ({ server }: VNCProps) => {
|
|||||||
terminalRef.current.textContent = `${message}${
|
terminalRef.current.textContent = `${message}${
|
||||||
anyKey ? "\n\nPress the Any key or refresh the page to continue." : ""
|
anyKey ? "\n\nPress the Any key or refresh the page to continue." : ""
|
||||||
}`;
|
}`;
|
||||||
} catch (e) {} // eslint-disable-line no-empty
|
} catch (error) {} // eslint-disable-line no-empty
|
||||||
};
|
};
|
||||||
|
|
||||||
// hides the console and show the screen when VM connects
|
// hides the console and show the screen when VM connects
|
||||||
@@ -44,7 +44,7 @@ const VNC = ({ server }: VNCProps) => {
|
|||||||
const disconnectVM = () => {
|
const disconnectVM = () => {
|
||||||
try {
|
try {
|
||||||
rfbRef.current.disconnect();
|
rfbRef.current.disconnect();
|
||||||
} catch (e) {} // eslint-disable-line no-empty
|
} catch (error) {} // eslint-disable-line no-empty
|
||||||
};
|
};
|
||||||
|
|
||||||
// prepare for possible navigation away from this page, and disconnect if/when it happens
|
// prepare for possible navigation away from this page, and disconnect if/when it happens
|
||||||
|
|||||||
31
lib/sentry.ts
Normal file
31
lib/sentry.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import * as Sentry from "@sentry/node";
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
import * as Tracing from "@sentry/tracing";
|
||||||
|
|
||||||
|
// https://docs.sentry.io/platforms/node/configuration/options/
|
||||||
|
Sentry.init({
|
||||||
|
dsn: process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN || "",
|
||||||
|
environment: process.env.NODE_ENV || process.env.VERCEL_ENV || process.env.NEXT_PUBLIC_VERCEL_ENV || "",
|
||||||
|
tracesSampleRate: 1.0,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const logServerError = async (error: string | Error) => {
|
||||||
|
try {
|
||||||
|
// log error to sentry
|
||||||
|
Sentry.captureException(error);
|
||||||
|
// give it 2 seconds to finish sending:
|
||||||
|
// https://docs.sentry.io/platforms/node/configuration/draining/
|
||||||
|
await Sentry.flush(2000);
|
||||||
|
} catch (sentryError) {
|
||||||
|
// cue inception bong
|
||||||
|
console.error("Encountered an error logging an error... We are doomed.", sentryError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// also log the error normally to the Vercel console; will get picked up by log drain
|
||||||
|
console.error(error);
|
||||||
|
|
||||||
|
// we really don't want to return *any* error from logging an error, so just keep it on the dl
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Sentry;
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
"@octokit/graphql": "^4.8.0",
|
"@octokit/graphql": "^4.8.0",
|
||||||
"@primer/octicons": "^16.3.1",
|
"@primer/octicons": "^16.3.1",
|
||||||
"@sentry/node": "^6.17.7",
|
"@sentry/node": "^6.17.7",
|
||||||
|
"@sentry/tracing": "^6.17.7",
|
||||||
"classnames": "^2.3.1",
|
"classnames": "^2.3.1",
|
||||||
"copy-to-clipboard": "^3.3.1",
|
"copy-to-clipboard": "^3.3.1",
|
||||||
"critters": "^0.0.16",
|
"critters": "^0.0.16",
|
||||||
@@ -91,7 +92,7 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "^5.11.0",
|
"@typescript-eslint/eslint-plugin": "^5.11.0",
|
||||||
"@typescript-eslint/parser": "^5.11.0",
|
"@typescript-eslint/parser": "^5.11.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"eslint": "~8.8.0",
|
"eslint": "~8.9.0",
|
||||||
"eslint-config-next": "12.0.10",
|
"eslint-config-next": "12.0.10",
|
||||||
"eslint-config-prettier": "~8.3.0",
|
"eslint-config-prettier": "~8.3.0",
|
||||||
"eslint-plugin-import": "~2.25.4",
|
"eslint-plugin-import": "~2.25.4",
|
||||||
|
|||||||
@@ -1,13 +1,8 @@
|
|||||||
import * as Sentry from "@sentry/node";
|
|
||||||
import fetch from "node-fetch";
|
import fetch from "node-fetch";
|
||||||
import queryString from "query-string";
|
import queryString from "query-string";
|
||||||
|
import { logServerError } from "../../lib/sentry";
|
||||||
import type { NextApiRequest, NextApiResponse } from "next";
|
import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
|
|
||||||
Sentry.init({
|
|
||||||
dsn: process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN || "",
|
|
||||||
environment: process.env.NODE_ENV || process.env.VERCEL_ENV || process.env.NEXT_PUBLIC_VERCEL_ENV || "",
|
|
||||||
});
|
|
||||||
|
|
||||||
// fallback to dummy secret for testing: https://docs.hcaptcha.com/#integration-testing-test-keys
|
// fallback to dummy secret for testing: https://docs.hcaptcha.com/#integration-testing-test-keys
|
||||||
const HCAPTCHA_SITE_KEY =
|
const HCAPTCHA_SITE_KEY =
|
||||||
process.env.HCAPTCHA_SITE_KEY || process.env.NEXT_PUBLIC_HCAPTCHA_SITE_KEY || "10000000-ffff-ffff-ffff-000000000001";
|
process.env.HCAPTCHA_SITE_KEY || process.env.NEXT_PUBLIC_HCAPTCHA_SITE_KEY || "10000000-ffff-ffff-ffff-000000000001";
|
||||||
@@ -56,15 +51,12 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|||||||
// success! let the client know
|
// success! let the client know
|
||||||
return res.status(200).json({ success: true });
|
return res.status(200).json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
// extract just the error message to send back to client
|
||||||
|
|
||||||
const message = error instanceof Error ? error.message : "UNKNOWN_EXCEPTION";
|
const message = error instanceof Error ? error.message : "UNKNOWN_EXCEPTION";
|
||||||
|
|
||||||
// don't log PEBCAK errors to sentry
|
// log errors (except PEBCAK) to console and sentry
|
||||||
if (!message.startsWith("USER_")) {
|
if (!message.startsWith("USER_")) {
|
||||||
// log error to sentry, give it 2 seconds to finish sending
|
await logServerError(error);
|
||||||
Sentry.captureException(error);
|
|
||||||
await Sentry.flush(2000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 500 Internal Server Error
|
// 500 Internal Server Error
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
import * as Sentry from "@sentry/node";
|
|
||||||
import pRetry from "p-retry";
|
import pRetry from "p-retry";
|
||||||
import faunadb from "faunadb";
|
import faunadb from "faunadb";
|
||||||
import { getAllNotes } from "../../lib/parse-notes";
|
import { getAllNotes } from "../../lib/parse-notes";
|
||||||
|
import { logServerError } from "../../lib/sentry";
|
||||||
import type { NextApiRequest, NextApiResponse } from "next";
|
import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
|
|
||||||
Sentry.init({
|
|
||||||
dsn: process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN || "",
|
|
||||||
environment: process.env.NODE_ENV || process.env.VERCEL_ENV || process.env.NEXT_PUBLIC_VERCEL_ENV || "",
|
|
||||||
});
|
|
||||||
|
|
||||||
type PageStats = {
|
type PageStats = {
|
||||||
slug: string;
|
slug: string;
|
||||||
hits: number;
|
hits: number;
|
||||||
@@ -57,14 +52,12 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
|
|||||||
return res.status(200).json(siteStats);
|
return res.status(200).json(siteStats);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
// extract just the error message to send back to client
|
||||||
|
|
||||||
// log error to sentry, give it 2 seconds to finish sending
|
|
||||||
Sentry.captureException(error);
|
|
||||||
await Sentry.flush(2000);
|
|
||||||
|
|
||||||
const message = error instanceof Error ? error.message : "Unknown error.";
|
const message = error instanceof Error ? error.message : "Unknown error.";
|
||||||
|
|
||||||
|
// log full error to console and sentry
|
||||||
|
await logServerError(error);
|
||||||
|
|
||||||
// 500 Internal Server Error
|
// 500 Internal Server Error
|
||||||
return res.status(500).json({ success: false, message });
|
return res.status(500).json({ success: false, message });
|
||||||
}
|
}
|
||||||
|
|||||||
54
yarn.lock
54
yarn.lock
@@ -1035,14 +1035,14 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@corex/deepmerge/-/deepmerge-2.6.148.tgz#8fa825d53ffd1cbcafce1b6a830eefd3dcc09dd5"
|
resolved "https://registry.yarnpkg.com/@corex/deepmerge/-/deepmerge-2.6.148.tgz#8fa825d53ffd1cbcafce1b6a830eefd3dcc09dd5"
|
||||||
integrity sha512-6QMz0/2h5C3ua51iAnXMPWFbb1QOU1UvSM4bKBw5mzdT+WtLgjbETBBIQZ+Sh9WvEcGwlAt/DEdRpIC3XlDBMA==
|
integrity sha512-6QMz0/2h5C3ua51iAnXMPWFbb1QOU1UvSM4bKBw5mzdT+WtLgjbETBBIQZ+Sh9WvEcGwlAt/DEdRpIC3XlDBMA==
|
||||||
|
|
||||||
"@eslint/eslintrc@^1.0.5":
|
"@eslint/eslintrc@^1.1.0":
|
||||||
version "1.0.5"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318"
|
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.1.0.tgz#583d12dbec5d4f22f333f9669f7d0b7c7815b4d3"
|
||||||
integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==
|
integrity sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv "^6.12.4"
|
ajv "^6.12.4"
|
||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
espree "^9.2.0"
|
espree "^9.3.1"
|
||||||
globals "^13.9.0"
|
globals "^13.9.0"
|
||||||
ignore "^4.0.6"
|
ignore "^4.0.6"
|
||||||
import-fresh "^3.2.1"
|
import-fresh "^3.2.1"
|
||||||
@@ -1359,7 +1359,7 @@
|
|||||||
lru_map "^0.3.3"
|
lru_map "^0.3.3"
|
||||||
tslib "^1.9.3"
|
tslib "^1.9.3"
|
||||||
|
|
||||||
"@sentry/tracing@6.17.7":
|
"@sentry/tracing@6.17.7", "@sentry/tracing@^6.17.7":
|
||||||
version "6.17.7"
|
version "6.17.7"
|
||||||
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.7.tgz#f4536683b29bb3ac7ddda5ca49494731cec6b619"
|
resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.7.tgz#f4536683b29bb3ac7ddda5ca49494731cec6b619"
|
||||||
integrity sha512-QzIDHOjjdi/0LTdrK2LTC27YEOODI473KD8KmMJ+r9PmjDeIjNzz4hJlPwQSnXR3Mu/8foxGJGXsAt3LNmKzlQ==
|
integrity sha512-QzIDHOjjdi/0LTdrK2LTC27YEOODI473KD8KmMJ+r9PmjDeIjNzz4hJlPwQSnXR3Mu/8foxGJGXsAt3LNmKzlQ==
|
||||||
@@ -2801,10 +2801,10 @@ eslint-scope@^5.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
|
|
||||||
eslint-scope@^7.1.0:
|
eslint-scope@^7.1.1:
|
||||||
version "7.1.0"
|
version "7.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153"
|
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
|
||||||
integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==
|
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
|
||||||
dependencies:
|
dependencies:
|
||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^5.2.0"
|
estraverse "^5.2.0"
|
||||||
@@ -2821,17 +2821,17 @@ eslint-visitor-keys@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
|
||||||
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
|
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
|
||||||
|
|
||||||
eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0:
|
eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0:
|
||||||
version "3.2.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
||||||
integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==
|
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
||||||
|
|
||||||
eslint@~8.8.0:
|
eslint@~8.9.0:
|
||||||
version "8.8.0"
|
version "8.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.8.0.tgz#9762b49abad0cb4952539ffdb0a046392e571a2d"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.9.0.tgz#a2a8227a99599adc4342fd9b854cb8d8d6412fdb"
|
||||||
integrity sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==
|
integrity sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint/eslintrc" "^1.0.5"
|
"@eslint/eslintrc" "^1.1.0"
|
||||||
"@humanwhocodes/config-array" "^0.9.2"
|
"@humanwhocodes/config-array" "^0.9.2"
|
||||||
ajv "^6.10.0"
|
ajv "^6.10.0"
|
||||||
chalk "^4.0.0"
|
chalk "^4.0.0"
|
||||||
@@ -2839,10 +2839,10 @@ eslint@~8.8.0:
|
|||||||
debug "^4.3.2"
|
debug "^4.3.2"
|
||||||
doctrine "^3.0.0"
|
doctrine "^3.0.0"
|
||||||
escape-string-regexp "^4.0.0"
|
escape-string-regexp "^4.0.0"
|
||||||
eslint-scope "^7.1.0"
|
eslint-scope "^7.1.1"
|
||||||
eslint-utils "^3.0.0"
|
eslint-utils "^3.0.0"
|
||||||
eslint-visitor-keys "^3.2.0"
|
eslint-visitor-keys "^3.3.0"
|
||||||
espree "^9.3.0"
|
espree "^9.3.1"
|
||||||
esquery "^1.4.0"
|
esquery "^1.4.0"
|
||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
fast-deep-equal "^3.1.3"
|
fast-deep-equal "^3.1.3"
|
||||||
@@ -2867,14 +2867,14 @@ eslint@~8.8.0:
|
|||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
v8-compile-cache "^2.0.3"
|
v8-compile-cache "^2.0.3"
|
||||||
|
|
||||||
espree@^9.2.0, espree@^9.3.0:
|
espree@^9.3.1:
|
||||||
version "9.3.0"
|
version "9.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
|
||||||
integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==
|
integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
acorn "^8.7.0"
|
acorn "^8.7.0"
|
||||||
acorn-jsx "^5.3.1"
|
acorn-jsx "^5.3.1"
|
||||||
eslint-visitor-keys "^3.1.0"
|
eslint-visitor-keys "^3.3.0"
|
||||||
|
|
||||||
esprima@^4.0.0:
|
esprima@^4.0.0:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user