about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authordan <dan.abramov@gmail.com>2024-12-17 12:22:09 +0000
committerGitHub <noreply@github.com>2024-12-17 12:22:09 +0000
commit32611391a35cbfe3f4a57882c117d52de022fb89 (patch)
tree245a98d941d81f4adc4b18fee7a74369849d20a3 /src
parent07b7250682c2841e9428c509707d08c17a4317df (diff)
downloadvoidsky-32611391a35cbfe3f4a57882c117d52de022fb89.tar.zst
Pipe statsig events to logger (#7141)
* Pipe statsig events to logger

* Log rich objects to bitdrift

* Fix tests

* Consolidate mocks, fix tests

* Reduce log trash on native
Diffstat (limited to 'src')
-rw-r--r--src/lib/bitdrift.ts1
-rw-r--r--src/lib/bitdrift.web.ts4
-rw-r--r--src/lib/statsig/statsig.tsx26
-rw-r--r--src/logger/bitdriftTransport.ts5
-rw-r--r--src/logger/bitdriftTransport.web.ts7
-rw-r--r--src/state/session/__tests__/session-test.ts13
6 files changed, 30 insertions, 26 deletions
diff --git a/src/lib/bitdrift.ts b/src/lib/bitdrift.ts
index 02d074e76..3f892f6b8 100644
--- a/src/lib/bitdrift.ts
+++ b/src/lib/bitdrift.ts
@@ -1,5 +1,6 @@
 import {init} from '@bitdrift/react-native'
 import {Statsig} from 'statsig-react-native-expo'
+export {debug, error, info, warn} from '@bitdrift/react-native'
 
 import {initPromise} from './statsig/statsig'
 
diff --git a/src/lib/bitdrift.web.ts b/src/lib/bitdrift.web.ts
new file mode 100644
index 000000000..5db69450f
--- /dev/null
+++ b/src/lib/bitdrift.web.ts
@@ -0,0 +1,4 @@
+export function debug() {}
+export function error() {}
+export function info() {}
+export function warn() {}
diff --git a/src/lib/statsig/statsig.tsx b/src/lib/statsig/statsig.tsx
index 21fa4bb57..e0882806d 100644
--- a/src/lib/statsig/statsig.tsx
+++ b/src/lib/statsig/statsig.tsx
@@ -5,6 +5,7 @@ import {sha256} from 'js-sha256'
 import {Statsig, StatsigProvider} from 'statsig-react-native-expo'
 
 import {BUNDLE_DATE, BUNDLE_IDENTIFIER, IS_TESTFLIGHT} from '#/lib/app-info'
+import * as bitdrift from '#/lib/bitdrift'
 import {logger} from '#/logger'
 import {isWeb} from '#/platform/detection'
 import * as persisted from '#/state/persisted'
@@ -97,19 +98,38 @@ export function logEvent<E extends keyof LogEvents>(
   rawMetadata: LogEvents[E] & FlatJSONRecord,
 ) {
   try {
-    const fullMetadata = {
-      ...rawMetadata,
-    } as Record<string, string> // Statsig typings are unnecessarily strict here.
+    const fullMetadata = toStringRecord(rawMetadata)
     fullMetadata.routeName = getCurrentRouteName() ?? '(Uninitialized)'
     if (Statsig.initializeCalled()) {
       Statsig.logEvent(eventName, null, fullMetadata)
     }
+    // Intentionally bypass the logger abstraction to log rich objects.
+    console.groupCollapsed(eventName)
+    console.log(fullMetadata)
+    console.groupEnd()
+    bitdrift.info(eventName, fullMetadata)
   } catch (e) {
     // A log should never interrupt the calling code, whatever happens.
     logger.error('Failed to log an event', {message: e})
   }
 }
 
+function toStringRecord<E extends keyof LogEvents>(
+  metadata: LogEvents[E] & FlatJSONRecord,
+): Record<string, string> {
+  const record: Record<string, string> = {}
+  for (let key in metadata) {
+    if (metadata.hasOwnProperty(key)) {
+      if (typeof metadata[key] === 'string') {
+        record[key] = metadata[key]
+      } else {
+        record[key] = JSON.stringify(metadata[key])
+      }
+    }
+  }
+  return record
+}
+
 // We roll our own cache in front of Statsig because it is a singleton
 // and it's been difficult to get it to behave in a predictable way.
 // Our own cache ensures consistent evaluation within a single session.
diff --git a/src/logger/bitdriftTransport.ts b/src/logger/bitdriftTransport.ts
index c2235e0d4..159b86300 100644
--- a/src/logger/bitdriftTransport.ts
+++ b/src/logger/bitdriftTransport.ts
@@ -3,8 +3,7 @@ import {
   error as bdError,
   info as bdInfo,
   warn as bdWarn,
-} from '@bitdrift/react-native'
-
+} from '../lib/bitdrift'
 import {LogLevel, Transport} from './types'
 
 export function createBitdriftTransport(): Transport {
@@ -18,6 +17,6 @@ export function createBitdriftTransport(): Transport {
 
   return (level, message) => {
     const log = logFunctions[level]
-    log(message.toString())
+    log('' + message)
   }
 }
diff --git a/src/logger/bitdriftTransport.web.ts b/src/logger/bitdriftTransport.web.ts
deleted file mode 100644
index ecea3f6f3..000000000
--- a/src/logger/bitdriftTransport.web.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import {Transport} from './index'
-
-export function createBitdriftTransport(): Transport {
-  return (_level, _message) => {
-    // noop
-  }
-}
diff --git a/src/state/session/__tests__/session-test.ts b/src/state/session/__tests__/session-test.ts
index 7a5ddfa97..dec8ec48b 100644
--- a/src/state/session/__tests__/session-test.ts
+++ b/src/state/session/__tests__/session-test.ts
@@ -4,25 +4,12 @@ import {describe, expect, it, jest} from '@jest/globals'
 import {agentToSessionAccountOrThrow} from '../agent'
 import {Action, getInitialState, reducer, State} from '../reducer'
 
-jest.mock('statsig-react-native-expo', () => ({
-  Statsig: {
-    initialize() {},
-    initializeCalled() {
-      return false
-    },
-  },
-}))
-
 jest.mock('jwt-decode', () => ({
   jwtDecode(_token: string) {
     return {}
   },
 }))
 
-jest.mock('expo-localization', () => ({
-  getLocales: () => [],
-}))
-
 describe('session', () => {
   it('can log in and out', () => {
     let state = getInitialState([])