From 67d54b7c009bdbe8d0111113fd36711ee2214355 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Fri, 28 Feb 2025 11:47:29 -0600 Subject: [PATCH] Add metric method to logger, replace datalake calls with new method (cherry picked from commit 7a026bbeae75514b64f928d7ff59707c518fd5e5) --- src/Navigation.tsx | 13 +++++-------- src/lib/statsig/statsig.tsx | 11 ++++++++++- src/logger/index.ts | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 1ca02f6372..baf99f1103 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -32,6 +32,7 @@ import { import {RouteParams, State} from '#/lib/routes/types' import {attachRouteToLogEvents, logEvent} from '#/lib/statsig/statsig' import {bskyTitle} from '#/lib/strings/headings' +import {logger} from '#/logger' import {isNative, isWeb} from '#/platform/detection' import {useModalControls} from '#/state/modals' import {useUnreadNotifications} from '#/state/queries/notifications/unread' @@ -729,20 +730,16 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) { linking={LINKING} theme={theme} onStateChange={() => { - logEvent( - 'router:navigate', - { - from: prevLoggedRouteName.current, - }, - {lake: true}, - ) + logger.metric('router:navigate', { + from: prevLoggedRouteName.current, + }) prevLoggedRouteName.current = getCurrentRouteName() }} onReady={() => { attachRouteToLogEvents(getCurrentRouteName) logModuleInitTime() onReady() - logEvent('router:navigate', {}, {lake: true}) + logger.metric('router:navigate', {}) }}> {children} diff --git a/src/lib/statsig/statsig.tsx b/src/lib/statsig/statsig.tsx index a75709860d..7f04da1267 100644 --- a/src/lib/statsig/statsig.tsx +++ b/src/lib/statsig/statsig.tsx @@ -91,6 +91,9 @@ export function toClout(n: number | null | undefined): number | undefined { } } +/** + * @deprecated use `logger.metric()` instead + */ export function logEvent( eventName: E & string, rawMetadata: MetricEvents[E] & FlatJSONRecord, @@ -111,7 +114,13 @@ export function logEvent( } Statsig.logEvent(ev, null, fullMetadata) } - logger.info(eventName, fullMetadata) + /** + * All datalake events should be sent using `logger.metric`, and we don't + * want to double-emit logs to other transports. + */ + if (!options.lake) { + logger.info(eventName, fullMetadata) + } } catch (e) { // A log should never interrupt the calling code, whatever happens. logger.error('Failed to log an event', {message: e}) diff --git a/src/logger/index.ts b/src/logger/index.ts index 410d29bb3e..0a50a9d21b 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -1,6 +1,8 @@ import {nanoid} from 'nanoid/non-secure' +import {logEvent} from '#/lib/statsig/statsig' import {add} from '#/logger/logDump' +import {MetricEvents} from '#/logger/metrics' import {bitdriftTransport} from '#/logger/transports/bitdrift' import {consoleTransport} from '#/logger/transports/console' import {sentryTransport} from '#/logger/transports/sentry' @@ -89,6 +91,25 @@ export class Logger { this.transport({level: LogLevel.Error, message: error, metadata}) } + metric( + event: E & string, + metadata: MetricEvents[E], + options: { + /** + * Optionally also send to StatSig + */ + statsig?: boolean + } = {statsig: false}, + ) { + logEvent(event, metadata, { + lake: !options.statsig, + }) + + for (const transport of this.transports) { + transport(LogLevel.Info, LogContext.Metric, event, metadata, Date.now()) + } + } + addTransport(transport: Transport) { this.transports.push(transport) return () => {