forge-sql-orm 2.1.15 → 2.1.17
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/README.md +194 -1
- package/dist/async/PrintQueryConsumer.d.ts +98 -0
- package/dist/async/PrintQueryConsumer.d.ts.map +1 -0
- package/dist/async/PrintQueryConsumer.js +89 -0
- package/dist/async/PrintQueryConsumer.js.map +1 -0
- package/dist/core/ForgeSQLQueryBuilder.d.ts +2 -3
- package/dist/core/ForgeSQLQueryBuilder.d.ts.map +1 -1
- package/dist/core/ForgeSQLQueryBuilder.js.map +1 -1
- package/dist/core/ForgeSQLSelectOperations.d.ts +2 -1
- package/dist/core/ForgeSQLSelectOperations.d.ts.map +1 -1
- package/dist/core/ForgeSQLSelectOperations.js.map +1 -1
- package/dist/core/Rovo.d.ts +40 -0
- package/dist/core/Rovo.d.ts.map +1 -1
- package/dist/core/Rovo.js +164 -138
- package/dist/core/Rovo.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/drizzle/extensions/additionalActions.d.ts.map +1 -1
- package/dist/lib/drizzle/extensions/additionalActions.js +72 -22
- package/dist/lib/drizzle/extensions/additionalActions.js.map +1 -1
- package/dist/utils/cacheTableUtils.d.ts +11 -0
- package/dist/utils/cacheTableUtils.d.ts.map +1 -0
- package/dist/utils/cacheTableUtils.js +450 -0
- package/dist/utils/cacheTableUtils.js.map +1 -0
- package/dist/utils/cacheUtils.d.ts.map +1 -1
- package/dist/utils/cacheUtils.js +3 -22
- package/dist/utils/cacheUtils.js.map +1 -1
- package/dist/utils/forgeDriver.d.ts.map +1 -1
- package/dist/utils/forgeDriver.js +5 -12
- package/dist/utils/forgeDriver.js.map +1 -1
- package/dist/utils/forgeDriverProxy.js +7 -5
- package/dist/utils/forgeDriverProxy.js.map +1 -1
- package/dist/utils/metadataContextUtils.d.ts +44 -4
- package/dist/utils/metadataContextUtils.d.ts.map +1 -1
- package/dist/utils/metadataContextUtils.js +155 -50
- package/dist/utils/metadataContextUtils.js.map +1 -1
- package/dist/utils/sqlUtils.d.ts +3 -1
- package/dist/utils/sqlUtils.d.ts.map +1 -1
- package/dist/utils/sqlUtils.js +264 -144
- package/dist/utils/sqlUtils.js.map +1 -1
- package/dist/webtriggers/applyMigrationsWebTrigger.js +1 -1
- package/package.json +14 -13
- package/src/async/PrintQueryConsumer.ts +114 -0
- package/src/core/ForgeSQLQueryBuilder.ts +2 -2
- package/src/core/ForgeSQLSelectOperations.ts +2 -1
- package/src/core/Rovo.ts +209 -167
- package/src/index.ts +2 -3
- package/src/lib/drizzle/extensions/additionalActions.ts +98 -42
- package/src/utils/cacheTableUtils.ts +511 -0
- package/src/utils/cacheUtils.ts +3 -25
- package/src/utils/forgeDriver.ts +5 -11
- package/src/utils/forgeDriverProxy.ts +9 -9
- package/src/utils/metadataContextUtils.ts +169 -52
- package/src/utils/sqlUtils.ts +372 -177
- package/src/webtriggers/applyMigrationsWebTrigger.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheUtils.d.ts","sourceRoot":"","sources":["../../src/utils/cacheUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"cacheUtils.d.ts","sourceRoot":"","sources":["../../src/utils/cacheUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA4ClE;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAK5C;AAmKD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,CAAC,SAAS,aAAa,EACtD,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAoBf;AACD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBlF;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,KAAK,CAAA;CAAE,EAC7B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CA6CxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,KAAK,CAAA;CAAE,EAC7B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
|
package/dist/utils/cacheUtils.js
CHANGED
|
@@ -44,6 +44,7 @@ const crypto = __importStar(require("node:crypto"));
|
|
|
44
44
|
const table_1 = require("drizzle-orm/table");
|
|
45
45
|
const kvs_1 = require("@forge/kvs");
|
|
46
46
|
const cacheContextUtils_1 = require("./cacheContextUtils");
|
|
47
|
+
const cacheTableUtils_1 = require("./cacheTableUtils");
|
|
47
48
|
// Constants for better maintainability
|
|
48
49
|
const CACHE_CONSTANTS = {
|
|
49
50
|
BATCH_SIZE: 25,
|
|
@@ -76,26 +77,6 @@ function nowPlusSeconds(secondsToAdd) {
|
|
|
76
77
|
const dt = luxon_1.DateTime.now().plus({ seconds: secondsToAdd });
|
|
77
78
|
return Math.floor(dt.toSeconds());
|
|
78
79
|
}
|
|
79
|
-
/**
|
|
80
|
-
* Extracts all table/column names between backticks from SQL query and returns them as comma-separated string.
|
|
81
|
-
*
|
|
82
|
-
* @param sql - SQL query string
|
|
83
|
-
* @returns Comma-separated string of unique backticked values
|
|
84
|
-
*/
|
|
85
|
-
function extractBacktickedValues(sql) {
|
|
86
|
-
const regex = /`([^`]+)`/g;
|
|
87
|
-
const matches = new Set();
|
|
88
|
-
let match;
|
|
89
|
-
while ((match = regex.exec(sql.toLowerCase())) !== null) {
|
|
90
|
-
if (!match[1].startsWith("a_")) {
|
|
91
|
-
matches.add(`\`${match[1]}\``);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Sort to ensure consistent order for the same input
|
|
95
|
-
return Array.from(matches)
|
|
96
|
-
.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: "base", numeric: true }))
|
|
97
|
-
.join(",");
|
|
98
|
-
}
|
|
99
80
|
/**
|
|
100
81
|
* Generates a hash key for a query based on its SQL and parameters.
|
|
101
82
|
*
|
|
@@ -320,7 +301,7 @@ async function getFromCache(query, options) {
|
|
|
320
301
|
const cacheResult = (await kvs_1.kvs.entity(options.cacheEntityName).get(key));
|
|
321
302
|
if (cacheResult &&
|
|
322
303
|
cacheResult[expirationName] >= getCurrentTime() &&
|
|
323
|
-
extractBacktickedValues(sqlQuery.sql) === cacheResult[entityQueryName]) {
|
|
304
|
+
(0, cacheTableUtils_1.extractBacktickedValues)(sqlQuery.sql, options) === cacheResult[entityQueryName]) {
|
|
324
305
|
if (options.logCache) {
|
|
325
306
|
// eslint-disable-next-line no-console
|
|
326
307
|
console.warn(`Get value from cache, cacheKey: ${key}`);
|
|
@@ -365,7 +346,7 @@ async function setCacheResult(query, options, results, cacheTtl) {
|
|
|
365
346
|
await kvs_1.kvs
|
|
366
347
|
.transact()
|
|
367
348
|
.set(key, {
|
|
368
|
-
[entityQueryName]: extractBacktickedValues(sqlQuery.sql),
|
|
349
|
+
[entityQueryName]: (0, cacheTableUtils_1.extractBacktickedValues)(sqlQuery.sql, options),
|
|
369
350
|
[expirationName]: nowPlusSeconds(cacheTtl),
|
|
370
351
|
[dataName]: JSON.stringify(results),
|
|
371
352
|
}, { entityName: options.cacheEntityName })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheUtils.js","sourceRoot":"","sources":["../../src/utils/cacheUtils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cacheUtils.js","sourceRoot":"","sources":["../../src/utils/cacheUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forgeDriver.d.ts","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"forgeDriver.d.ts","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAStD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,mBAAmB,CAO9E;AAiGD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,MAAM,EACb,QAAQ,OAAO,EAAE,GAAG,SAAS,EAC7B,QAAQ,WAAW,KAClB,OAAO,CAAC,iBAAiB,CAsB3B,CAAC"}
|
|
@@ -6,6 +6,7 @@ const sql_1 = require("@forge/sql");
|
|
|
6
6
|
const metadataContextUtils_1 = require("./metadataContextUtils");
|
|
7
7
|
const requestTypeContextUtils_1 = require("./requestTypeContextUtils");
|
|
8
8
|
const sqlUtils_1 = require("./sqlUtils");
|
|
9
|
+
const sql_2 = require("@forge/sql/out/sql");
|
|
9
10
|
const timeoutMs = 10000;
|
|
10
11
|
const timeoutMessage = `Atlassian @forge/sql did not return a response within ${timeoutMs}ms (${timeoutMs / 1000} seconds), so the request is blocked. Possible causes: slow query, network issues, or exceeding Forge SQL limits.`;
|
|
11
12
|
/**
|
|
@@ -20,17 +21,6 @@ function isUpdateQueryResponse(obj) {
|
|
|
20
21
|
typeof obj.affectedRows === "number" &&
|
|
21
22
|
typeof obj.insertId === "number");
|
|
22
23
|
}
|
|
23
|
-
function inlineParams(sql, params) {
|
|
24
|
-
let i = 0;
|
|
25
|
-
return sql.replace(/\?/g, () => {
|
|
26
|
-
const val = params[i++];
|
|
27
|
-
if (val === null)
|
|
28
|
-
return "NULL";
|
|
29
|
-
if (typeof val === "number")
|
|
30
|
-
return val.toString();
|
|
31
|
-
return `'${String(val).replace(/'/g, "''")}'`;
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
24
|
/**
|
|
35
25
|
* Processes DDL query results and saves metadata to the execution context.
|
|
36
26
|
*
|
|
@@ -129,7 +119,10 @@ const forgeDriver = async (query, params, method) => {
|
|
|
129
119
|
const operationType = await (0, requestTypeContextUtils_1.getOperationType)();
|
|
130
120
|
// Handle DDL operations
|
|
131
121
|
if (operationType === "DDL") {
|
|
132
|
-
const result = await (0, sqlUtils_1.withTimeout)(sql_1.sql
|
|
122
|
+
const result = await (0, sqlUtils_1.withTimeout)(sql_1.sql
|
|
123
|
+
.prepare(query, sql_2.SQL_API_ENDPOINTS.EXECUTE_DDL)
|
|
124
|
+
.bindParams(params ?? [])
|
|
125
|
+
.execute(), timeoutMessage, timeoutMs);
|
|
133
126
|
return await processDDLResult(query, params ?? [], method, result);
|
|
134
127
|
}
|
|
135
128
|
// Handle execute method (UPDATE, INSERT, DELETE)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forgeDriver.js","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"forgeDriver.js","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,11 @@ function createForgeDriverProxy(forgeSqlOperation, options, logRawSqlQuery) {
|
|
|
40
40
|
const isTimeoutError = error.code === QUERY_ERROR_CODES.TIMEOUT;
|
|
41
41
|
const isOutOfMemoryError = error?.context?.debug?.errno === QUERY_ERROR_CODES.OUT_OF_MEMORY_ERRNO;
|
|
42
42
|
if (isTimeoutError || isOutOfMemoryError) {
|
|
43
|
+
// Wait for CLUSTER_STATEMENTS_SUMMARY to be populated with our failed query data
|
|
44
|
+
await new Promise((resolve) => setTimeout(resolve, STATEMENTS_SUMMARY_DELAY_MS));
|
|
45
|
+
const queryEndTime = Date.now();
|
|
46
|
+
const queryDuration = queryEndTime - queryStartTime;
|
|
47
|
+
let errorType = "TIMEOUT";
|
|
43
48
|
if (isTimeoutError) {
|
|
44
49
|
// eslint-disable-next-line no-console
|
|
45
50
|
console.error(` TIMEOUT detected - Query exceeded time limit`);
|
|
@@ -47,13 +52,10 @@ function createForgeDriverProxy(forgeSqlOperation, options, logRawSqlQuery) {
|
|
|
47
52
|
else {
|
|
48
53
|
// eslint-disable-next-line no-console
|
|
49
54
|
console.error(`OUT OF MEMORY detected - Query exceeded memory limit`);
|
|
55
|
+
errorType = "OOM";
|
|
50
56
|
}
|
|
51
|
-
// Wait for CLUSTER_STATEMENTS_SUMMARY to be populated with our failed query data
|
|
52
|
-
await new Promise((resolve) => setTimeout(resolve, STATEMENTS_SUMMARY_DELAY_MS));
|
|
53
|
-
const queryEndTime = Date.now();
|
|
54
|
-
const queryDuration = queryEndTime - queryStartTime;
|
|
55
57
|
// Analyze the failed query using CLUSTER_STATEMENTS_SUMMARY
|
|
56
|
-
await (0, sqlUtils_1.
|
|
58
|
+
await (0, sqlUtils_1.handleErrorsWithPlan)(forgeSqlOperation, queryDuration, errorType);
|
|
57
59
|
}
|
|
58
60
|
// Log SQL error details if requested
|
|
59
61
|
if (logRawSqlQuery) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forgeDriverProxy.js","sourceRoot":"","sources":["../../src/utils/forgeDriverProxy.ts"],"names":[],"mappings":";;AAyBA,wDA8DC;AAvFD,+CAA4C;AAC5C,yCAAsD;AAEtD,yCAAkD;AAElD;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,mBAAmB;IAC5B,mBAAmB,EAAE,IAAI;CACjB,CAAC;AAEX;;GAEG;AACH,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAExC;;;;;;GAMG;AACH,SAAgB,sBAAsB,CACpC,iBAAoC,EACpC,OAAkB,EAClB,cAAwB;IAExB,OAAO,KAAK,EACV,KAAa,EACb,MAAa,EACb,MAAyB,EAKxB,EAAE;QACH,kCAAkC;QAClC,MAAM,aAAa,GAAG,IAAA,yBAAc,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,OAAO,IAAI,cAAc,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YACzD,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,aAAa,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,wCAAwC;YACxC,OAAO,MAAM,IAAA,yBAAW,EAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,4EAA4E;YAC5E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,OAAO,CAAC;YAChE,MAAM,kBAAkB,GACtB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,iBAAiB,CAAC,mBAAmB,CAAC;YAEzE,IAAI,cAAc,IAAI,kBAAkB,EAAE,CAAC;gBACzC,IAAI,
|
|
1
|
+
{"version":3,"file":"forgeDriverProxy.js","sourceRoot":"","sources":["../../src/utils/forgeDriverProxy.ts"],"names":[],"mappings":";;AAyBA,wDA8DC;AAvFD,+CAA4C;AAC5C,yCAAsD;AAEtD,yCAAkD;AAElD;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,OAAO,EAAE,mBAAmB;IAC5B,mBAAmB,EAAE,IAAI;CACjB,CAAC;AAEX;;GAEG;AACH,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAExC;;;;;;GAMG;AACH,SAAgB,sBAAsB,CACpC,iBAAoC,EACpC,OAAkB,EAClB,cAAwB;IAExB,OAAO,KAAK,EACV,KAAa,EACb,MAAa,EACb,MAAyB,EAKxB,EAAE;QACH,kCAAkC;QAClC,MAAM,aAAa,GAAG,IAAA,yBAAc,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,OAAO,IAAI,cAAc,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YACzD,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,aAAa,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,wCAAwC;YACxC,OAAO,MAAM,IAAA,yBAAW,EAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,4EAA4E;YAC5E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,OAAO,CAAC;YAChE,MAAM,kBAAkB,GACtB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,iBAAiB,CAAC,mBAAmB,CAAC;YAEzE,IAAI,cAAc,IAAI,kBAAkB,EAAE,CAAC;gBACzC,iFAAiF;gBACjF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC;gBAEjF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;gBACpD,IAAI,SAAS,GAAsB,SAAS,CAAC;gBAC7C,IAAI,cAAc,EAAE,CAAC;oBACnB,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;oBACtE,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;gBACD,4DAA4D;gBAC5D,MAAM,IAAA,+BAAoB,EAAC,iBAAiB,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YAC1E,CAAC;YAED,qCAAqC;YACrC,IAAI,cAAc,EAAE,CAAC;gBACnB,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,8BAA8B;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
2
|
import { ForgeSQLMetadata } from "./forgeDriver";
|
|
3
3
|
import { ForgeSqlOperation } from "../core/ForgeSQLQueryBuilder";
|
|
4
|
-
|
|
4
|
+
import { AsyncEventPrintQuery } from "../async/PrintQueryConsumer";
|
|
5
|
+
export type Statistic = {
|
|
5
6
|
query: string;
|
|
6
7
|
params: unknown[];
|
|
7
8
|
metadata: ForgeSQLMetadata;
|
|
@@ -13,6 +14,7 @@ export type MetadataQueryOptions = {
|
|
|
13
14
|
topQueries?: number;
|
|
14
15
|
showSlowestPlans?: boolean;
|
|
15
16
|
normalizeQuery?: boolean;
|
|
17
|
+
asyncQueueName?: string;
|
|
16
18
|
};
|
|
17
19
|
export type MetadataQueryContext = {
|
|
18
20
|
totalDbExecutionTime: number;
|
|
@@ -26,15 +28,53 @@ export type MetadataQueryContext = {
|
|
|
26
28
|
export declare const metadataQueryContext: AsyncLocalStorage<MetadataQueryContext>;
|
|
27
29
|
/**
|
|
28
30
|
* Saves query metadata to the current context and sets up the printQueriesWithPlan function.
|
|
31
|
+
*
|
|
32
|
+
* This function accumulates query statistics in the async context. When printQueriesWithPlan
|
|
33
|
+
* is called, it can either:
|
|
34
|
+
* - Queue the analysis for async processing (if asyncQueueName is provided)
|
|
35
|
+
* - Execute the analysis synchronously (fallback or if asyncQueueName is not set)
|
|
36
|
+
*
|
|
37
|
+
* For async processing, the function sends an event to the specified queue with a timeout.
|
|
38
|
+
* If the event cannot be sent within the timeout, it falls back to synchronous execution.
|
|
39
|
+
*
|
|
29
40
|
* @param stringQuery - The SQL query string
|
|
30
|
-
* @param params - Query parameters
|
|
31
|
-
* @param metadata - Query execution metadata
|
|
41
|
+
* @param params - Query parameters used in the query
|
|
42
|
+
* @param metadata - Query execution metadata including execution time and response size
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* await FORGE_SQL_ORM.executeWithMetadata(
|
|
47
|
+
* async () => {
|
|
48
|
+
* // ... queries ...
|
|
49
|
+
* },
|
|
50
|
+
* async (totalDbExecutionTime, totalResponseSize, printQueries) => {
|
|
51
|
+
* if (totalDbExecutionTime > threshold) {
|
|
52
|
+
* await printQueries(); // Will use async queue if configured
|
|
53
|
+
* }
|
|
54
|
+
* },
|
|
55
|
+
* { asyncQueueName: "degradationQueue" }
|
|
56
|
+
* );
|
|
57
|
+
* ```
|
|
32
58
|
*/
|
|
33
59
|
export declare function saveMetaDataToContext(stringQuery: string, params: unknown[], metadata: ForgeSQLMetadata): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Prints query degradation analysis for the provided event payload.
|
|
62
|
+
*
|
|
63
|
+
* This function processes query degradation events (either from async queue or synchronous call).
|
|
64
|
+
* It first attempts to use summary tables (CLUSTER_STATEMENTS_SUMMARY) if configured and within
|
|
65
|
+
* the time window. Otherwise, it falls back to printing execution plans for the top slowest queries.
|
|
66
|
+
*
|
|
67
|
+
* @param forgeSQLORM - The ForgeSQL operation instance for database access
|
|
68
|
+
* @param params - The async event payload containing query statistics, options, and metadata
|
|
69
|
+
* @returns Promise that resolves when query analysis is complete
|
|
70
|
+
*
|
|
71
|
+
* @see printPlansUsingSummaryTables - For summary table analysis
|
|
72
|
+
* @see printTopQueriesPlans - For top slowest queries analysis
|
|
73
|
+
*/
|
|
74
|
+
export declare function printDegradationQueries(forgeSQLORM: ForgeSqlOperation, params: AsyncEventPrintQuery): Promise<void>;
|
|
34
75
|
/**
|
|
35
76
|
* Gets the latest metadata from the current context.
|
|
36
77
|
* @returns The current metadata context or undefined if not in a context
|
|
37
78
|
*/
|
|
38
79
|
export declare function getLastestMetadata(): Promise<MetadataQueryContext | undefined>;
|
|
39
|
-
export {};
|
|
40
80
|
//# sourceMappingURL=metadataContextUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataContextUtils.d.ts","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"metadataContextUtils.d.ts","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAKjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAKnE,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEzF,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;AAE1D,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,oBAAoB,yCAAgD,CAAC;AA8OlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CA8Df;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,iBAAiB,EAC9B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAEpF"}
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.metadataQueryContext = void 0;
|
|
4
4
|
exports.saveMetaDataToContext = saveMetaDataToContext;
|
|
5
|
+
exports.printDegradationQueries = printDegradationQueries;
|
|
5
6
|
exports.getLastestMetadata = getLastestMetadata;
|
|
6
7
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
7
8
|
const sqlUtils_1 = require("./sqlUtils");
|
|
8
9
|
const node_sql_parser_1 = require("node-sql-parser");
|
|
10
|
+
const events_1 = require("@forge/events");
|
|
11
|
+
const TIMEOUT_ASYNC_EVENT_SENT = 1200;
|
|
9
12
|
const DEFAULT_WINDOW_SIZE = 15 * 1000;
|
|
10
13
|
exports.metadataQueryContext = new node_async_hooks_1.AsyncLocalStorage();
|
|
11
14
|
/**
|
|
@@ -19,6 +22,7 @@ function createDefaultOptions() {
|
|
|
19
22
|
summaryTableWindowTime: DEFAULT_WINDOW_SIZE,
|
|
20
23
|
showSlowestPlans: true,
|
|
21
24
|
normalizeQuery: true,
|
|
25
|
+
asyncQueueName: "",
|
|
22
26
|
};
|
|
23
27
|
}
|
|
24
28
|
/**
|
|
@@ -34,6 +38,7 @@ function mergeOptionsWithDefaults(options) {
|
|
|
34
38
|
summaryTableWindowTime: options?.summaryTableWindowTime ?? defaults.summaryTableWindowTime,
|
|
35
39
|
showSlowestPlans: options?.showSlowestPlans ?? defaults.showSlowestPlans,
|
|
36
40
|
normalizeQuery: options?.normalizeQuery ?? defaults.normalizeQuery,
|
|
41
|
+
asyncQueueName: options?.asyncQueueName ?? defaults.asyncQueueName,
|
|
37
42
|
};
|
|
38
43
|
}
|
|
39
44
|
/**
|
|
@@ -96,6 +101,57 @@ function normalizeSqlForLogging(sql) {
|
|
|
96
101
|
return normalizeSqlForLoggingRegex(sql);
|
|
97
102
|
}
|
|
98
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Formats row information (estRows, actRows) into a string.
|
|
106
|
+
* @param row - ExplainAnalyzeRow object
|
|
107
|
+
* @returns Formatted row info string or null if no row info available
|
|
108
|
+
*/
|
|
109
|
+
function formatRowInfo(row) {
|
|
110
|
+
const rowInfo = [];
|
|
111
|
+
if (row.estRows)
|
|
112
|
+
rowInfo.push(`estRows:${row.estRows}`);
|
|
113
|
+
if (row.actRows)
|
|
114
|
+
rowInfo.push(`actRows:${row.actRows}`);
|
|
115
|
+
return rowInfo.length > 0 ? `[${rowInfo.join(", ")}]` : null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Formats resource information (memory, disk) into a string.
|
|
119
|
+
* @param row - ExplainAnalyzeRow object
|
|
120
|
+
* @returns Formatted resource info string or null if no resource info available
|
|
121
|
+
*/
|
|
122
|
+
function formatResourceInfo(row) {
|
|
123
|
+
const resourceInfo = [];
|
|
124
|
+
if (row.memory)
|
|
125
|
+
resourceInfo.push(`memory:${row.memory}`);
|
|
126
|
+
if (row.disk)
|
|
127
|
+
resourceInfo.push(`disk:${row.disk}`);
|
|
128
|
+
return resourceInfo.length > 0 ? `(${resourceInfo.join(", ")})` : null;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Formats a single execution plan row into a string.
|
|
132
|
+
* @param row - ExplainAnalyzeRow object
|
|
133
|
+
* @returns Formatted string representation of the row
|
|
134
|
+
*/
|
|
135
|
+
function formatPlanRow(row) {
|
|
136
|
+
const parts = [];
|
|
137
|
+
if (row.id)
|
|
138
|
+
parts.push(row.id);
|
|
139
|
+
if (row.task)
|
|
140
|
+
parts.push(`task:${row.task}`);
|
|
141
|
+
if (row.operatorInfo)
|
|
142
|
+
parts.push(row.operatorInfo);
|
|
143
|
+
const rowInfo = formatRowInfo(row);
|
|
144
|
+
if (rowInfo)
|
|
145
|
+
parts.push(rowInfo);
|
|
146
|
+
if (row.executionInfo)
|
|
147
|
+
parts.push(`execution info:${row.executionInfo}`);
|
|
148
|
+
const resourceInfo = formatResourceInfo(row);
|
|
149
|
+
if (resourceInfo)
|
|
150
|
+
parts.push(resourceInfo);
|
|
151
|
+
if (row.accessObject)
|
|
152
|
+
parts.push(`access object:${row.accessObject}`);
|
|
153
|
+
return parts.join(" | ");
|
|
154
|
+
}
|
|
99
155
|
/**
|
|
100
156
|
* Formats an execution plan array into a readable string representation.
|
|
101
157
|
* @param planRows - Array of ExplainAnalyzeRow objects representing the execution plan
|
|
@@ -105,52 +161,29 @@ function formatExplainPlan(planRows) {
|
|
|
105
161
|
if (!planRows || planRows.length === 0) {
|
|
106
162
|
return "No execution plan available";
|
|
107
163
|
}
|
|
108
|
-
|
|
109
|
-
for (const row of planRows) {
|
|
110
|
-
const parts = [];
|
|
111
|
-
if (row.id)
|
|
112
|
-
parts.push(row.id);
|
|
113
|
-
if (row.task)
|
|
114
|
-
parts.push(`task:${row.task}`);
|
|
115
|
-
if (row.operatorInfo)
|
|
116
|
-
parts.push(row.operatorInfo);
|
|
117
|
-
const rowInfo = [];
|
|
118
|
-
if (row.estRows)
|
|
119
|
-
rowInfo.push(`estRows:${row.estRows}`);
|
|
120
|
-
if (row.actRows)
|
|
121
|
-
rowInfo.push(`actRows:${row.actRows}`);
|
|
122
|
-
if (rowInfo.length > 0)
|
|
123
|
-
parts.push(`[${rowInfo.join(", ")}]`);
|
|
124
|
-
if (row.executionInfo)
|
|
125
|
-
parts.push(`execution info:${row.executionInfo}`);
|
|
126
|
-
const resourceInfo = [];
|
|
127
|
-
if (row.memory)
|
|
128
|
-
resourceInfo.push(`memory:${row.memory}`);
|
|
129
|
-
if (row.disk)
|
|
130
|
-
resourceInfo.push(`disk:${row.disk}`);
|
|
131
|
-
if (resourceInfo.length > 0)
|
|
132
|
-
parts.push(`(${resourceInfo.join(", ")})`);
|
|
133
|
-
if (row.accessObject)
|
|
134
|
-
parts.push(`access object:${row.accessObject}`);
|
|
135
|
-
lines.push(parts.join(" | "));
|
|
136
|
-
}
|
|
137
|
-
return lines.join("\n");
|
|
164
|
+
return planRows.map(formatPlanRow).join("\n");
|
|
138
165
|
}
|
|
139
166
|
/**
|
|
140
167
|
* Prints query plans using summary tables if mode is SummaryTable and within time window.
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
168
|
+
*
|
|
169
|
+
* Attempts to use CLUSTER_STATEMENTS_SUMMARY table for query analysis if:
|
|
170
|
+
* - Mode is set to "SummaryTable"
|
|
171
|
+
* - Time since query execution start is within the configured window
|
|
172
|
+
*
|
|
173
|
+
* @param context - The async event payload containing query statistics and options
|
|
174
|
+
* @param forgeSQLORM - The ForgeSQL operation instance for database access
|
|
175
|
+
* @returns Promise that resolves to true if summary tables were used, false otherwise
|
|
144
176
|
*/
|
|
145
|
-
async function printPlansUsingSummaryTables(context,
|
|
177
|
+
async function printPlansUsingSummaryTables(context, forgeSQLORM) {
|
|
146
178
|
const timeDiff = Date.now() - context.beginTime.getTime();
|
|
179
|
+
const options = context.options;
|
|
147
180
|
if (options.mode !== "SummaryTable") {
|
|
148
181
|
return false;
|
|
149
182
|
}
|
|
150
183
|
if (timeDiff <= options.summaryTableWindowTime) {
|
|
151
184
|
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
152
185
|
const summaryTableDiffMs = Date.now() - context.beginTime.getTime();
|
|
153
|
-
await (0, sqlUtils_1.printQueriesWithPlan)(
|
|
186
|
+
await (0, sqlUtils_1.printQueriesWithPlan)(forgeSQLORM, summaryTableDiffMs);
|
|
154
187
|
return true;
|
|
155
188
|
}
|
|
156
189
|
// eslint-disable-next-line no-console
|
|
@@ -158,21 +191,26 @@ async function printPlansUsingSummaryTables(context, options) {
|
|
|
158
191
|
return false;
|
|
159
192
|
}
|
|
160
193
|
/**
|
|
161
|
-
* Prints query plans for the top slowest queries.
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
194
|
+
* Prints query plans for the top slowest queries from the statistics.
|
|
195
|
+
*
|
|
196
|
+
* Sorts queries by execution time and prints the top N queries (based on topQueries option).
|
|
197
|
+
* For each query, it can optionally print the execution plan using EXPLAIN ANALYZE.
|
|
198
|
+
*
|
|
199
|
+
* @param context - The async event payload containing query statistics and options
|
|
200
|
+
* @param forgeSQLORM - The ForgeSQL operation instance for database access
|
|
201
|
+
* @returns Promise that resolves when all query plans are printed
|
|
165
202
|
*/
|
|
166
|
-
async function printTopQueriesPlans(context,
|
|
203
|
+
async function printTopQueriesPlans(context, forgeSQLORM) {
|
|
204
|
+
const options = context.options;
|
|
167
205
|
const topQueries = context.statistics
|
|
168
|
-
.
|
|
206
|
+
.toSorted((a, b) => b.metadata.dbExecutionTime - a.metadata.dbExecutionTime)
|
|
169
207
|
.slice(0, options.topQueries);
|
|
170
208
|
for (const query of topQueries) {
|
|
171
209
|
const normalizedQuery = options.normalizeQuery
|
|
172
210
|
? normalizeSqlForLogging(query.query)
|
|
173
211
|
: query.query;
|
|
174
212
|
if (options.showSlowestPlans) {
|
|
175
|
-
const explainAnalyzeRows = await
|
|
213
|
+
const explainAnalyzeRows = await forgeSQLORM
|
|
176
214
|
.analyze()
|
|
177
215
|
.explainAnalyzeRaw(query.query, query.params);
|
|
178
216
|
const formattedPlan = formatExplainPlan(explainAnalyzeRows);
|
|
@@ -187,9 +225,33 @@ async function printTopQueriesPlans(context, options) {
|
|
|
187
225
|
}
|
|
188
226
|
/**
|
|
189
227
|
* Saves query metadata to the current context and sets up the printQueriesWithPlan function.
|
|
228
|
+
*
|
|
229
|
+
* This function accumulates query statistics in the async context. When printQueriesWithPlan
|
|
230
|
+
* is called, it can either:
|
|
231
|
+
* - Queue the analysis for async processing (if asyncQueueName is provided)
|
|
232
|
+
* - Execute the analysis synchronously (fallback or if asyncQueueName is not set)
|
|
233
|
+
*
|
|
234
|
+
* For async processing, the function sends an event to the specified queue with a timeout.
|
|
235
|
+
* If the event cannot be sent within the timeout, it falls back to synchronous execution.
|
|
236
|
+
*
|
|
190
237
|
* @param stringQuery - The SQL query string
|
|
191
|
-
* @param params - Query parameters
|
|
192
|
-
* @param metadata - Query execution metadata
|
|
238
|
+
* @param params - Query parameters used in the query
|
|
239
|
+
* @param metadata - Query execution metadata including execution time and response size
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* ```typescript
|
|
243
|
+
* await FORGE_SQL_ORM.executeWithMetadata(
|
|
244
|
+
* async () => {
|
|
245
|
+
* // ... queries ...
|
|
246
|
+
* },
|
|
247
|
+
* async (totalDbExecutionTime, totalResponseSize, printQueries) => {
|
|
248
|
+
* if (totalDbExecutionTime > threshold) {
|
|
249
|
+
* await printQueries(); // Will use async queue if configured
|
|
250
|
+
* }
|
|
251
|
+
* },
|
|
252
|
+
* { asyncQueueName: "degradationQueue" }
|
|
253
|
+
* );
|
|
254
|
+
* ```
|
|
193
255
|
*/
|
|
194
256
|
async function saveMetaDataToContext(stringQuery, params, metadata) {
|
|
195
257
|
const context = exports.metadataQueryContext.getStore();
|
|
@@ -207,13 +269,33 @@ async function saveMetaDataToContext(stringQuery, params, metadata) {
|
|
|
207
269
|
// Set up printQueriesWithPlan function
|
|
208
270
|
context.printQueriesWithPlan = async () => {
|
|
209
271
|
const options = mergeOptionsWithDefaults(context.options);
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
272
|
+
const param = {
|
|
273
|
+
statistics: context.statistics,
|
|
274
|
+
totalDbExecutionTime: context.totalDbExecutionTime,
|
|
275
|
+
totalResponseSize: context.totalResponseSize,
|
|
276
|
+
beginTime: context.beginTime,
|
|
277
|
+
options,
|
|
278
|
+
};
|
|
279
|
+
if (options.asyncQueueName) {
|
|
280
|
+
const queue = new events_1.Queue({ key: options.asyncQueueName });
|
|
281
|
+
try {
|
|
282
|
+
const eventInfo = await (0, sqlUtils_1.withTimeout)(queue.push({
|
|
283
|
+
body: param,
|
|
284
|
+
concurrency: {
|
|
285
|
+
key: "orm_" + options.asyncQueueName,
|
|
286
|
+
limit: 2,
|
|
287
|
+
},
|
|
288
|
+
}), `Event was not sent within ${TIMEOUT_ASYNC_EVENT_SENT}ms`, TIMEOUT_ASYNC_EVENT_SENT);
|
|
289
|
+
// eslint-disable-next-line no-console
|
|
290
|
+
console.warn(`[Performance Analysis] Query degradation event queued for async processing | Job ID: ${eventInfo.jobId} | Total DB time: ${context.totalDbExecutionTime}ms | Queries: ${context.statistics.length} | Look for consumer log with jobId: ${eventInfo.jobId}`);
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
catch (e) {
|
|
294
|
+
// eslint-disable-next-line no-console
|
|
295
|
+
console.warn("Async printing failed — falling back to synchronous execution: " + e.message, e);
|
|
296
|
+
}
|
|
214
297
|
}
|
|
215
|
-
|
|
216
|
-
await printTopQueriesPlans(context, options);
|
|
298
|
+
await printDegradationQueries(context.forgeSQLORM, param);
|
|
217
299
|
};
|
|
218
300
|
// Update aggregated metrics
|
|
219
301
|
if (metadata) {
|
|
@@ -221,6 +303,29 @@ async function saveMetaDataToContext(stringQuery, params, metadata) {
|
|
|
221
303
|
context.totalDbExecutionTime += metadata.dbExecutionTime;
|
|
222
304
|
}
|
|
223
305
|
}
|
|
306
|
+
/**
|
|
307
|
+
* Prints query degradation analysis for the provided event payload.
|
|
308
|
+
*
|
|
309
|
+
* This function processes query degradation events (either from async queue or synchronous call).
|
|
310
|
+
* It first attempts to use summary tables (CLUSTER_STATEMENTS_SUMMARY) if configured and within
|
|
311
|
+
* the time window. Otherwise, it falls back to printing execution plans for the top slowest queries.
|
|
312
|
+
*
|
|
313
|
+
* @param forgeSQLORM - The ForgeSQL operation instance for database access
|
|
314
|
+
* @param params - The async event payload containing query statistics, options, and metadata
|
|
315
|
+
* @returns Promise that resolves when query analysis is complete
|
|
316
|
+
*
|
|
317
|
+
* @see printPlansUsingSummaryTables - For summary table analysis
|
|
318
|
+
* @see printTopQueriesPlans - For top slowest queries analysis
|
|
319
|
+
*/
|
|
320
|
+
async function printDegradationQueries(forgeSQLORM, params) {
|
|
321
|
+
// Try to use summary tables first if enabled
|
|
322
|
+
const usedSummaryTables = await printPlansUsingSummaryTables(params, forgeSQLORM);
|
|
323
|
+
if (usedSummaryTables) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
// Fall back to printing top queries plans
|
|
327
|
+
await printTopQueriesPlans(params, forgeSQLORM);
|
|
328
|
+
}
|
|
224
329
|
/**
|
|
225
330
|
* Gets the latest metadata from the current context.
|
|
226
331
|
* @returns The current metadata context or undefined if not in a context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataContextUtils.js","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"metadataContextUtils.js","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":";;;AA+SA,sDAkEC;AAgBD,0DAYC;AAMD,gDAEC;AArZD,uDAAqD;AAIrD,yCAA+D;AAC/D,qDAAyC;AACzC,0CAAkD;AAGlD,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;AAyBzB,QAAA,oBAAoB,GAAG,IAAI,oCAAiB,EAAwB,CAAC;AAElF;;;GAGG;AACH,SAAS,oBAAoB;IAC3B,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,CAAC;QACb,sBAAsB,EAAE,mBAAmB;QAC3C,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,EAAE;KACnB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,OAA8B;IAC9D,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,OAAO;QACL,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI;QACpC,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,QAAQ,CAAC,UAAU;QACtD,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,IAAI,QAAQ,CAAC,sBAAsB;QAC1F,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB;QACxE,cAAc,EAAE,OAAO,EAAE,cAAc,IAAI,QAAQ,CAAC,cAAc;QAClE,cAAc,EAAE,OAAO,EAAE,cAAc,IAAI,QAAQ,CAAC,cAAc;KACnE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,2BAA2B,CAAC,GAAW;IAC9C,IAAI,UAAU,GAAG,GAAG,CAAC;IAErB,sEAAsE;IACtE,wEAAwE;IACxE,2EAA2E;IAC3E,yFAAyF;IACzF,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAEjD,sEAAsE;IACtE,sCAAsC;IACtC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAEjD,sEAAsE;IACtE,wEAAwE;IACxE,8EAA8E;IAC9E,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAEzD,+DAA+D;IAC/D,kEAAkE;IAClE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IAE3D,qEAAqE;IACrE,sDAAsD;IACtD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAEnD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,wBAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAEtC,qEAAqE;QACrE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEpE,4DAA4D;QAC5D,wEAAwE;QACxE,IAAI,MAAM,GAAG,2BAA2B,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5D,8GAA8G;QAC9G,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAElC,OAAO,MAAM,CAAC;QACd,4DAA4D;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,2DAA2D;QAC3D,OAAO,2BAA2B,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,GAAsB;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,GAAsB;IAChD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,GAAG,CAAC,MAAM;QAAE,YAAY,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,IAAI,GAAG,CAAC,IAAI;QAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,GAAsB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,GAAG,CAAC,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,GAAG,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,GAAG,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,GAAG,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;IAEzE,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI,GAAG,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAEtE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,QAA6B;IACtD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,4BAA4B,CACzC,OAA6B,EAC7B,WAA8B;IAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;QAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACpE,MAAM,IAAA,+BAAoB,EAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sCAAsC;IACtC,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,oBAAoB,CACjC,OAA6B,EAC7B,WAA8B;IAE9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;SAClC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;SAC3E,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,OAAO,CAAC,cAAc;YAC5C,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;YACrC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,MAAM,kBAAkB,GAAG,MAAM,WAAW;iBACzC,OAAO,EAAE;iBACT,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,aAAa,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;YAC5D,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,QAAQ,eAAe,YAAY,KAAK,CAAC,QAAQ,CAAC,eAAe,gBAAgB,aAAa,EAAE,CACjG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,QAAQ,eAAe,YAAY,KAAK,CAAC,QAAQ,CAAC,eAAe,KAAK,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACI,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,MAAiB,EACjB,QAA0B;IAE1B,MAAM,OAAO,GAAG,4BAAoB,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,8BAA8B;IAC9B,OAAO,CAAC,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5D,uBAAuB;IACvB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAElE,uCAAuC;IACvC,OAAO,CAAC,oBAAoB,GAAG,KAAK,IAAI,EAAE;QACxC,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAyB;YAClC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;YAClD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO;SACR,CAAC;QACF,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,cAAK,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAA,sBAAW,EACjC,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,KAAK;oBACX,WAAW,EAAE;wBACX,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc;wBACpC,KAAK,EAAE,CAAC;qBACT;iBACF,CAAC,EACF,6BAA6B,wBAAwB,IAAI,EACzD,wBAAwB,CACzB,CAAC;gBACF,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CACV,wFAAwF,SAAS,CAAC,KAAK,qBAAqB,OAAO,CAAC,oBAAoB,iBAAiB,OAAO,CAAC,UAAU,CAAC,MAAM,wCAAwC,SAAS,CAAC,KAAK,EAAE,CAC5P,CAAC;gBACF,OAAO;YACT,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CACV,iEAAiE,GAAG,CAAC,CAAC,OAAO,EAC7E,CAAC,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,uBAAuB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC;IAEF,4BAA4B;IAC5B,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,iBAAiB,IAAI,QAAQ,CAAC,YAAY,CAAC;QACnD,OAAO,CAAC,oBAAoB,IAAI,QAAQ,CAAC,eAAe,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,uBAAuB,CAC3C,WAA8B,EAC9B,MAA4B;IAE5B,6CAA6C;IAC7C,MAAM,iBAAiB,GAAG,MAAM,4BAA4B,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClF,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,0CAA0C;IAC1C,MAAM,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,kBAAkB;IACtC,OAAO,4BAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC"}
|