38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import type { LogEvent, LogSink } from "./types.js";
|
|
|
|
export interface SentryScopeLike {
|
|
setLevel(level: string): void;
|
|
setTag(key: string, value: string): void;
|
|
setExtras(extras: Record<string, unknown>): void;
|
|
}
|
|
export interface SentryLike {
|
|
withScope(callback: (scope: SentryScopeLike) => void): void;
|
|
captureException(error: Error): void;
|
|
captureMessage(message: string, level: string): void;
|
|
}
|
|
|
|
/** Creates an optional Sentry adapter without adding a Sentry SDK dependency to this package. */
|
|
export function createSentrySink(sentry: SentryLike): LogSink {
|
|
return {
|
|
emit(event: LogEvent) {
|
|
if (event.level !== "error") return;
|
|
const error = event.arguments.find((item): item is Error => item instanceof Error);
|
|
const extras = Object.fromEntries(
|
|
event.arguments
|
|
.filter((item) => item && typeof item === "object" && !(item instanceof Error))
|
|
.map((item, index) => [`context_${index}`, item]),
|
|
);
|
|
const message =
|
|
event.arguments.filter((item) => typeof item === "string").join(" ") ||
|
|
"Logger error";
|
|
sentry.withScope((scope) => {
|
|
scope.setLevel("error");
|
|
if (event.namespace) scope.setTag("logger.namespace", event.namespace);
|
|
scope.setExtras(extras);
|
|
if (error) sentry.captureException(error);
|
|
else sentry.captureMessage(message, "error");
|
|
});
|
|
},
|
|
};
|
|
}
|