mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
Review feedback on #2411 (Rames): the crash-survival RenderCaptureObservability mirror passed deFallbackFailedDb raw/unrounded while the render_complete perfSummary path rounded to 1 decimal — the same underlying PSNR could ship two different values to PostHog depending on which event fired. Extracted the existing inline round/clamp expression (previously duplicated for verifyMinDb and fallbackFailedDb) into a shared roundDb helper, applied once at the single point deFallbackFailedDb is derived from the thrown error so both downstream consumers agree. Also threads verifyThresholdDb (captured on the error but never propagated, per the nit) through DrawElementPerfInput/RenderCaptureObservability/render.ts/ telemetry as de_fallback_threshold_db on both events — the HF_DE_VERIFY_MIN_DB value the failing dB breached, letting ops read "28.4dB failed a 32dB threshold" directly instead of cross-referencing config.
130 lines
5.1 KiB
TypeScript
130 lines
5.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { RenderObservabilitySummary } from "@hyperframes/producer";
|
|
import { renderObservabilityTelemetryPayload } from "./renderObservability.js";
|
|
|
|
function makeSummary(
|
|
capture: Partial<RenderObservabilitySummary["capture"]>,
|
|
): RenderObservabilitySummary {
|
|
return {
|
|
events: [],
|
|
eventCount: 0,
|
|
browserDiagnostics: {
|
|
total: 0,
|
|
errors: 0,
|
|
pageErrors: 0,
|
|
requestFailed: 0,
|
|
httpErrors: 0,
|
|
navigationStarts: 0,
|
|
navigationFailures: 0,
|
|
consoleErrors: 0,
|
|
consoleWarnings: 0,
|
|
},
|
|
capture: { forceScreenshot: false, captureMode: "beginframe", ...capture },
|
|
};
|
|
}
|
|
|
|
describe("renderObservabilityTelemetryPayload — render-reliability counters", () => {
|
|
it("maps the transient-retry and OOM counters through to the telemetry payload", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({ transientRetries: 2, memoryExhaustionDetected: true }),
|
|
);
|
|
expect(payload.captureTransientRetries).toBe(2);
|
|
expect(payload.captureMemoryExhaustionDetected).toBe(true);
|
|
});
|
|
|
|
it("leaves the counters undefined when the render didn't retry or OOM", () => {
|
|
const payload = renderObservabilityTelemetryPayload(makeSummary({}));
|
|
expect(payload.captureTransientRetries).toBeUndefined();
|
|
expect(payload.captureMemoryExhaustionDetected).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
describe("renderObservabilityTelemetryPayload — DE inversion/router cohort (failure-path visibility)", () => {
|
|
it("maps the router cohort and its pre-router worker count", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({ deParallelRouter: "routed", dePreRouterWorkers: 2 }),
|
|
);
|
|
expect(payload.captureDeParallelRouter).toBe("routed");
|
|
expect(payload.captureDePreRouterWorkers).toBe(2);
|
|
expect(payload.captureDeWorkerInversion).toBeUndefined();
|
|
expect(payload.captureDePreInversionWorkers).toBeUndefined();
|
|
});
|
|
|
|
it("maps the inversion cohort and its pre-inversion worker count", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({ deWorkerInversion: "inverted", dePreInversionWorkers: 4 }),
|
|
);
|
|
expect(payload.captureDeWorkerInversion).toBe("inverted");
|
|
expect(payload.captureDePreInversionWorkers).toBe(4);
|
|
expect(payload.captureDeParallelRouter).toBeUndefined();
|
|
});
|
|
|
|
it("carries deSelfVerifyFallback so a hard failure mid-verify is still visible", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({ deParallelRouter: "routed", deSelfVerifyFallback: true }),
|
|
);
|
|
expect(payload.captureDeSelfVerifyFallback).toBe(true);
|
|
});
|
|
|
|
it("carries deFallbackReason so a render that fails AFTER an OOM-triggered fallback attempt is distinguishable from one that never attempted a fallback", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({
|
|
deParallelRouter: "routed",
|
|
deSelfVerifyFallback: false,
|
|
deFallbackReason: "oom",
|
|
}),
|
|
);
|
|
expect(payload.captureDeFallbackReason).toBe("oom");
|
|
});
|
|
|
|
it("leaves deFallbackReason undefined when no fallback was ever attempted", () => {
|
|
const payload = renderObservabilityTelemetryPayload(makeSummary({}));
|
|
expect(payload.captureDeFallbackReason).toBeUndefined();
|
|
});
|
|
|
|
it("carries the failing dB, frame index, and threshold for a psnr fallback, still visible on a hard failure", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({
|
|
deParallelRouter: "routed",
|
|
deFallbackReason: "psnr",
|
|
deFallbackFailedDb: 28.4,
|
|
deFallbackFrameIndex: 649,
|
|
deFallbackThresholdDb: 32,
|
|
}),
|
|
);
|
|
expect(payload.captureDeFallbackFailedDb).toBe(28.4);
|
|
expect(payload.captureDeFallbackFrameIndex).toBe(649);
|
|
expect(payload.captureDeFallbackThresholdDb).toBe(32);
|
|
});
|
|
|
|
it("leaves failedDb/thresholdDb undefined for a blank/oom/capture_error fallback (no PSNR score exists)", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({ deFallbackReason: "oom", deFallbackFrameIndex: undefined }),
|
|
);
|
|
expect(payload.captureDeFallbackFailedDb).toBeUndefined();
|
|
expect(payload.captureDeFallbackFrameIndex).toBeUndefined();
|
|
expect(payload.captureDeFallbackThresholdDb).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
describe("renderObservabilityTelemetryPayload — non-DE parallel-stream router", () => {
|
|
it("maps the router outcome", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({ captureParallelStream: "beginframe" }),
|
|
);
|
|
expect(payload.captureParallelStream).toBe("beginframe");
|
|
});
|
|
|
|
it("maps the passive eligible_off cohort-sizing signal", () => {
|
|
const payload = renderObservabilityTelemetryPayload(
|
|
makeSummary({ captureParallelStream: "eligible_off" }),
|
|
);
|
|
expect(payload.captureParallelStream).toBe("eligible_off");
|
|
});
|
|
|
|
it("stays undefined when the router never fired", () => {
|
|
const payload = renderObservabilityTelemetryPayload(makeSummary({}));
|
|
expect(payload.captureParallelStream).toBeUndefined();
|
|
});
|
|
});
|