feat: add diagnostics and telemetry runtime
This commit is contained in:
@@ -3,6 +3,7 @@ import type {
|
||||
ApplicationApi,
|
||||
ColorSchemePreference,
|
||||
RenderFailureReport,
|
||||
RouteChangedReport,
|
||||
} from "./ports/in/application-api.js";
|
||||
import type { ApplicationOutputPorts } from "./ports/out/application-output-ports.js";
|
||||
import { decideChunkRecovery } from "./use-cases/decide-chunk-recovery.js";
|
||||
@@ -43,7 +44,20 @@ export function createApplication(
|
||||
const diagnostics = Object.freeze({
|
||||
reportRenderFailure(report: RenderFailureReport) {
|
||||
try {
|
||||
outputPorts.diagnostics.emit("ui.render.failed", {
|
||||
outputPorts.diagnostics.record({
|
||||
level: "error",
|
||||
eventId: "ui.render.failed",
|
||||
context: {
|
||||
route_id: report.routeId,
|
||||
build_id: report.buildId,
|
||||
component_boundary: report.boundaryName,
|
||||
},
|
||||
});
|
||||
} catch {
|
||||
// Diagnostics are best-effort and cannot become an application failure.
|
||||
}
|
||||
try {
|
||||
outputPorts.telemetry.emit("ui.render.failed", {
|
||||
route_id: report.routeId,
|
||||
build_id: report.buildId,
|
||||
component_boundary: report.boundaryName,
|
||||
@@ -52,6 +66,20 @@ export function createApplication(
|
||||
// Diagnostics are best-effort and cannot become an application failure.
|
||||
}
|
||||
},
|
||||
reportRouteChanged(report: RouteChangedReport) {
|
||||
try {
|
||||
outputPorts.diagnostics.record({
|
||||
level: "info",
|
||||
eventId: "route.changed",
|
||||
context: {
|
||||
route_id: report.routeId,
|
||||
build_id: report.buildId,
|
||||
},
|
||||
});
|
||||
} catch {
|
||||
// Diagnostics are best-effort and cannot become navigation failure.
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const runtime = Object.freeze({
|
||||
@@ -74,6 +102,37 @@ export function createApplication(
|
||||
try {
|
||||
const current = await outputPorts.releaseInfo.getCurrent();
|
||||
const active = await outputPorts.releaseInfo.refresh();
|
||||
if (
|
||||
current.buildId !== active.buildId ||
|
||||
current.releaseId !== active.releaseId
|
||||
) {
|
||||
const mismatchKind =
|
||||
current.buildId !== active.buildId
|
||||
? "BUILD_MISMATCH"
|
||||
: "RELEASE_MISMATCH";
|
||||
try {
|
||||
outputPorts.diagnostics.record({
|
||||
level: "warn",
|
||||
eventId: "release.mismatch.detected",
|
||||
context: {
|
||||
build_id: current.buildId,
|
||||
active_release_id: active.releaseId,
|
||||
mismatch_kind: mismatchKind,
|
||||
},
|
||||
});
|
||||
} catch {
|
||||
// Recovery remains independent from diagnostics.
|
||||
}
|
||||
try {
|
||||
outputPorts.telemetry.emit("release.mismatch.detected", {
|
||||
build_id: current.buildId,
|
||||
active_release_id: active.releaseId,
|
||||
mismatch_kind: mismatchKind,
|
||||
});
|
||||
} catch {
|
||||
// Recovery remains independent from telemetry.
|
||||
}
|
||||
}
|
||||
if (!active.routeChunks[input.chunkId]) {
|
||||
return {
|
||||
action: "support" as const,
|
||||
|
||||
Reference in New Issue
Block a user