fix(sentry): widen SentryLike so official SDKs assign without adapters
ci/woodpecker/push/ci Pipeline failed
ci/woodpecker/push/publish unknown status

This commit is contained in:
2026-08-07 16:05:09 -03:00
parent 19de8db119
commit 3c468dbf44
6 changed files with 507 additions and 10 deletions
+67 -2
View File
@@ -1,6 +1,6 @@
import { describe, expect, it, vi } from "vitest";
import { createLogger } from "../src/index";
import { createSentrySink, toSentryLogPayload } from "../src/sentry";
import { createLogger, type LogEvent } from "../src/index";
import { createSentrySink, toSentryLogPayload, toSentrySeverity } from "../src/sentry";
function createFakeSentry() {
const scope = { setLevel: vi.fn(), setTag: vi.fn(), setExtras: vi.fn() };
@@ -21,6 +21,29 @@ function createFakeSentry() {
};
}
function issueEvent(overrides: Partial<LogEvent> = {}): LogEvent {
return {
level: "error",
arguments: ["message"],
timestamp: new Date(),
environment: "production",
sendToSentryLogs: false,
sendToSentryIssue: true,
sendToConsole: false,
...overrides,
};
}
describe("toSentrySeverity", () => {
it("maps logger levels to Sentry Issue severities", () => {
expect(toSentrySeverity("warn")).toBe("warning");
expect(toSentrySeverity("trace")).toBe("debug");
expect(toSentrySeverity("error")).toBe("error");
expect(toSentrySeverity("info")).toBe("info");
expect(toSentrySeverity("debug")).toBe("debug");
});
});
describe("toSentryLogPayload", () => {
it("joins string messages and flattens primitive object attributes", () => {
expect(
@@ -111,4 +134,46 @@ describe("createSentrySink", () => {
expect(sentry.captureException).not.toHaveBeenCalled();
expect(sentry.logger.warn).not.toHaveBeenCalled();
});
it("maps warn → warning on the Issues path and keeps warn on the Logs path", () => {
const { scope, sentry } = createFakeSentry();
const sink = createSentrySink(sentry, { logs: true });
sink.emit(
issueEvent({
level: "warn",
arguments: ["degraded"],
}),
);
expect(scope.setLevel).toHaveBeenCalledWith("warning");
expect(sentry.captureMessage).toHaveBeenCalledWith("degraded", "warning");
expect(sentry.logger.warn).not.toHaveBeenCalled();
sink.emit({
level: "warn",
namespace: "API",
arguments: ["slow", { ms: 10 }],
timestamp: new Date(),
environment: "production",
sendToSentryLogs: true,
sendToSentryIssue: false,
sendToConsole: false,
});
expect(sentry.logger.warn).toHaveBeenCalledWith("slow", {
"logger.namespace": "API",
ms: 10,
});
});
it("maps error Issue severity as error", () => {
const { scope, sentry } = createFakeSentry();
createSentrySink(sentry).emit(
issueEvent({
level: "error",
arguments: ["failed"],
}),
);
expect(scope.setLevel).toHaveBeenCalledWith("error");
expect(sentry.captureMessage).toHaveBeenCalledWith("failed", "error");
});
});