Reserve context prop on metadata and include in transports

This commit is contained in:
Eric Bailey
2025-02-27 10:31:17 -06:00
parent 5d4b6d6ff1
commit ba07c0deb1
11 changed files with 40 additions and 21 deletions
+1 -1
View File
@@ -271,7 +271,7 @@ function SaveButtonInner({
} }
Toast.show(_(msg`Feeds updated!`)) Toast.show(_(msg`Feeds updated!`))
} catch (err: any) { } catch (err: any) {
logger.error(err, {context: `FeedCard: failed to update feeds`, pin}) logger.error(err, {message: `FeedCard: failed to update feeds`, pin})
Toast.show(_(msg`Failed to update feeds`), 'xmark') Toast.show(_(msg`Failed to update feeds`), 'xmark')
} }
}, },
@@ -209,7 +209,7 @@ export function PostInteractionSettingsDialogControlledInner(
props.control.close() props.control.close()
} catch (e: any) { } catch (e: any) {
logger.error(`Failed to save post interaction settings`, { logger.error(`Failed to save post interaction settings`, {
context: 'PostInteractionSettingsDialogControlledInner', source: 'PostInteractionSettingsDialogControlledInner',
safeMessage: e.message, safeMessage: e.message,
}) })
Toast.show( Toast.show(
+5 -1
View File
@@ -22,5 +22,9 @@ export const bitdriftTransport: Transport = (
metadata, metadata,
) => { ) => {
const log = logFunctions[level] const log = logFunctions[level]
log(`(${context}) ${message}`, prepareMetadata(metadata)) log(message.toString(), {
// match Sentry payload
context,
...prepareMetadata(metadata),
})
} }
+14 -4
View File
@@ -10,7 +10,17 @@ export const sentryTransport: Transport = (
{type, tags, ...metadata}, {type, tags, ...metadata},
timestamp, timestamp,
) => { ) => {
const meta = prepareMetadata(metadata) const meta = {
// match Bitdrift payload
context,
...prepareMetadata(metadata),
}
let _tags = tags || {}
_tags = {
// use `category` to match breadcrumbs
category: context,
...tags,
}
/** /**
* If a string, report a breadcrumb * If a string, report a breadcrumb
@@ -46,9 +56,9 @@ export const sentryTransport: Transport = (
*/ */
if (level === 'error' || level === 'warn' || level === 'log') { if (level === 'error' || level === 'warn' || level === 'log') {
// Defer non-critical messages so they're sent in a batch // Defer non-critical messages so they're sent in a batch
queueMessageForSentry(`(${context}) message`, { queueMessageForSentry(message, {
level: severity, level: severity,
tags, tags: _tags,
extra: meta, extra: meta,
}) })
} }
@@ -57,7 +67,7 @@ export const sentryTransport: Transport = (
* It's otherwise an Error and should be reported with captureException * It's otherwise an Error and should be reported with captureException
*/ */
Sentry.captureException(message, { Sentry.captureException(message, {
tags, tags: _tags,
extra: meta, extra: meta,
}) })
} }
+5
View File
@@ -32,6 +32,11 @@ export type Transport = (
* `captureException` parameter, `CaptureContext`. * `captureException` parameter, `CaptureContext`.
*/ */
export type Metadata = { export type Metadata = {
/**
* Reserved for appending `LogContext` to logging payloads
*/
context?: undefined
/** /**
* Applied as Sentry breadcrumb types. Defaults to `default`. * Applied as Sentry breadcrumb types. Defaults to `default`.
* *
+1 -1
View File
@@ -96,7 +96,7 @@ export function Deactivated() {
} }
logger.error(e, { logger.error(e, {
context: 'Failed to activate account', message: 'Failed to activate account',
}) })
} finally { } finally {
setPending(false) setPending(false)
@@ -102,7 +102,7 @@ function Inner({preferences}: {preferences: UsePreferencesQueryResponse}) {
Toast.show(_(msg`Settings saved`)) Toast.show(_(msg`Settings saved`))
} catch (e: any) { } catch (e: any) {
logger.error(`Failed to save post interaction settings`, { logger.error(`Failed to save post interaction settings`, {
context: 'ModerationInteractionSettingsScreen', source: 'ModerationInteractionSettingsScreen',
safeMessage: e.message, safeMessage: e.message,
}) })
setError(_(msg`Failed to save settings. Please try again.`)) setError(_(msg`Failed to save settings. Please try again.`))
@@ -61,7 +61,7 @@ function DeactivateAccountDialogInner({
} }
logger.error(e, { logger.error(e, {
context: 'Failed to deactivate account', message: 'Failed to deactivate account',
}) })
} finally { } finally {
setPending(false) setPending(false)
+6 -6
View File
@@ -469,7 +469,7 @@ export class Convo {
this.dispatch({event: ConvoDispatchEvent.Ready}) this.dispatch({event: ConvoDispatchEvent.Ready})
} }
} catch (e: any) { } catch (e: any) {
logger.error(e, {context: 'Convo: setup failed'}) logger.error(e, {message: 'Convo: setup failed'})
this.dispatch({ this.dispatch({
event: ConvoDispatchEvent.Error, event: ConvoDispatchEvent.Error,
@@ -574,7 +574,7 @@ export class Convo {
this.sender = sender || this.sender this.sender = sender || this.sender
this.recipients = recipients || this.recipients this.recipients = recipients || this.recipients
} catch (e: any) { } catch (e: any) {
logger.error(e, {context: `Convo: failed to refresh convo`}) logger.error(e, {message: `Convo: failed to refresh convo`})
} }
} }
@@ -834,7 +834,7 @@ export class Convo {
// continue queue processing // continue queue processing
await this.processPendingMessages() await this.processPendingMessages()
} catch (e: any) { } catch (e: any) {
logger.error(e, {context: `Convo: failed to send message`}) logger.error(e, {message: `Convo: failed to send message`})
this.handleSendMessageFailure(e) this.handleSendMessageFailure(e)
this.isProcessingPendingMessages = false this.isProcessingPendingMessages = false
} }
@@ -880,7 +880,7 @@ export class Convo {
} else { } else {
this.pendingMessageFailure = 'unrecoverable' this.pendingMessageFailure = 'unrecoverable'
logger.error(e, { logger.error(e, {
context: `Convo handleSendMessageFailure received unknown error`, message: `Convo handleSendMessageFailure received unknown error`,
}) })
} }
@@ -935,7 +935,7 @@ export class Convo {
{}, {},
) )
} catch (e: any) { } catch (e: any) {
logger.error(e, {context: `Convo: failed to batch retry messages`}) logger.error(e, {message: `Convo: failed to batch retry messages`})
this.handleSendMessageFailure(e) this.handleSendMessageFailure(e)
} }
} }
@@ -957,7 +957,7 @@ export class Convo {
) )
}) })
} catch (e: any) { } catch (e: any) {
logger.error(e, {context: `Convo: failed to delete message`}) logger.error(e, {message: `Convo: failed to delete message`})
this.deletedMessages.delete(messageId) this.deletedMessages.delete(messageId)
this.commit() this.commit()
throw e throw e
+3 -3
View File
@@ -255,7 +255,7 @@ export class MessagesEventBus {
this.dispatch({event: MessagesEventBusDispatchEvent.Ready}) this.dispatch({event: MessagesEventBusDispatchEvent.Ready})
} catch (e: any) { } catch (e: any) {
logger.error(e, { logger.error(e, {
context: `${LOGGER_CONTEXT}: init failed`, message: `${LOGGER_CONTEXT}: init failed`,
}) })
this.dispatch({ this.dispatch({
@@ -368,12 +368,12 @@ export class MessagesEventBus {
this.emitter.emit('event', {type: 'logs', logs: batch}) this.emitter.emit('event', {type: 'logs', logs: batch})
} catch (e: any) { } catch (e: any) {
logger.error(e, { logger.error(e, {
context: `${LOGGER_CONTEXT}: process latest events`, message: `${LOGGER_CONTEXT}: process latest events`,
}) })
} }
} }
} catch (e: any) { } catch (e: any) {
logger.error(e, {context: `${LOGGER_CONTEXT}: poll events failed`}) logger.error(e, {message: `${LOGGER_CONTEXT}: poll events failed`})
this.dispatch({ this.dispatch({
event: MessagesEventBusDispatchEvent.Error, event: MessagesEventBusDispatchEvent.Error,
+2 -2
View File
@@ -166,7 +166,7 @@ export async function createAgentAndCreateAccount(
}) })
} catch (e: any) { } catch (e: any) {
logger.error(e, { logger.error(e, {
context: `session: createAgentAndCreateAccount failed to save personal details and feeds`, message: `session: createAgentAndCreateAccount failed to save personal details and feeds`,
}) })
} }
} else { } else {
@@ -177,7 +177,7 @@ export async function createAgentAndCreateAccount(
// snooze first prompt after signup, defer to next prompt // snooze first prompt after signup, defer to next prompt
snoozeEmailConfirmationPrompt() snoozeEmailConfirmationPrompt()
} catch (e: any) { } catch (e: any) {
logger.error(e, {context: `session: failed snoozeEmailConfirmationPrompt`}) logger.error(e, {message: `session: failed snoozeEmailConfirmationPrompt`})
} }
return agent.prepare(gates, moderation, onSessionChange) return agent.prepare(gates, moderation, onSessionChange)