mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-25 16:42:16 +03:00
The structural admission gate (src/shared/middleware/chatBodyAdmission.ts — the bounded heavyweight lease + healthy-headroom path from #10110/#10437) returns its 503 chat_admission_busy BEFORE request logging, so a shed left no trace: no counter, no log line, and the process-wide snapshot was never consumed by any route. This adds pure observability — admission behavior, defaults, and thresholds are untouched. - chatBodyAdmission.ts: in-memory shed history (shedTotal + shedsByReason) on ChatAdmissionController, recorded at the two capacity-driven give-up points in acquireHeavyWithin (queue_timeout when the bounded wait expires, queued_bytes_budget when the heap valve refuses to park). A client abort mid-wait is deliberately not counted — capacity was never denied. Each shed also emits exactly one structured pino warn (module chat-admission) with reason/activeHeavy/waiting/queuedBytes and the HMAC session fingerprint — never a raw credential. PerConnectionAdmission Controller.snapshot() now carries the counters plus activeHealthyHeadroom. - /api/monitoring/health: the structural snapshot is exposed under a new additive chatAdmission key next to the existing adaptiveAdmission (the shadow-mode layer) — allowlisted projection in observability.ts, nothing removed from the current payload. - Tests: tests/unit/chat-admission-visibility-11244.test.ts (RED→GREEN: shed counting per reason, abort exclusion, snapshot shape, and the warn log carrying the fingerprint but never the raw API key) + a chatAdmission allowlist-projection test in observability-payloads.test.ts. Co-authored-by: Xiangzhe <bakryun0718@proton.me>
This commit is contained in:
committed by
GitHub
parent
92a083ab8c
commit
7c2dba0b9b
@@ -3,9 +3,48 @@ import {
|
||||
getCodexParentAccountDiagnostic,
|
||||
} from "@omniroute/open-sse/services/codexAccount/index.ts";
|
||||
import type { AdaptiveAdmissionPublicSnapshot } from "@omniroute/open-sse/services/admission/runtime.ts";
|
||||
import type { PerConnectionAdmissionController } from "@/shared/middleware/chatBodyAdmission";
|
||||
|
||||
type JsonRecord = Record<string, unknown>;
|
||||
|
||||
/** Process-wide structural chat-admission snapshot type (chatBodyAdmission.ts). */
|
||||
export type ChatAdmissionSnapshot = ReturnType<PerConnectionAdmissionController["snapshot"]>;
|
||||
|
||||
/**
|
||||
* Low-card structural chat-admission health summary (#11244) — the bounded
|
||||
* heavyweight-lease gate from chatBodyAdmission.ts (#10110/#10437), NOT the
|
||||
* adaptive shadow-mode layer above. Lane keys are opaque HMAC fairness
|
||||
* fingerprints (resolveSessionId), never raw credentials.
|
||||
*/
|
||||
export type ChatAdmissionHealthSummary = {
|
||||
activeHeavy: number;
|
||||
activeHealthyHeadroom: number;
|
||||
waiting: number;
|
||||
queuedBytes: number;
|
||||
shedTotal: number;
|
||||
shedsByReason: Record<string, number>;
|
||||
lanes: Array<{ key: string; waiting: number }>;
|
||||
};
|
||||
|
||||
/**
|
||||
* Explicit allowlisted projection of the structural admission snapshot.
|
||||
* Never spreads the snapshot — only the documented low-cardinality fields pass.
|
||||
*/
|
||||
export function projectChatAdmissionSummary(
|
||||
snapshot: ChatAdmissionSnapshot | null | undefined
|
||||
): ChatAdmissionHealthSummary | null {
|
||||
if (!snapshot || typeof snapshot !== "object") return null;
|
||||
return {
|
||||
activeHeavy: snapshot.activeHeavy,
|
||||
activeHealthyHeadroom: snapshot.activeHealthyHeadroom,
|
||||
waiting: snapshot.waiting,
|
||||
queuedBytes: snapshot.queuedBytes,
|
||||
shedTotal: snapshot.shedTotal,
|
||||
shedsByReason: { ...(snapshot.shedsByReason ?? {}) },
|
||||
lanes: (snapshot.lanes ?? []).map((lane) => ({ key: lane.key, waiting: lane.waiting })),
|
||||
};
|
||||
}
|
||||
|
||||
/** Low-card adaptive-admission health summary — no tenant/request/body/queue details. */
|
||||
export type AdaptiveAdmissionHealthSummary = {
|
||||
mode: AdaptiveAdmissionPublicSnapshot["mode"];
|
||||
@@ -160,6 +199,8 @@ interface BuildHealthPayloadOptions {
|
||||
};
|
||||
/** Optional injected public adaptive-admission snapshot; projected, never raw-spread. */
|
||||
adaptiveAdmission?: AdaptiveAdmissionPublicSnapshot | null;
|
||||
/** #11244: optional structural chat-admission snapshot; projected, never raw-spread. */
|
||||
chatAdmission?: ChatAdmissionSnapshot | null;
|
||||
}
|
||||
|
||||
function limitMonitors(monitors: QuotaMonitorSnapshot[], maxItems = 8): QuotaMonitorSnapshot[] {
|
||||
@@ -347,6 +388,7 @@ export function buildHealthPayload({
|
||||
activeSessionsByKey = {},
|
||||
credentialHealth,
|
||||
adaptiveAdmission = null,
|
||||
chatAdmission = null,
|
||||
buildSha = null,
|
||||
}: BuildHealthPayloadOptions) {
|
||||
const timestamp = new Date().toISOString();
|
||||
@@ -449,6 +491,9 @@ export function buildHealthPayload({
|
||||
sessions: buildSessionsSummary({ activeSessions, activeSessionsByKey }),
|
||||
credentialHealth, // may be undefined if credentialHealth module not loaded
|
||||
adaptiveAdmission: projectAdaptiveAdmissionSummary(adaptiveAdmission),
|
||||
// #11244: the STRUCTURAL gate (chatBodyAdmission.ts) next to the adaptive one —
|
||||
// distinct key so clients reading `adaptiveAdmission` are untouched.
|
||||
chatAdmission: projectChatAdmissionSummary(chatAdmission),
|
||||
dedup: {
|
||||
inflightRequests,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user