veryfront 0.1.1037 → 0.1.1039
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/deno.js +1 -1
- package/esm/src/observability/request-profiler.d.ts.map +1 -1
- package/esm/src/observability/request-profiler.js +10 -2
- package/esm/src/rendering/renderer.d.ts.map +1 -1
- package/esm/src/rendering/renderer.js +20 -1
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +1 -1
- package/esm/src/server/runtime-handler/request-lifecycle.d.ts +2 -1
- package/esm/src/server/runtime-handler/request-lifecycle.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/request-lifecycle.js +2 -2
- package/esm/src/server/runtime-handler/request-tracker.d.ts +2 -1
- package/esm/src/server/runtime-handler/request-tracker.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/request-tracker.js +38 -3
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +4 -4
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-profiler.d.ts","sourceRoot":"","sources":["../../../src/src/observability/request-profiler.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"request-profiler.d.ts","sourceRoot":"","sources":["../../../src/src/observability/request-profiler.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+CD,wBAAgB,yBAAyB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAQpE;AAED,wBAAsB,uBAAuB,CAAC,CAAC,EAC7C,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAWpF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,IAAI,CAK1E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAWhE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,2BAA2B,GAAG,IAAI,CAMrF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAsBrF;AAUD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAQ5E;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,oBAAoB,GAAG,IAAI,GAClC,QAAQ,CAiBV;AAED,wBAAgB,uBAAuB,IAAI;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC,CAOA;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
|
|
@@ -13,6 +13,9 @@ function shouldEnableProfiling() {
|
|
|
13
13
|
function shouldEnableServerTiming() {
|
|
14
14
|
return getEnv("VERYFRONT_ENABLE_SERVER_TIMING") === "1";
|
|
15
15
|
}
|
|
16
|
+
function shouldEnableSlowRequestProfiling() {
|
|
17
|
+
return getEnv("VERYFRONT_DISABLE_SLOW_REQUEST_PROFILING") !== "1";
|
|
18
|
+
}
|
|
16
19
|
function isHtmlPath(pathname) {
|
|
17
20
|
return !pathname.startsWith("/_") && !pathname.startsWith("/api/") &&
|
|
18
21
|
!/\.[a-zA-Z0-9]+$/.test(pathname);
|
|
@@ -26,10 +29,14 @@ function shouldProfilePath(pathname) {
|
|
|
26
29
|
(shouldEnableServerTiming() && isHtmlPath(pathname));
|
|
27
30
|
}
|
|
28
31
|
export function isRequestProfilingEnabled(pathname) {
|
|
29
|
-
|
|
32
|
+
const explicitProfiling = shouldEnableProfiling() || shouldEnableServerTiming();
|
|
33
|
+
const slowRequestProfiling = shouldEnableSlowRequestProfiling();
|
|
34
|
+
if (!explicitProfiling && !slowRequestProfiling)
|
|
30
35
|
return false;
|
|
31
36
|
if (!pathname)
|
|
32
37
|
return true;
|
|
38
|
+
if (slowRequestProfiling && isHtmlPath(pathname))
|
|
39
|
+
return true;
|
|
33
40
|
return shouldProfilePath(pathname);
|
|
34
41
|
}
|
|
35
42
|
export async function runWithRequestProfiling(options, fn) {
|
|
@@ -139,7 +146,8 @@ export function withServerTimingHeader(response, record) {
|
|
|
139
146
|
}
|
|
140
147
|
export function snapshotRequestProfiles() {
|
|
141
148
|
return {
|
|
142
|
-
enabled: shouldEnableProfiling() || shouldEnableServerTiming()
|
|
149
|
+
enabled: shouldEnableProfiling() || shouldEnableServerTiming() ||
|
|
150
|
+
shouldEnableSlowRequestProfiling(),
|
|
143
151
|
last_sequence: sequence,
|
|
144
152
|
records: [...records],
|
|
145
153
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/renderer.ts"],"names":[],"mappings":"AA8CA,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAgBzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA4CxD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -94,6 +94,23 @@ function prewarmSlugDepth(slug) {
|
|
|
94
94
|
return 0;
|
|
95
95
|
return comparable.split("/").filter(Boolean).length;
|
|
96
96
|
}
|
|
97
|
+
function prewarmSlugSegments(slug) {
|
|
98
|
+
const comparable = normalizeComparableSlug(slug);
|
|
99
|
+
if (comparable === "/")
|
|
100
|
+
return [];
|
|
101
|
+
return comparable.split("/").filter(Boolean);
|
|
102
|
+
}
|
|
103
|
+
function prewarmRouteFamilyRank(currentSlug, candidateSlug) {
|
|
104
|
+
const currentSegments = prewarmSlugSegments(currentSlug);
|
|
105
|
+
if (currentSegments.length === 0)
|
|
106
|
+
return 0;
|
|
107
|
+
const candidateSegments = prewarmSlugSegments(candidateSlug);
|
|
108
|
+
if (candidateSegments[0] !== currentSegments[0])
|
|
109
|
+
return 2;
|
|
110
|
+
if (currentSegments.length < 2)
|
|
111
|
+
return 0;
|
|
112
|
+
return candidateSegments[1] === currentSegments[1] ? 0 : 1;
|
|
113
|
+
}
|
|
97
114
|
function selectPrewarmSlugs(currentSlug, pages) {
|
|
98
115
|
const currentComparable = normalizeComparableSlug(currentSlug);
|
|
99
116
|
const seen = new Set();
|
|
@@ -107,7 +124,9 @@ function selectPrewarmSlugs(currentSlug, pages) {
|
|
|
107
124
|
seen.add(comparable);
|
|
108
125
|
candidates.push({ comparable });
|
|
109
126
|
}
|
|
110
|
-
candidates.sort((a, b) =>
|
|
127
|
+
candidates.sort((a, b) => prewarmRouteFamilyRank(currentComparable, a.comparable) -
|
|
128
|
+
prewarmRouteFamilyRank(currentComparable, b.comparable) ||
|
|
129
|
+
prewarmSlugDepth(a.comparable) - prewarmSlugDepth(b.comparable) ||
|
|
111
130
|
a.comparable.localeCompare(b.comparable));
|
|
112
131
|
return candidates.map(({ comparable }) => comparable);
|
|
113
132
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAmCpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAoErE,OAAO,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAMtF,2CAA2C;AAC3C,eAAO,MAAM,aAAa,4vBAqChB,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA6CD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,mBAAwB,GAC7B;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAuB5D;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8FAA8F;IAC9F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CAC/C;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,qBAAsC,GAC3C,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAmCpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAoErE,OAAO,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAMtF,2CAA2C;AAC3C,eAAO,MAAM,aAAa,4vBAqChB,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA6CD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,mBAAwB,GAC7B;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAuB5D;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8FAA8F;IAC9F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CAC/C;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,qBAAsC,GAC3C,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA8cnE;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -512,7 +512,7 @@ export function createVeryfrontHandler(projectDir, adapter, opts = { projectDir
|
|
|
512
512
|
mode: headers.environment || "unknown",
|
|
513
513
|
});
|
|
514
514
|
const isTimeout = response.status === HTTP_GATEWAY_TIMEOUT;
|
|
515
|
-
completeRequestTracking(lifecycle.requestId, response.status, isTimeout);
|
|
515
|
+
completeRequestTracking(lifecycle.requestId, response.status, isTimeout, requestProfileRecord);
|
|
516
516
|
completeIsolatedRequest(headers.projectSlug, lifecycle.shouldCheckIsolation, isTimeout);
|
|
517
517
|
return withServerTimingHeader(response, requestProfileRecord);
|
|
518
518
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @module server/runtime-handler/request-lifecycle
|
|
8
8
|
*/
|
|
9
9
|
import { timeAsync } from "../../utils/index.js";
|
|
10
|
+
import type { RequestProfileRecord } from "../../observability/request-profiler.js";
|
|
10
11
|
interface RequestLifecycleContext {
|
|
11
12
|
/** Request ID for tracking */
|
|
12
13
|
requestId: string;
|
|
@@ -41,7 +42,7 @@ export declare function endContentMetrics(info: {
|
|
|
41
42
|
/**
|
|
42
43
|
* Complete request tracking and record completion status.
|
|
43
44
|
*/
|
|
44
|
-
export declare function completeRequestTracking(requestId: string, status: number, isTimeout: boolean): void;
|
|
45
|
+
export declare function completeRequestTracking(requestId: string, status: number, isTimeout: boolean, profile?: RequestProfileRecord | null): void;
|
|
45
46
|
/**
|
|
46
47
|
* End request lifecycle tracking.
|
|
47
48
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/request-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,SAAS,EACV,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"request-lifecycle.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/request-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,SAAS,EACV,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAEpF,UAAU,uBAAuB;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iDAAiD;IACjD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,kDAAkD;IAClD,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,GACrB,uBAAuB,CAiBzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAEP;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,GACpC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,uBAAuB,GAAG,IAAI,CAGtE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7D;AAGD,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -52,8 +52,8 @@ export function endContentMetrics(info) {
|
|
|
52
52
|
/**
|
|
53
53
|
* Complete request tracking and record completion status.
|
|
54
54
|
*/
|
|
55
|
-
export function completeRequestTracking(requestId, status, isTimeout) {
|
|
56
|
-
requestTracker.complete(requestId, status, isTimeout);
|
|
55
|
+
export function completeRequestTracking(requestId, status, isTimeout, profile) {
|
|
56
|
+
requestTracker.complete(requestId, status, isTimeout, profile);
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* End request lifecycle tracking.
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Helps identify when the event loop is blocked or requests are hanging.
|
|
6
6
|
*/
|
|
7
7
|
import * as dntShim from "../../../_dnt.shims.js";
|
|
8
|
+
import type { RequestProfileRecord } from "../../observability/request-profiler.js";
|
|
8
9
|
interface TrackedRequest {
|
|
9
10
|
requestId: string;
|
|
10
11
|
projectSlug: string | undefined;
|
|
@@ -25,7 +26,7 @@ declare class RequestTracker {
|
|
|
25
26
|
constructor();
|
|
26
27
|
private startStatusLogging;
|
|
27
28
|
start(requestId: string, projectSlug: string | undefined, path: string, method: string, env?: string, releaseId?: string): void;
|
|
28
|
-
complete(requestId: string, statusCode: number, timedOut?: boolean): void;
|
|
29
|
+
complete(requestId: string, statusCode: number, timedOut?: boolean, profile?: RequestProfileRecord | null): void;
|
|
29
30
|
getInFlightCount(): number;
|
|
30
31
|
getInFlightRequests(): TrackedRequest[];
|
|
31
32
|
getStats(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-tracker.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/request-tracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"request-tracker.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/request-tracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAMlD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAKpF,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;CACvD;AAmDD,cAAM,cAAc;IAClB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,cAAc,CAAqD;IAC3E,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAK;;IAM1B,OAAO,CAAC,kBAAkB;IA4B1B,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAuDP,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,UAAQ,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,GACpC,IAAI;IAsCP,gBAAgB,IAAI,MAAM;IAI1B,mBAAmB,IAAI,cAAc,EAAE;IAIvC,QAAQ,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAS9E,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsD7E,QAAQ,IAAI,IAAI;CAUjB;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -8,6 +8,7 @@ import * as dntShim from "../../../_dnt.shims.js";
|
|
|
8
8
|
import { serverLogger } from "../../utils/index.js";
|
|
9
9
|
import { unrefTimer } from "../../platform/compat/process.js";
|
|
10
10
|
import { isLightweightPath, isWebSocketPath } from "./request-utils.js";
|
|
11
|
+
import { getEnv } from "../../platform/compat/process.js";
|
|
11
12
|
const logger = serverLogger.component("request-tracker");
|
|
12
13
|
/** Threshold in ms before logging a warning about a slow request */
|
|
13
14
|
const SLOW_REQUEST_THRESHOLD_MS = 10_000; // 10 seconds
|
|
@@ -19,6 +20,36 @@ const STATUS_LOG_INTERVAL_MS = 30_000; // 30 seconds
|
|
|
19
20
|
const DRAIN_PROGRESS_LOG_INTERVAL_MS = 5_000; // 5 seconds
|
|
20
21
|
/** Only log module requests that exceed this duration (to reduce noise) */
|
|
21
22
|
const MODULE_REQUEST_LOG_THRESHOLD_MS = 100;
|
|
23
|
+
/** Attach request-profiler details to completion logs at or above this duration. */
|
|
24
|
+
const DEFAULT_SLOW_REQUEST_PROFILE_LOG_THRESHOLD_MS = 2_000;
|
|
25
|
+
function getSlowRequestProfileLogThresholdMs() {
|
|
26
|
+
const raw = getEnv("VERYFRONT_SLOW_REQUEST_PROFILE_LOG_THRESHOLD_MS");
|
|
27
|
+
if (!raw)
|
|
28
|
+
return DEFAULT_SLOW_REQUEST_PROFILE_LOG_THRESHOLD_MS;
|
|
29
|
+
const parsed = Number(raw);
|
|
30
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
31
|
+
return DEFAULT_SLOW_REQUEST_PROFILE_LOG_THRESHOLD_MS;
|
|
32
|
+
}
|
|
33
|
+
return parsed;
|
|
34
|
+
}
|
|
35
|
+
function buildRequestProfileLogContext(record) {
|
|
36
|
+
const slowestPhases = Object.entries(record.phases)
|
|
37
|
+
.sort(([, left], [, right]) => right - left)
|
|
38
|
+
.slice(0, 10)
|
|
39
|
+
.map(([name, durationMs]) => ({ name, durationMs }));
|
|
40
|
+
return {
|
|
41
|
+
sequence: record.sequence,
|
|
42
|
+
category: record.category,
|
|
43
|
+
method: record.method,
|
|
44
|
+
pathname: record.pathname,
|
|
45
|
+
projectSlug: record.projectSlug,
|
|
46
|
+
requestMode: record.requestMode,
|
|
47
|
+
status: record.status,
|
|
48
|
+
totalMs: record.totalMs,
|
|
49
|
+
phases: record.phases,
|
|
50
|
+
slowestPhases,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
22
53
|
class RequestTracker {
|
|
23
54
|
inFlight = new Map();
|
|
24
55
|
statusInterval;
|
|
@@ -105,7 +136,7 @@ class RequestTracker {
|
|
|
105
136
|
inFlightCount: this.inFlight.size,
|
|
106
137
|
});
|
|
107
138
|
}
|
|
108
|
-
complete(requestId, statusCode, timedOut = false) {
|
|
139
|
+
complete(requestId, statusCode, timedOut = false, profile) {
|
|
109
140
|
const tracked = this.inFlight.get(requestId);
|
|
110
141
|
if (!tracked)
|
|
111
142
|
return;
|
|
@@ -125,7 +156,7 @@ class RequestTracker {
|
|
|
125
156
|
}
|
|
126
157
|
return;
|
|
127
158
|
}
|
|
128
|
-
|
|
159
|
+
const logContext = {
|
|
129
160
|
project_slug: tracked.projectSlug,
|
|
130
161
|
request_url: tracked.path,
|
|
131
162
|
durationMs,
|
|
@@ -133,7 +164,11 @@ class RequestTracker {
|
|
|
133
164
|
statusCode,
|
|
134
165
|
env: tracked.env,
|
|
135
166
|
release_id: tracked.releaseId,
|
|
136
|
-
}
|
|
167
|
+
};
|
|
168
|
+
if (profile && durationMs >= getSlowRequestProfileLogThresholdMs()) {
|
|
169
|
+
logContext.request_profile = buildRequestProfileLogContext(profile);
|
|
170
|
+
}
|
|
171
|
+
logger.info(`${tracked.method} ${tracked.path} ${statusCode}`, logContext);
|
|
137
172
|
}
|
|
138
173
|
getInFlightCount() {
|
|
139
174
|
return this.inFlight.size;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1039",
|
|
4
4
|
"description": "The simplest way to build AI-powered apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -330,9 +330,9 @@
|
|
|
330
330
|
"@types/react": "19.2.14",
|
|
331
331
|
"@types/react-dom": "19.2.3",
|
|
332
332
|
"ws": "8.21.0",
|
|
333
|
-
"@veryfront/ext-bundler-esbuild": "0.1.
|
|
334
|
-
"@veryfront/ext-content-mdx": "0.1.
|
|
335
|
-
"@veryfront/ext-css-tailwind": "0.1.
|
|
333
|
+
"@veryfront/ext-bundler-esbuild": "0.1.1039",
|
|
334
|
+
"@veryfront/ext-content-mdx": "0.1.1039",
|
|
335
|
+
"@veryfront/ext-css-tailwind": "0.1.1039"
|
|
336
336
|
},
|
|
337
337
|
"devDependencies": {
|
|
338
338
|
"@types/node": "20.9.0"
|