diff --git a/package.json b/package.json
index 719159698..267e78f5f 100644
--- a/package.json
+++ b/package.json
@@ -28,8 +28,7 @@
"@fortawesome/react-fontawesome": "0.2.0",
"@juggle/resize-observer": "3.4.0",
"@microsoft/signalr": "6.0.21",
- "@sentry/browser": "7.51.2",
- "@sentry/integrations": "7.51.2",
+ "@sentry/browser": "7.100.0",
"@types/node": "18.16.8",
"@types/react": "18.2.6",
"@types/react-dom": "18.2.4",
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 370dfce70..ef0944ea9 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -98,6 +98,35 @@
$(MSBuildProjectName.Replace('Sonarr','NzbDrone'))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+ true
+
+ true
+
+
diff --git a/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs b/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs
index 7392c3b85..b60fe2e54 100644
--- a/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs
+++ b/src/NzbDrone.Common.Test/InstrumentationTests/SentryTargetFixture.cs
@@ -4,6 +4,7 @@
using FluentAssertions;
using NLog;
using NUnit.Framework;
+using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Instrumentation.Sentry;
using NzbDrone.Test.Common;
@@ -26,7 +27,7 @@ public class SentryTargetFixture : TestBase
[SetUp]
public void Setup()
{
- _subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111");
+ _subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111", Mocker.GetMock().Object);
}
private LogEventInfo GivenLogEvent(LogLevel level, Exception ex, string message)
diff --git a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs
index f654de585..750ad659c 100644
--- a/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs
+++ b/src/NzbDrone.Common/Instrumentation/NzbDroneLogger.cs
@@ -39,7 +39,7 @@ public static void Register(IStartupContext startupContext, bool updateApp, bool
RegisterDebugger();
}
- RegisterSentry(updateApp);
+ RegisterSentry(updateApp, appFolderInfo);
if (updateApp)
{
@@ -60,7 +60,7 @@ public static void Register(IStartupContext startupContext, bool updateApp, bool
LogManager.ReconfigExistingLoggers();
}
- private static void RegisterSentry(bool updateClient)
+ private static void RegisterSentry(bool updateClient, IAppFolderInfo appFolderInfo)
{
string dsn;
@@ -80,7 +80,7 @@ private static void RegisterSentry(bool updateClient)
Target target;
try
{
- target = new SentryTarget(dsn)
+ target = new SentryTarget(dsn, appFolderInfo)
{
Name = "sentryTarget",
Layout = "${message}"
diff --git a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs
index 886063f30..0c8ed2f78 100644
--- a/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs
+++ b/src/NzbDrone.Common/Instrumentation/Sentry/SentryTarget.cs
@@ -9,6 +9,7 @@
using NLog.Common;
using NLog.Targets;
using NzbDrone.Common.EnvironmentInfo;
+using NzbDrone.Common.Extensions;
using Sentry;
namespace NzbDrone.Common.Instrumentation.Sentry
@@ -96,7 +97,7 @@ public class SentryTarget : TargetWithLayout
public bool FilterEvents { get; set; }
public bool SentryEnabled { get; set; }
- public SentryTarget(string dsn)
+ public SentryTarget(string dsn, IAppFolderInfo appFolderInfo)
{
_sdk = SentrySdk.Init(o =>
{
@@ -104,9 +105,33 @@ public SentryTarget(string dsn)
o.AttachStacktrace = true;
o.MaxBreadcrumbs = 200;
o.Release = BuildInfo.Release;
- o.BeforeSend = x => SentryCleanser.CleanseEvent(x);
- o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x);
+ o.SetBeforeSend(x => SentryCleanser.CleanseEvent(x));
+ o.SetBeforeBreadcrumb(x => SentryCleanser.CleanseBreadcrumb(x));
o.Environment = BuildInfo.Branch;
+
+ // Crash free run statistics (sends a ping for healthy and for crashes sessions)
+ o.AutoSessionTracking = true;
+
+ // Caches files in the event device is offline
+ // Sentry creates a 'sentry' sub directory, no need to concat here
+ o.CacheDirectoryPath = appFolderInfo.GetAppDataPath();
+
+ // default environment is production
+ if (!RuntimeInfo.IsProduction)
+ {
+ if (RuntimeInfo.IsDevelopment)
+ {
+ o.Environment = "development";
+ }
+ else if (RuntimeInfo.IsTesting)
+ {
+ o.Environment = "testing";
+ }
+ else
+ {
+ o.Environment = "other";
+ }
+ }
});
InitializeScope();
@@ -125,7 +150,7 @@ public void InitializeScope()
{
SentrySdk.ConfigureScope(scope =>
{
- scope.User = new User
+ scope.User = new SentryUser
{
Id = HashUtil.AnonymousToken()
};
@@ -285,13 +310,21 @@ protected override void Write(LogEventInfo logEvent)
}
}
+ var level = LoggingLevelMap[logEvent.Level];
var sentryEvent = new SentryEvent(logEvent.Exception)
{
- Level = LoggingLevelMap[logEvent.Level],
+ Level = level,
Logger = logEvent.LoggerName,
Message = logEvent.FormattedMessage
};
+ if (level is SentryLevel.Fatal && logEvent.Exception is not null)
+ {
+ // Usages of 'fatal' here indicates the process will crash. In Sentry this is represented with
+ // the 'unhandled' exception flag
+ logEvent.Exception.SetSentryMechanism("Logger.Fatal", "Logger.Fatal was called", false);
+ }
+
sentryEvent.SetExtras(extras);
sentryEvent.SetFingerprint(fingerPrint);
diff --git a/src/NzbDrone.Common/Sonarr.Common.csproj b/src/NzbDrone.Common/Sonarr.Common.csproj
index 1a63fd21d..831798a2e 100644
--- a/src/NzbDrone.Common/Sonarr.Common.csproj
+++ b/src/NzbDrone.Common/Sonarr.Common.csproj
@@ -11,7 +11,7 @@
-
+
diff --git a/yarn.lock b/yarn.lock
index 3f761abd6..fe5804ff8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1261,68 +1261,76 @@
resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a"
integrity sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==
-"@sentry-internal/tracing@7.51.2":
- version "7.51.2"
- resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.51.2.tgz#17833047646426ca71445327018ffcb33506a699"
- integrity sha512-OBNZn7C4CyocmlSMUPfkY9ORgab346vTHu5kX35PgW5XR51VD2nO5iJCFbyFcsmmRWyCJcZzwMNARouc2V4V8A==
+"@sentry-internal/feedback@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.100.0.tgz#38d8d4cb8ac3e6e24d91b13878bd6208a55bcab3"
+ integrity sha512-SMW2QhNKOuSjw8oPtvryDlJjiwrNyAKljbgtMk057os/fd8QMp38Yt1ImqLCM4B2rTQZ6REJ6hRGRTRcfqoG+w==
dependencies:
- "@sentry/core" "7.51.2"
- "@sentry/types" "7.51.2"
- "@sentry/utils" "7.51.2"
- tslib "^1.9.3"
+ "@sentry/core" "7.100.0"
+ "@sentry/types" "7.100.0"
+ "@sentry/utils" "7.100.0"
-"@sentry/browser@7.51.2":
- version "7.51.2"
- resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.51.2.tgz#c01758a54c613be45df58ab503805737256f51a4"
- integrity sha512-FQFEaTFbvYHPQE2emFjNoGSy+jXplwzoM/XEUBRjrGo62lf8BhMvWnPeG3H3UWPgrWA1mq0amvHRwXUkwofk0g==
+"@sentry-internal/replay-canvas@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.100.0.tgz#b462346832631ed5a9446686419113ff331bd984"
+ integrity sha512-DePinj5IgNiC4RZv0yX0DLccMZebfFdKl3zHwDeLBeZqtMz9VrPzchv57IWP+5MI1+iuOn+WOg4oTNBUG6hFRw==
dependencies:
- "@sentry-internal/tracing" "7.51.2"
- "@sentry/core" "7.51.2"
- "@sentry/replay" "7.51.2"
- "@sentry/types" "7.51.2"
- "@sentry/utils" "7.51.2"
- tslib "^1.9.3"
+ "@sentry/core" "7.100.0"
+ "@sentry/replay" "7.100.0"
+ "@sentry/types" "7.100.0"
+ "@sentry/utils" "7.100.0"
-"@sentry/core@7.51.2":
- version "7.51.2"
- resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.51.2.tgz#f2c938de334f9bf26f4416079168275832423964"
- integrity sha512-p8ZiSBxpKe+rkXDMEcgmdoyIHM/1bhpINLZUFPiFH8vzomEr7sgnwRhyrU8y/ADnkPeNg/2YF3QpDpk0OgZJUA==
+"@sentry-internal/tracing@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.100.0.tgz#01f0925a287a6e5d0becd731ab361cabbd27c007"
+ integrity sha512-qf4W1STXky9WOQYoPSw2AmCBDK4FzvAyq5yeD2sLU7OCUEfbRUcN0lQljUvmWRKv/jTIAyeU5icDLJPZuR50nA==
dependencies:
- "@sentry/types" "7.51.2"
- "@sentry/utils" "7.51.2"
- tslib "^1.9.3"
+ "@sentry/core" "7.100.0"
+ "@sentry/types" "7.100.0"
+ "@sentry/utils" "7.100.0"
-"@sentry/integrations@7.51.2":
- version "7.51.2"
- resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.51.2.tgz#fce58b9ced601c7f93344b508c67c69a9c883f3d"
- integrity sha512-ZnSptbuDQOoQ13mFX9vvLDfXlbMGjenW2fMIssi9+08B7fD6qxmetkYnWmBK+oEipjoGA//0240Fj8FUvZr0Qg==
+"@sentry/browser@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.100.0.tgz#adf57f660baa6190a7e1709605f73b94818ee04b"
+ integrity sha512-XpM0jEVe6DJWXjMSOjtJxsSNR/XnJKrlcuyoI4Re3qLG+noEF5QLc0r3VJkySXPRFnmdW05sLswQ6a/n9Sijmg==
dependencies:
- "@sentry/types" "7.51.2"
- "@sentry/utils" "7.51.2"
- localforage "^1.8.1"
- tslib "^1.9.3"
+ "@sentry-internal/feedback" "7.100.0"
+ "@sentry-internal/replay-canvas" "7.100.0"
+ "@sentry-internal/tracing" "7.100.0"
+ "@sentry/core" "7.100.0"
+ "@sentry/replay" "7.100.0"
+ "@sentry/types" "7.100.0"
+ "@sentry/utils" "7.100.0"
-"@sentry/replay@7.51.2":
- version "7.51.2"
- resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.51.2.tgz#1f54e92b472ab87dfdb4e8cd6b8c8252600fe7b0"
- integrity sha512-W8YnSxkK9LTUXDaYciM7Hn87u57AX9qvH8jGcxZZnvpKqHlDXOpSV8LRtBkARsTwgLgswROImSifY0ic0lyCWg==
+"@sentry/core@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.100.0.tgz#5b28c7b3e41e45e4d50e3bdea5d35434fd78e86b"
+ integrity sha512-eWRPuP0Zdj4a2F7SybqNjf13LGOVgGwvW6sojweQp9oxGAfCPp/EMDGBhlpYbMJeLbzmqzJ4ZFHIedaiEC+7kg==
dependencies:
- "@sentry/core" "7.51.2"
- "@sentry/types" "7.51.2"
- "@sentry/utils" "7.51.2"
+ "@sentry/types" "7.100.0"
+ "@sentry/utils" "7.100.0"
-"@sentry/types@7.51.2":
- version "7.51.2"
- resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.51.2.tgz#cb742f374d9549195f62c462c915adeafed31d65"
- integrity sha512-/hLnZVrcK7G5BQoD/60u9Qak8c9AvwV8za8TtYPJDUeW59GrqnqOkFji7RVhI7oH1OX4iBxV+9pAKzfYE6A6SA==
-
-"@sentry/utils@7.51.2":
- version "7.51.2"
- resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.51.2.tgz#2a52ac2cfb00ffd128248981279c0a561b39eccb"
- integrity sha512-EcjBU7qG4IG+DpIPvdgIBcdIofROMawKoRUNKraeKzH/waEYH9DzCaqp/mzc5/rPBhpDB4BShX9xDDSeH+8c0A==
+"@sentry/replay@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.100.0.tgz#4f2e35155626ab286692ade3e31da282c73bd402"
+ integrity sha512-6Yo56J+x+eedaMXri8pPlFxXOofnSXVdsUuFj+kJ7lC/qHrwIbgC5g1ONEK/WlYwpVH4gA0aNnCa5AOkMu+ZTg==
dependencies:
- "@sentry/types" "7.51.2"
- tslib "^1.9.3"
+ "@sentry-internal/tracing" "7.100.0"
+ "@sentry/core" "7.100.0"
+ "@sentry/types" "7.100.0"
+ "@sentry/utils" "7.100.0"
+
+"@sentry/types@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.100.0.tgz#a16f60d78613bd9810298e9e8d80134be58b24f8"
+ integrity sha512-c+RHwZwpKeBk7h8sUX4nQcelxBz8ViCojifnbEe3tcn8O15HOLvZqRKgLLOiff3MoErxiv4oxs0sPbEFRm/IvA==
+
+"@sentry/utils@7.100.0":
+ version "7.100.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.100.0.tgz#a9d36c01eede117c3e17b0350d399a87934e9c66"
+ integrity sha512-LAhZMEGq3C125prZN/ShqeXpRfdfgJkl9RAKjfq8cmMFsF7nsF72dEHZgIwrZ0lgNmtaWAB83AwJcyN83RwOxQ==
+ dependencies:
+ "@sentry/types" "7.100.0"
"@types/archiver@^5.3.1":
version "5.3.2"
@@ -3747,11 +3755,6 @@ image-size@~0.5.0:
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
-immediate@~3.0.5:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
- integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
-
"immutable@^3.8.1 || ^4.0.0", immutable@^4.0.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f"
@@ -4205,13 +4208,6 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-lie@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
- integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==
- dependencies:
- immediate "~3.0.5"
-
lilconfig@^2.0.5:
version "2.1.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
@@ -4267,13 +4263,6 @@ loader-utils@^3.2.1:
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576"
integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==
-localforage@^1.8.1:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4"
- integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==
- dependencies:
- lie "3.1.1"
-
locate-path@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
@@ -6448,7 +6437,7 @@ tsconfig-paths@^4.1.2:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@^1.8.1, tslib@^1.9.3:
+tslib@^1.8.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==