about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAnsh <anshnanda10@gmail.com>2023-05-01 12:42:31 -0700
committerGitHub <noreply@github.com>2023-05-01 14:42:31 -0500
commitc75c888de2407d3314cad07989174201313facaa (patch)
treee7b293ebc6730a47c1a89207fd0248393db5185e /src
parentdbb3c5c15524c517291356a4918d043348906aad (diff)
downloadvoidsky-c75c888de2407d3314cad07989174201313facaa.tar.zst
[APP-527] setup sentry (#532)
* setup sentry

* add sentry to transformIgnorePatterns to fix jest issues

* update README with sourcemap instructions

* only enable integrations on native

* fix sentry web

* remove testing code

* fix sentry authToken

* Switch over to paul's auth tokens temporarily (lol)

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/App.native.tsx4
-rw-r--r--src/App.web.tsx1
-rw-r--r--src/Navigation.tsx13
-rw-r--r--src/lib/sentry.ts46
4 files changed, 62 insertions, 2 deletions
diff --git a/src/App.native.tsx b/src/App.native.tsx
index e0e030cbc..f330cfa04 100644
--- a/src/App.native.tsx
+++ b/src/App.native.tsx
@@ -1,5 +1,7 @@
 import 'react-native-url-polyfill/auto'
 import React, {useState, useEffect} from 'react'
+import 'lib/sentry' // must be relatively on top
+import {withSentry} from 'lib/sentry'
 import {Linking} from 'react-native'
 import {RootSiblingParent} from 'react-native-root-siblings'
 import * as SplashScreen from 'expo-splash-screen'
@@ -64,4 +66,4 @@ const App = observer(() => {
   )
 })
 
-export default App
+export default withSentry(App)
diff --git a/src/App.web.tsx b/src/App.web.tsx
index e259a48e9..429328276 100644
--- a/src/App.web.tsx
+++ b/src/App.web.tsx
@@ -1,4 +1,5 @@
 import React, {useState, useEffect} from 'react'
+import 'lib/sentry' // must be relatively on top
 import {SafeAreaProvider} from 'react-native-safe-area-context'
 import {RootSiblingParent} from 'react-native-root-siblings'
 import * as view from './view/index'
diff --git a/src/Navigation.tsx b/src/Navigation.tsx
index 3a9392fb8..412c63f33 100644
--- a/src/Navigation.tsx
+++ b/src/Navigation.tsx
@@ -50,6 +50,7 @@ import {CommunityGuidelinesScreen} from './view/screens/CommunityGuidelines'
 import {CopyrightPolicyScreen} from './view/screens/CopyrightPolicy'
 import {AppPasswords} from 'view/screens/AppPasswords'
 import {BlockedAccounts} from 'view/screens/BlockedAccounts'
+import {getRoutingInstrumentation} from 'lib/sentry'
 
 const navigationRef = createNavigationContainerRef<AllNavigatorParams>()
 
@@ -262,7 +263,17 @@ const LINKING = {
 function RoutesContainer({children}: React.PropsWithChildren<{}>) {
   const theme = useColorSchemeStyle(DefaultTheme, DarkTheme)
   return (
-    <NavigationContainer ref={navigationRef} linking={LINKING} theme={theme}>
+    <NavigationContainer
+      ref={navigationRef}
+      linking={LINKING}
+      theme={theme}
+      onReady={() => {
+        // Register the navigation container with the Sentry instrumentation (only works on native)
+        if (isNative) {
+          const routingInstrumentation = getRoutingInstrumentation()
+          routingInstrumentation.registerNavigationContainer(navigationRef)
+        }
+      }}>
       {children}
     </NavigationContainer>
   )
diff --git a/src/lib/sentry.ts b/src/lib/sentry.ts
new file mode 100644
index 000000000..c5d1d3eb6
--- /dev/null
+++ b/src/lib/sentry.ts
@@ -0,0 +1,46 @@
+import {isNative, isWeb} from 'platform/detection'
+import {FC} from 'react'
+import * as Sentry from 'sentry-expo'
+
+// Sentry Initialization
+
+export const getRoutingInstrumentation = () => {
+  return new Sentry.Native.ReactNavigationInstrumentation() // initialize this in `onReady` prop of NavigationContainer
+}
+
+Sentry.init({
+  dsn: 'https://05bc3789bf994b81bd7ce20c86ccd3ae@o4505071687041024.ingest.sentry.io/4505071690514432',
+  enableInExpoDevelopment: false, // if true, Sentry will try to send events/errors in development mode.
+  debug: false, // If `true`, Sentry will try to print out useful debugging information if something goes wrong with sending the event. Set it to `false` in production
+  environment: __DEV__ ? 'development' : 'production', // Set the environment
+  enableAutoPerformanceTracking: true, // Enable auto performance tracking
+  tracesSampleRate: 0.5, // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. // TODO: this might be too much in production
+  integrations: isNative
+    ? [
+        new Sentry.Native.ReactNativeTracing({
+          shouldCreateSpanForRequest: url => {
+            // Do not create spans for outgoing requests to a `/logs` endpoint as it is too noisy due to expo
+            return !url.match(/\/logs$/)
+          },
+          routingInstrumentation: getRoutingInstrumentation(),
+        }),
+      ]
+    : [], // no integrations for web, yet
+})
+
+// if web, use Browser client, otherwise use Native client
+export function getSentryClient() {
+  if (isWeb) {
+    return Sentry.Browser
+  }
+  return Sentry.Native
+}
+
+// wrap root App component with Sentry for automatic touch event tracking and performance monitoring
+export function withSentry(Component: FC) {
+  if (isWeb) {
+    return Component // .wrap is not required or available for web
+  }
+  const sentryClient = getSentryClient()
+  return sentryClient.wrap(Component)
+}