Add metric method to logger, replace datalake calls with new method

(cherry picked from commit 7a026bbeae75514b64f928d7ff59707c518fd5e5)
This commit is contained in:
Eric Bailey
2025-02-28 11:47:29 -06:00
parent f100545afb
commit 67d54b7c00
3 changed files with 36 additions and 9 deletions
+5 -8
View File
@@ -32,6 +32,7 @@ import {
import {RouteParams, State} from '#/lib/routes/types' import {RouteParams, State} from '#/lib/routes/types'
import {attachRouteToLogEvents, logEvent} from '#/lib/statsig/statsig' import {attachRouteToLogEvents, logEvent} from '#/lib/statsig/statsig'
import {bskyTitle} from '#/lib/strings/headings' import {bskyTitle} from '#/lib/strings/headings'
import {logger} from '#/logger'
import {isNative, isWeb} from '#/platform/detection' import {isNative, isWeb} from '#/platform/detection'
import {useModalControls} from '#/state/modals' import {useModalControls} from '#/state/modals'
import {useUnreadNotifications} from '#/state/queries/notifications/unread' import {useUnreadNotifications} from '#/state/queries/notifications/unread'
@@ -729,20 +730,16 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
linking={LINKING} linking={LINKING}
theme={theme} theme={theme}
onStateChange={() => { onStateChange={() => {
logEvent( logger.metric('router:navigate', {
'router:navigate', from: prevLoggedRouteName.current,
{ })
from: prevLoggedRouteName.current,
},
{lake: true},
)
prevLoggedRouteName.current = getCurrentRouteName() prevLoggedRouteName.current = getCurrentRouteName()
}} }}
onReady={() => { onReady={() => {
attachRouteToLogEvents(getCurrentRouteName) attachRouteToLogEvents(getCurrentRouteName)
logModuleInitTime() logModuleInitTime()
onReady() onReady()
logEvent('router:navigate', {}, {lake: true}) logger.metric('router:navigate', {})
}}> }}>
{children} {children}
</NavigationContainer> </NavigationContainer>
+10 -1
View File
@@ -91,6 +91,9 @@ export function toClout(n: number | null | undefined): number | undefined {
} }
} }
/**
* @deprecated use `logger.metric()` instead
*/
export function logEvent<E extends keyof MetricEvents>( export function logEvent<E extends keyof MetricEvents>(
eventName: E & string, eventName: E & string,
rawMetadata: MetricEvents[E] & FlatJSONRecord, rawMetadata: MetricEvents[E] & FlatJSONRecord,
@@ -111,7 +114,13 @@ export function logEvent<E extends keyof MetricEvents>(
} }
Statsig.logEvent(ev, null, fullMetadata) 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) { } catch (e) {
// A log should never interrupt the calling code, whatever happens. // A log should never interrupt the calling code, whatever happens.
logger.error('Failed to log an event', {message: e}) logger.error('Failed to log an event', {message: e})
+21
View File
@@ -1,6 +1,8 @@
import {nanoid} from 'nanoid/non-secure' import {nanoid} from 'nanoid/non-secure'
import {logEvent} from '#/lib/statsig/statsig'
import {add} from '#/logger/logDump' import {add} from '#/logger/logDump'
import {MetricEvents} from '#/logger/metrics'
import {bitdriftTransport} from '#/logger/transports/bitdrift' import {bitdriftTransport} from '#/logger/transports/bitdrift'
import {consoleTransport} from '#/logger/transports/console' import {consoleTransport} from '#/logger/transports/console'
import {sentryTransport} from '#/logger/transports/sentry' import {sentryTransport} from '#/logger/transports/sentry'
@@ -89,6 +91,25 @@ export class Logger {
this.transport({level: LogLevel.Error, message: error, metadata}) this.transport({level: LogLevel.Error, message: error, metadata})
} }
metric<E extends keyof MetricEvents>(
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) { addTransport(transport: Transport) {
this.transports.push(transport) this.transports.push(transport)
return () => { return () => {