Sentry handler for nightingale
npm install --save nightingale nightingale-sentry
import {
init as sentryInit,
addBreadcrumb,
captureException,
captureMessage,
} from "@sentry/node";
import { configure, Level, listenUnhandledErrors } from "nightingale";
import { SentryHandler } from "nightingale-sentry";
listenUnhandledErrors();
sentryInit({
dsn: process.env.NODE_ENV === "production" ? "__DSN__" : undefined,
// ...
});
configure([
{
handlers: [
new SentryHandler(
{ addBreadcrumb, captureException, captureMessage },
Level.ERROR,
{
// shouldSendAsException: (record) => record.metadata?.error !== undefined && record.metadata.unhandled !== true,
// shouldSendAsBreadcrumb: (record) => false,
// getUser: ({ context }) => context.user && { id: context.user.id },
// getTags: ({ context }) => context.tags,
},
),
],
},
]);
import {
init as sentryInit,
addBreadcrumb,
captureException,
captureMessage,
} from "@sentry/browser";
import { addConfig, Level } from "nightingale-app";
import SentryHandler from "nightingale-sentry";
sentryInit({
dsn: process.env.NODE_ENV === "production" ? "__DSN__" : undefined,
// ...
});
addConfig(
{
handlers: [
new SentryHandler(
{ addBreadcrumb, captureException, captureMessage },
Level.ERROR,
),
],
},
true,
);
import {
init as sentryInit,
addBreadcrumb,
captureException,
captureMessage,
} from "@sentry/browser";
import { configure, Level } from "nightingale";
import { SentryHandler } from "nightingale-sentry";
sentryInit({
dsn: process.env.NODE_ENV === "production" ? "__DSN__" : undefined,
// ...
});
configure([
{
handlers: [
new SentryHandler(
{ addBreadcrumb, captureException, captureMessage },
Level.INFO,
{
shouldSendAsException: (record) =>
record.level >= Level.ERROR &&
record.metadata?.error !== undefined &&
record.metadata.unhandled !== true,
shouldSendAsBreadcrumb: (record) =>
record.metadata?.breadcrumb ? true : false,
getBreadcrumbCategory: (record) =>
record.metadata?.breadcrumbCategory,
getBreadcrumbType: (record) => record.metadata?.breadcrumbType,
},
),
],
},
]);
At the time of this writing, sentry-expo is still in version 5.28.0
and if you use typescript you might have issues with types due to duplicated version (if you don't use typescript, you might still have duplication so it might still be a good idea to follow this)
I'll use yarn
here, but npm works similarly (if you use npm, please open a PR to complete this !)
Note that nightingale has a dependency to @sentry/node
for compatibility reasons.
First, you can check the versions installed:
yarn why @sentry/types
yarn why @sentry/core
yarn why @sentry/node
You should see something like this:
yarn why v1.22.5
[1/4] Why do we have the module "@sentry/types"...?
[2/4] Initialising dependency graph...
[3/4] Finding dependency...
[4/4] Calculating file sizes...
=> Found "@sentry/[email protected]"
info Has been hoisted to "@sentry/types"
info Reasons this module exists
- Hoisted from "@sentry#core#@sentry#types"
- Hoisted from "@sentry#hub#@sentry#types"
- Hoisted from "@sentry#minimal#@sentry#types"
- Hoisted from "@sentry#tracing#@sentry#types"
- Hoisted from "@sentry#utils#@sentry#types"
- Hoisted from "@sentry#node#@sentry#types"
- Hoisted from "sentry-expo#@sentry#types"
- Hoisted from "sentry-expo#@sentry#browser#@sentry#types"
- Hoisted from "sentry-expo#@sentry#integrations#@sentry#types"
- Hoisted from "sentry-expo#@sentry#react-native#@sentry#types"
- Hoisted from "sentry-expo#@sentry#react-native#@sentry#react#@sentry#types"
info Disk size without dependencies: "1.11MB"
info Disk size with unique dependencies: "1.11MB"
info Disk size with transitive dependencies: "1.11MB"
info Number of shared dependencies: 0
=> Found "nightingale-sentry#@sentry/[email protected]"
info Reasons this module exists
- "nightingale-sentry" depends on it
- Hoisted from "nightingale-sentry#@sentry#core#@sentry#types"
- Hoisted from "nightingale-sentry#@sentry#node#@sentry#types"
- Hoisted from "nightingale-sentry#@sentry#core#@sentry#hub#@sentry#types"
- Hoisted from "nightingale-sentry#@sentry#core#@sentry#minimal#@sentry#types"
- Hoisted from "nightingale-sentry#@sentry#node#@sentry#tracing#@sentry#types"
- Hoisted from "nightingale-sentry#@sentry#core#@sentry#utils#@sentry#types"
info Disk size without dependencies: "1.19MB"
info Disk size with unique dependencies: "1.19MB"
info Disk size with transitive dependencies: "1.19MB"
info Number of shared dependencies: 0
If you see only one version, everything is good ! You can skip this.
Now add these in you package's devDependencies:
"@sentry/core": "5.28.0",
"@sentry/node": "5.28.0",
"@sentry/types": "5.28.0",
If you use yarn 1, also add yarn-deduplicate
, then run:
yarn; yarn yarn-deduplicate -s fewer ; yarn yarn-deduplicate ; yarn
If you use yarn berry, you have to manually change the yarn.lock to downgrade the 3 sentry dependencies as yarn dedupe
currently only supports the highest
strategy.
You should now have:
yarn why v1.22.5
[1/4] Why do we have the module "@sentry/types"...?
[2/4] Initialising dependency graph...
[3/4] Finding dependency...
[4/4] Calculating file sizes...
=> Found "@sentry/[email protected]"
info Has been hoisted to "@sentry/types"
info Reasons this module exists
- Specified in "devDependencies"
- Hoisted from "@sentry#core#@sentry#types"
- Hoisted from "@sentry#node#@sentry#types"
- Hoisted from "nightingale-sentry#@sentry#types"
- Hoisted from "sentry-expo#@sentry#types"
- Hoisted from "sentry-expo#@sentry#browser#@sentry#types"
- Hoisted from "@sentry#core#@sentry#hub#@sentry#types"
- Hoisted from "sentry-expo#@sentry#integrations#@sentry#types"
- Hoisted from "@sentry#core#@sentry#minimal#@sentry#types"
- Hoisted from "sentry-expo#@sentry#react-native#@sentry#types"
- Hoisted from "@sentry#node#@sentry#tracing#@sentry#types"
- Hoisted from "@sentry#core#@sentry#utils#@sentry#types"
- Hoisted from "sentry-expo#@sentry#react-native#@sentry#react#@sentry#types"
info Disk size without dependencies: "1.11MB"
info Disk size with unique dependencies: "1.11MB"
info Disk size with transitive dependencies: "1.11MB"
info Number of shared dependencies: 0
Done in 0.78s.