Files
Eric Allam 09d0e80804 Add sentry error reporting (#2309)
* Sentry WIP

* Configure sentry for uploading and releasing during the publish webapp step

* Delete source maps after uploading

* Forward logger.error calls to sentry through Logger.onError

* Couple tweaks to the dockerfile
2025-07-24 15:09:50 +01:00

82 lines
2.1 KiB
TypeScript

import type { LogLevel } from "@trigger.dev/core/logger";
import { Logger } from "@trigger.dev/core/logger";
import { sensitiveDataReplacer } from "./sensitiveDataReplacer";
import { AsyncLocalStorage } from "async_hooks";
import { getHttpContext } from "./httpAsyncStorage.server";
import { captureException, captureMessage } from "@sentry/remix";
const currentFieldsStore = new AsyncLocalStorage<Record<string, unknown>>();
export function trace<T>(fields: Record<string, unknown>, fn: () => T): T {
return currentFieldsStore.run(fields, fn);
}
Logger.onError = (message, ...args) => {
const error = extractErrorFromArgs(args);
if (error) {
captureException(error, {
extra: {
message,
...flattenArgs(args),
},
});
} else {
captureMessage(message, {
level: "error",
extra: flattenArgs(args),
});
}
};
function extractErrorFromArgs(args: Array<Record<string, unknown> | undefined>) {
for (const arg of args) {
if (arg && "error" in arg && arg.error instanceof Error) {
return arg.error;
}
}
return;
}
function flattenArgs(args: Array<Record<string, unknown> | undefined>) {
return args.reduce((acc, arg) => {
if (arg) {
return { ...acc, ...arg };
}
return acc;
}, {});
}
export const logger = new Logger(
"webapp",
(process.env.APP_LOG_LEVEL ?? "debug") as LogLevel,
["examples", "output", "connectionString", "payload"],
sensitiveDataReplacer,
() => {
const fields = currentFieldsStore.getStore();
const httpContext = getHttpContext();
return { ...fields, http: httpContext };
}
);
export const workerLogger = new Logger(
"worker",
(process.env.APP_LOG_LEVEL ?? "debug") as LogLevel,
["examples", "output", "connectionString"],
sensitiveDataReplacer,
() => {
const fields = currentFieldsStore.getStore();
return fields ? { ...fields } : {};
}
);
export const socketLogger = new Logger(
"socket",
(process.env.APP_LOG_LEVEL ?? "debug") as LogLevel,
[],
sensitiveDataReplacer,
() => {
const fields = currentFieldsStore.getStore();
return fields ? { ...fields } : {};
}
);