web_plsql 1.0.0 → 1.2.0
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 +5 -5
- package/package.json +5 -5
- package/src/admin/client/charts.ts +303 -4
- package/src/admin/index.html +283 -69
- package/src/admin/js/api.ts +95 -20
- package/src/admin/js/app.ts +460 -152
- package/src/admin/js/schemas.ts +76 -14
- package/src/admin/js/templates/config.ts +10 -9
- package/src/admin/js/templates/errorRow.ts +8 -5
- package/src/admin/js/templates/index.ts +1 -0
- package/src/admin/js/templates/poolCard.ts +6 -6
- package/src/admin/js/templates/traceRow.ts +24 -0
- package/src/admin/js/types.ts +132 -19
- package/src/admin/js/ui/components.ts +44 -0
- package/src/admin/js/ui/table.ts +173 -0
- package/src/admin/js/ui/views.ts +311 -48
- package/src/admin/js/util/format.ts +22 -3
- package/src/admin/js/util/metrics.ts +24 -0
- package/src/admin/lib/chart.bundle.css +1 -0
- package/src/admin/lib/chart.bundle.js +54 -47
- package/src/admin/style.css +143 -27
- package/src/handler/handlerAdmin.js +121 -26
- package/src/handler/plsql/errorPage.js +0 -4
- package/src/handler/plsql/owaPageStream.js +93 -0
- package/src/handler/plsql/procedure.js +191 -121
- package/src/handler/plsql/procedureNamed.js +17 -3
- package/src/handler/plsql/procedureSanitize.js +24 -0
- package/src/handler/plsql/procedureVariable.js +2 -0
- package/src/handler/plsql/sendResponse.js +41 -3
- package/src/index.js +0 -1
- package/src/server/adminContext.js +23 -0
- package/src/server/server.js +83 -68
- package/src/types.js +1 -1
- package/src/util/statsManager.js +368 -0
- package/src/util/trace.js +2 -1
- package/src/util/traceManager.js +68 -0
- package/src/version.js +1 -1
- package/types/admin/js/schemas.d.ts +384 -0
- package/types/admin/js/types.d.ts +312 -0
- package/types/handler/handlerAdmin.d.ts +70 -0
- package/types/handler/plsql/owaPageStream.d.ts +28 -0
- package/types/handler/plsql/procedure.d.ts +1 -0
- package/types/index.d.ts +0 -1
- package/types/server/adminContext.d.ts +17 -0
- package/types/server/server.d.ts +2 -19
- package/types/types.d.ts +1 -1
- package/types/util/statsManager.d.ts +395 -0
- package/types/util/traceManager.d.ts +35 -0
- package/src/admin/lib/assets/main-zpdhQ1gD.css +0 -1
- package/src/handler/handlerMetrics.js +0 -68
- package/types/handler/handlerMetrics.d.ts +0 -25
|
@@ -3,7 +3,77 @@
|
|
|
3
3
|
* @typedef {import('express').Response} Response
|
|
4
4
|
* @typedef {import('express').NextFunction} NextFunction
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {import('../util/statsManager.js').Bucket} Bucket
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {object} StatsSummary
|
|
11
|
+
* @property {Date} startTime - Server start time.
|
|
12
|
+
* @property {number} totalRequests - Total requests handled.
|
|
13
|
+
* @property {number} totalErrors - Total errors encountered.
|
|
14
|
+
* @property {number} avgResponseTime - Lifetime average response time.
|
|
15
|
+
* @property {number} minResponseTime - Lifetime minimum response time.
|
|
16
|
+
* @property {number} maxResponseTime - Lifetime maximum response time.
|
|
17
|
+
* @property {number} maxRequestsPerSecond - Lifetime maximum requests per second.
|
|
18
|
+
* @property {object} maxMemory - Lifetime memory extremes.
|
|
19
|
+
* @property {number} maxMemory.heapUsedMax - Maximum heap used.
|
|
20
|
+
* @property {number} maxMemory.heapTotalMax - Maximum heap total.
|
|
21
|
+
* @property {number} maxMemory.rssMax - Maximum RSS.
|
|
22
|
+
* @property {number} maxMemory.externalMax - Maximum external memory.
|
|
23
|
+
* @property {object} cpu - Lifetime CPU extremes.
|
|
24
|
+
* @property {number} cpu.max - Max CPU.
|
|
25
|
+
* @property {number} cpu.userMax - Max user CPU.
|
|
26
|
+
* @property {number} cpu.systemMax - Max system CPU.
|
|
27
|
+
*/
|
|
6
28
|
export const handlerAdmin: import("express-serve-static-core").Router;
|
|
7
29
|
export type Request = import("express").Request;
|
|
8
30
|
export type Response = import("express").Response;
|
|
9
31
|
export type NextFunction = import("express").NextFunction;
|
|
32
|
+
export type Bucket = import("../util/statsManager.js").Bucket;
|
|
33
|
+
export type StatsSummary = {
|
|
34
|
+
/**
|
|
35
|
+
* - Server start time.
|
|
36
|
+
*/
|
|
37
|
+
startTime: Date;
|
|
38
|
+
/**
|
|
39
|
+
* - Total requests handled.
|
|
40
|
+
*/
|
|
41
|
+
totalRequests: number;
|
|
42
|
+
/**
|
|
43
|
+
* - Total errors encountered.
|
|
44
|
+
*/
|
|
45
|
+
totalErrors: number;
|
|
46
|
+
/**
|
|
47
|
+
* - Lifetime average response time.
|
|
48
|
+
*/
|
|
49
|
+
avgResponseTime: number;
|
|
50
|
+
/**
|
|
51
|
+
* - Lifetime minimum response time.
|
|
52
|
+
*/
|
|
53
|
+
minResponseTime: number;
|
|
54
|
+
/**
|
|
55
|
+
* - Lifetime maximum response time.
|
|
56
|
+
*/
|
|
57
|
+
maxResponseTime: number;
|
|
58
|
+
/**
|
|
59
|
+
* - Lifetime maximum requests per second.
|
|
60
|
+
*/
|
|
61
|
+
maxRequestsPerSecond: number;
|
|
62
|
+
/**
|
|
63
|
+
* - Lifetime memory extremes.
|
|
64
|
+
*/
|
|
65
|
+
maxMemory: {
|
|
66
|
+
heapUsedMax: number;
|
|
67
|
+
heapTotalMax: number;
|
|
68
|
+
rssMax: number;
|
|
69
|
+
externalMax: number;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* - Lifetime CPU extremes.
|
|
73
|
+
*/
|
|
74
|
+
cpu: {
|
|
75
|
+
max: number;
|
|
76
|
+
userMax: number;
|
|
77
|
+
systemMax: number;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import('oracledb').Connection} Connection
|
|
3
|
+
* @typedef {import('../../types.js').BindParameterConfig} BindParameterConfig
|
|
4
|
+
*/
|
|
5
|
+
export class OWAPageStream extends Readable {
|
|
6
|
+
/**
|
|
7
|
+
* @param {Connection} databaseConnection - The database connection.
|
|
8
|
+
*/
|
|
9
|
+
constructor(databaseConnection: Connection);
|
|
10
|
+
databaseConnection: oracledb.Connection;
|
|
11
|
+
chunkSize: number;
|
|
12
|
+
isDone: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Fetch a chunk of the page from the database.
|
|
15
|
+
* @returns {Promise<string[]>} The array of lines fetched.
|
|
16
|
+
*/
|
|
17
|
+
fetchChunk(): Promise<string[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Add initial body content to the stream.
|
|
20
|
+
* @param {string} content - The initial content to prepend.
|
|
21
|
+
* @returns {void}
|
|
22
|
+
*/
|
|
23
|
+
addBody(content: string): void;
|
|
24
|
+
}
|
|
25
|
+
export type Connection = import("oracledb").Connection;
|
|
26
|
+
export type BindParameterConfig = import("../../types.js").BindParameterConfig;
|
|
27
|
+
import { Readable } from 'node:stream';
|
|
28
|
+
import oracledb from 'oracledb';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export function invokeProcedure(req: Request, res: Response, argObj: argObjType, cgiObj: environmentType, filesToUpload: fileUploadType[], options: configPlSqlHandlerType, databaseConnection: Connection, procedureNameCache: ProcedureNameCache, argumentCache: ArgumentCache): Promise<void>;
|
|
2
|
+
export type TraceEntry = import("../../admin/js/types.js").TraceEntry;
|
|
2
3
|
export type Request = import("express").Request;
|
|
3
4
|
export type Response = import("express").Response;
|
|
4
5
|
export type Connection = import("oracledb").Connection;
|
package/types/index.d.ts
CHANGED
|
@@ -6,6 +6,5 @@ export * from "./util/file.js";
|
|
|
6
6
|
export { handlerWebPlSql } from "./handler/plsql/handlerPlSql.js";
|
|
7
7
|
export { handlerLogger } from "./handler/handlerLogger.js";
|
|
8
8
|
export { handlerUpload } from "./handler/handlerUpload.js";
|
|
9
|
-
export { handlerMetrics } from "./handler/handlerMetrics.js";
|
|
10
9
|
import oracledb from 'oracledb';
|
|
11
10
|
export { createServer, startServer, loadConfig, startServerConfig } from "./server/server.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export namespace AdminContext {
|
|
2
|
+
let startTime: Date;
|
|
3
|
+
let config: configType | null;
|
|
4
|
+
let pools: Pool[];
|
|
5
|
+
let caches: Array<{
|
|
6
|
+
poolName: string;
|
|
7
|
+
procedureNameCache: Cache;
|
|
8
|
+
argumentCache: Cache;
|
|
9
|
+
}>;
|
|
10
|
+
let paused: boolean;
|
|
11
|
+
let statsManager: StatsManager;
|
|
12
|
+
}
|
|
13
|
+
export type Pool = import("oracledb").Pool;
|
|
14
|
+
export type configType = import("../types.js").configType;
|
|
15
|
+
export type argsType = import("../handler/plsql/procedureNamed.js").argsType;
|
|
16
|
+
export type Cache = import("../util/cache.js").Cache<unknown>;
|
|
17
|
+
import { StatsManager } from '../util/statsManager.js';
|
package/types/server/server.d.ts
CHANGED
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
export namespace AdminContext {
|
|
2
|
-
let startTime: Date;
|
|
3
|
-
let config: configType | null;
|
|
4
|
-
let pools: Pool[];
|
|
5
|
-
let caches: Array<{
|
|
6
|
-
poolName: string;
|
|
7
|
-
procedureNameCache: Cache<string>;
|
|
8
|
-
argumentCache: Cache<argsType>;
|
|
9
|
-
}>;
|
|
10
|
-
let paused: boolean;
|
|
11
|
-
namespace metrics {
|
|
12
|
-
let requestCount: number;
|
|
13
|
-
let errorCount: number;
|
|
14
|
-
let totalDuration: number;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
1
|
export function createServer(app: Express, ssl?: sslConfig): http.Server | https.Server;
|
|
18
2
|
export function startServer(config: configType, ssl?: sslConfig): Promise<webServer>;
|
|
19
3
|
export function loadConfig(filename?: string): configType;
|
|
@@ -28,8 +12,8 @@ export type environmentType = import("../types.js").environmentType;
|
|
|
28
12
|
export type configType = import("../types.js").configType;
|
|
29
13
|
export type argsType = import("../handler/plsql/procedureNamed.js").argsType;
|
|
30
14
|
export type ExtendedRequestHandler = import("express").RequestHandler & {
|
|
31
|
-
procedureNameCache: Cache<string>;
|
|
32
|
-
argumentCache: Cache<argsType>;
|
|
15
|
+
procedureNameCache: import("../util/cache.js").Cache<string>;
|
|
16
|
+
argumentCache: import("../util/cache.js").Cache<argsType>;
|
|
33
17
|
};
|
|
34
18
|
/**
|
|
35
19
|
* - Web server interface.
|
|
@@ -69,6 +53,5 @@ export type sslConfig = {
|
|
|
69
53
|
*/
|
|
70
54
|
certFilename: string;
|
|
71
55
|
};
|
|
72
|
-
import { Cache } from '../util/cache.js';
|
|
73
56
|
import http from 'node:http';
|
|
74
57
|
import https from 'node:https';
|
package/types/types.d.ts
CHANGED
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {object} StatsConfig
|
|
3
|
+
* @property {number} intervalMs - Duration of each statistical bucket (default: 5000ms).
|
|
4
|
+
* @property {number} maxHistoryPoints - Number of buckets to keep in the ring buffer (default: 200).
|
|
5
|
+
* @property {boolean} sampleSystem - Whether to automatically sample CPU/Memory (default: true).
|
|
6
|
+
* @property {boolean} samplePools - Whether to automatically sample Oracle pool utilization (default: true).
|
|
7
|
+
* @property {number} percentilePrecision - Max number of samples per bucket for P95/P99 calculation (default: 1000).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {object} CacheStats
|
|
11
|
+
* @property {number} size - Number of entries.
|
|
12
|
+
* @property {number} hits - Number of hits.
|
|
13
|
+
* @property {number} misses - Number of misses.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {object} PoolCacheSnapshot
|
|
17
|
+
* @property {CacheStats} procedureName - Procedure name cache stats.
|
|
18
|
+
* @property {CacheStats} argument - Argument cache stats.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* @typedef {object} PoolSnapshot
|
|
22
|
+
* @property {string} name - The pool name.
|
|
23
|
+
* @property {number} connectionsInUse - Number of active connections.
|
|
24
|
+
* @property {number} connectionsOpen - Number of open connections.
|
|
25
|
+
* @property {PoolCacheSnapshot} [cache] - Cache statistics.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {object} Bucket
|
|
29
|
+
* @property {number} timestamp - End time of the bucket.
|
|
30
|
+
* @property {number} requests - Number of requests.
|
|
31
|
+
* @property {number} errors - Number of errors.
|
|
32
|
+
* @property {number} durationMin - Minimum duration.
|
|
33
|
+
* @property {number} durationMax - Maximum duration.
|
|
34
|
+
* @property {number} durationAvg - Average duration.
|
|
35
|
+
* @property {number} durationP95 - 95th percentile duration.
|
|
36
|
+
* @property {number} durationP99 - 99th percentile duration.
|
|
37
|
+
* @property {object} system - System metrics.
|
|
38
|
+
* @property {number} system.cpu - CPU usage percentage.
|
|
39
|
+
* @property {number} system.heapUsed - Heap used in bytes.
|
|
40
|
+
* @property {number} system.heapTotal - Heap total in bytes.
|
|
41
|
+
* @property {number} system.rss - RSS in bytes.
|
|
42
|
+
* @property {number} system.external - External memory in bytes.
|
|
43
|
+
* @property {PoolSnapshot[]} pools - Pool utilization snapshots.
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* @typedef {object} CurrentBucket
|
|
47
|
+
* @property {number} count - Number of requests.
|
|
48
|
+
* @property {number} errors - Number of errors.
|
|
49
|
+
* @property {number} durationSum - Sum of durations.
|
|
50
|
+
* @property {number} durationMin - Minimum duration.
|
|
51
|
+
* @property {number} durationMax - Maximum duration.
|
|
52
|
+
* @property {number[]} durations - List of durations for percentile calculation.
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* @typedef {object} MemoryLifetime
|
|
56
|
+
* @property {number} heapUsedMax - Max heap used.
|
|
57
|
+
* @property {number} heapTotalMax - Max heap total.
|
|
58
|
+
* @property {number} rssMax - Max RSS.
|
|
59
|
+
* @property {number} externalMax - Max external.
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* @typedef {object} LifetimeStats
|
|
63
|
+
* @property {number} totalRequests - Total requests.
|
|
64
|
+
* @property {number} totalErrors - Total errors.
|
|
65
|
+
* @property {number} minDuration - Min duration.
|
|
66
|
+
* @property {number} maxDuration - Max duration.
|
|
67
|
+
* @property {number} totalDuration - Total duration.
|
|
68
|
+
* @property {number} maxRequestsPerSecond - Max requests per second.
|
|
69
|
+
* @property {MemoryLifetime} memory - Memory extremes.
|
|
70
|
+
* @property {object} cpu - CPU extremes.
|
|
71
|
+
* @property {number} cpu.max - Max CPU.
|
|
72
|
+
* @property {number} cpu.userMax - Max user CPU.
|
|
73
|
+
* @property {number} cpu.systemMax - Max system CPU.
|
|
74
|
+
*/
|
|
75
|
+
/**
|
|
76
|
+
* @typedef {object} StatsSummary
|
|
77
|
+
* @property {Date} startTime - Server start time.
|
|
78
|
+
* @property {number} totalRequests - Total requests handled.
|
|
79
|
+
* @property {number} totalErrors - Total errors encountered.
|
|
80
|
+
* @property {number} avgResponseTime - Lifetime average response time.
|
|
81
|
+
* @property {number} minResponseTime - Lifetime minimum response time.
|
|
82
|
+
* @property {number} maxResponseTime - Lifetime maximum response time.
|
|
83
|
+
* @property {number} maxRequestsPerSecond - Lifetime maximum requests per second.
|
|
84
|
+
* @property {MemoryLifetime} maxMemory - Lifetime memory extremes.
|
|
85
|
+
* @property {object} cpu - CPU extremes.
|
|
86
|
+
* @property {number} cpu.max - Max CPU usage percentage.
|
|
87
|
+
* @property {number} cpu.userMax - Max user CPU usage in microseconds.
|
|
88
|
+
* @property {number} cpu.systemMax - Max system CPU usage in microseconds.
|
|
89
|
+
*/
|
|
90
|
+
/**
|
|
91
|
+
* Manager for statistical data collection and temporal bucketing.
|
|
92
|
+
*/
|
|
93
|
+
export class StatsManager {
|
|
94
|
+
/**
|
|
95
|
+
* @param {Partial<StatsConfig>} config - Configuration.
|
|
96
|
+
*/
|
|
97
|
+
constructor(config?: Partial<StatsConfig>);
|
|
98
|
+
/** @type {StatsConfig} */
|
|
99
|
+
config: StatsConfig;
|
|
100
|
+
startTime: Date;
|
|
101
|
+
/** @type {Bucket[]} */
|
|
102
|
+
history: Bucket[];
|
|
103
|
+
/** @type {LifetimeStats} */
|
|
104
|
+
lifetime: LifetimeStats;
|
|
105
|
+
/** @type {CurrentBucket} */
|
|
106
|
+
_currentBucket: CurrentBucket;
|
|
107
|
+
_lastCpuTimes: {
|
|
108
|
+
user: number;
|
|
109
|
+
nice: number;
|
|
110
|
+
sys: number;
|
|
111
|
+
idle: number;
|
|
112
|
+
irq: number;
|
|
113
|
+
total: number;
|
|
114
|
+
};
|
|
115
|
+
/** @type {ReturnType<typeof setTimeout> | undefined} */
|
|
116
|
+
_timer: ReturnType<typeof setTimeout> | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* Reset the current bucket accumulator.
|
|
119
|
+
* @private
|
|
120
|
+
*/
|
|
121
|
+
private _resetBucket;
|
|
122
|
+
/**
|
|
123
|
+
* Record a request event.
|
|
124
|
+
* @param {number} duration - Duration in milliseconds.
|
|
125
|
+
* @param {boolean} isError - Whether the request was an error.
|
|
126
|
+
*/
|
|
127
|
+
recordRequest(duration: number, isError?: boolean): void;
|
|
128
|
+
/**
|
|
129
|
+
* Get system CPU times.
|
|
130
|
+
* @private
|
|
131
|
+
* @returns {{user: number, nice: number, sys: number, idle: number, irq: number, total: number}} System CPU times.
|
|
132
|
+
*/
|
|
133
|
+
private _getSystemCpuTimes;
|
|
134
|
+
/**
|
|
135
|
+
* Calculate CPU usage percentage since last call.
|
|
136
|
+
* @private
|
|
137
|
+
* @returns {number} CPU usage percentage (0-100).
|
|
138
|
+
*/
|
|
139
|
+
private _calculateCpuUsage;
|
|
140
|
+
/**
|
|
141
|
+
* Rotate the current bucket into history and start a new one.
|
|
142
|
+
* @param {PoolSnapshot[]} [poolSnapshots] - Optional pool snapshots to include.
|
|
143
|
+
*/
|
|
144
|
+
rotateBucket(poolSnapshots?: PoolSnapshot[]): void;
|
|
145
|
+
/**
|
|
146
|
+
* Stop the background timer.
|
|
147
|
+
*/
|
|
148
|
+
stop(): void;
|
|
149
|
+
/**
|
|
150
|
+
* Get lifetime summary.
|
|
151
|
+
* @returns {StatsSummary} Summary.
|
|
152
|
+
*/
|
|
153
|
+
getSummary(): StatsSummary;
|
|
154
|
+
/**
|
|
155
|
+
* Get history buffer.
|
|
156
|
+
* @returns {Bucket[]} The history buffer.
|
|
157
|
+
*/
|
|
158
|
+
getHistory(): Bucket[];
|
|
159
|
+
}
|
|
160
|
+
export type StatsConfig = {
|
|
161
|
+
/**
|
|
162
|
+
* - Duration of each statistical bucket (default: 5000ms).
|
|
163
|
+
*/
|
|
164
|
+
intervalMs: number;
|
|
165
|
+
/**
|
|
166
|
+
* - Number of buckets to keep in the ring buffer (default: 200).
|
|
167
|
+
*/
|
|
168
|
+
maxHistoryPoints: number;
|
|
169
|
+
/**
|
|
170
|
+
* - Whether to automatically sample CPU/Memory (default: true).
|
|
171
|
+
*/
|
|
172
|
+
sampleSystem: boolean;
|
|
173
|
+
/**
|
|
174
|
+
* - Whether to automatically sample Oracle pool utilization (default: true).
|
|
175
|
+
*/
|
|
176
|
+
samplePools: boolean;
|
|
177
|
+
/**
|
|
178
|
+
* - Max number of samples per bucket for P95/P99 calculation (default: 1000).
|
|
179
|
+
*/
|
|
180
|
+
percentilePrecision: number;
|
|
181
|
+
};
|
|
182
|
+
export type CacheStats = {
|
|
183
|
+
/**
|
|
184
|
+
* - Number of entries.
|
|
185
|
+
*/
|
|
186
|
+
size: number;
|
|
187
|
+
/**
|
|
188
|
+
* - Number of hits.
|
|
189
|
+
*/
|
|
190
|
+
hits: number;
|
|
191
|
+
/**
|
|
192
|
+
* - Number of misses.
|
|
193
|
+
*/
|
|
194
|
+
misses: number;
|
|
195
|
+
};
|
|
196
|
+
export type PoolCacheSnapshot = {
|
|
197
|
+
/**
|
|
198
|
+
* - Procedure name cache stats.
|
|
199
|
+
*/
|
|
200
|
+
procedureName: CacheStats;
|
|
201
|
+
/**
|
|
202
|
+
* - Argument cache stats.
|
|
203
|
+
*/
|
|
204
|
+
argument: CacheStats;
|
|
205
|
+
};
|
|
206
|
+
export type PoolSnapshot = {
|
|
207
|
+
/**
|
|
208
|
+
* - The pool name.
|
|
209
|
+
*/
|
|
210
|
+
name: string;
|
|
211
|
+
/**
|
|
212
|
+
* - Number of active connections.
|
|
213
|
+
*/
|
|
214
|
+
connectionsInUse: number;
|
|
215
|
+
/**
|
|
216
|
+
* - Number of open connections.
|
|
217
|
+
*/
|
|
218
|
+
connectionsOpen: number;
|
|
219
|
+
/**
|
|
220
|
+
* - Cache statistics.
|
|
221
|
+
*/
|
|
222
|
+
cache?: PoolCacheSnapshot;
|
|
223
|
+
};
|
|
224
|
+
export type Bucket = {
|
|
225
|
+
/**
|
|
226
|
+
* - End time of the bucket.
|
|
227
|
+
*/
|
|
228
|
+
timestamp: number;
|
|
229
|
+
/**
|
|
230
|
+
* - Number of requests.
|
|
231
|
+
*/
|
|
232
|
+
requests: number;
|
|
233
|
+
/**
|
|
234
|
+
* - Number of errors.
|
|
235
|
+
*/
|
|
236
|
+
errors: number;
|
|
237
|
+
/**
|
|
238
|
+
* - Minimum duration.
|
|
239
|
+
*/
|
|
240
|
+
durationMin: number;
|
|
241
|
+
/**
|
|
242
|
+
* - Maximum duration.
|
|
243
|
+
*/
|
|
244
|
+
durationMax: number;
|
|
245
|
+
/**
|
|
246
|
+
* - Average duration.
|
|
247
|
+
*/
|
|
248
|
+
durationAvg: number;
|
|
249
|
+
/**
|
|
250
|
+
* - 95th percentile duration.
|
|
251
|
+
*/
|
|
252
|
+
durationP95: number;
|
|
253
|
+
/**
|
|
254
|
+
* - 99th percentile duration.
|
|
255
|
+
*/
|
|
256
|
+
durationP99: number;
|
|
257
|
+
/**
|
|
258
|
+
* - System metrics.
|
|
259
|
+
*/
|
|
260
|
+
system: {
|
|
261
|
+
cpu: number;
|
|
262
|
+
heapUsed: number;
|
|
263
|
+
heapTotal: number;
|
|
264
|
+
rss: number;
|
|
265
|
+
external: number;
|
|
266
|
+
};
|
|
267
|
+
/**
|
|
268
|
+
* - Pool utilization snapshots.
|
|
269
|
+
*/
|
|
270
|
+
pools: PoolSnapshot[];
|
|
271
|
+
};
|
|
272
|
+
export type CurrentBucket = {
|
|
273
|
+
/**
|
|
274
|
+
* - Number of requests.
|
|
275
|
+
*/
|
|
276
|
+
count: number;
|
|
277
|
+
/**
|
|
278
|
+
* - Number of errors.
|
|
279
|
+
*/
|
|
280
|
+
errors: number;
|
|
281
|
+
/**
|
|
282
|
+
* - Sum of durations.
|
|
283
|
+
*/
|
|
284
|
+
durationSum: number;
|
|
285
|
+
/**
|
|
286
|
+
* - Minimum duration.
|
|
287
|
+
*/
|
|
288
|
+
durationMin: number;
|
|
289
|
+
/**
|
|
290
|
+
* - Maximum duration.
|
|
291
|
+
*/
|
|
292
|
+
durationMax: number;
|
|
293
|
+
/**
|
|
294
|
+
* - List of durations for percentile calculation.
|
|
295
|
+
*/
|
|
296
|
+
durations: number[];
|
|
297
|
+
};
|
|
298
|
+
export type MemoryLifetime = {
|
|
299
|
+
/**
|
|
300
|
+
* - Max heap used.
|
|
301
|
+
*/
|
|
302
|
+
heapUsedMax: number;
|
|
303
|
+
/**
|
|
304
|
+
* - Max heap total.
|
|
305
|
+
*/
|
|
306
|
+
heapTotalMax: number;
|
|
307
|
+
/**
|
|
308
|
+
* - Max RSS.
|
|
309
|
+
*/
|
|
310
|
+
rssMax: number;
|
|
311
|
+
/**
|
|
312
|
+
* - Max external.
|
|
313
|
+
*/
|
|
314
|
+
externalMax: number;
|
|
315
|
+
};
|
|
316
|
+
export type LifetimeStats = {
|
|
317
|
+
/**
|
|
318
|
+
* - Total requests.
|
|
319
|
+
*/
|
|
320
|
+
totalRequests: number;
|
|
321
|
+
/**
|
|
322
|
+
* - Total errors.
|
|
323
|
+
*/
|
|
324
|
+
totalErrors: number;
|
|
325
|
+
/**
|
|
326
|
+
* - Min duration.
|
|
327
|
+
*/
|
|
328
|
+
minDuration: number;
|
|
329
|
+
/**
|
|
330
|
+
* - Max duration.
|
|
331
|
+
*/
|
|
332
|
+
maxDuration: number;
|
|
333
|
+
/**
|
|
334
|
+
* - Total duration.
|
|
335
|
+
*/
|
|
336
|
+
totalDuration: number;
|
|
337
|
+
/**
|
|
338
|
+
* - Max requests per second.
|
|
339
|
+
*/
|
|
340
|
+
maxRequestsPerSecond: number;
|
|
341
|
+
/**
|
|
342
|
+
* - Memory extremes.
|
|
343
|
+
*/
|
|
344
|
+
memory: MemoryLifetime;
|
|
345
|
+
/**
|
|
346
|
+
* - CPU extremes.
|
|
347
|
+
*/
|
|
348
|
+
cpu: {
|
|
349
|
+
max: number;
|
|
350
|
+
userMax: number;
|
|
351
|
+
systemMax: number;
|
|
352
|
+
};
|
|
353
|
+
};
|
|
354
|
+
export type StatsSummary = {
|
|
355
|
+
/**
|
|
356
|
+
* - Server start time.
|
|
357
|
+
*/
|
|
358
|
+
startTime: Date;
|
|
359
|
+
/**
|
|
360
|
+
* - Total requests handled.
|
|
361
|
+
*/
|
|
362
|
+
totalRequests: number;
|
|
363
|
+
/**
|
|
364
|
+
* - Total errors encountered.
|
|
365
|
+
*/
|
|
366
|
+
totalErrors: number;
|
|
367
|
+
/**
|
|
368
|
+
* - Lifetime average response time.
|
|
369
|
+
*/
|
|
370
|
+
avgResponseTime: number;
|
|
371
|
+
/**
|
|
372
|
+
* - Lifetime minimum response time.
|
|
373
|
+
*/
|
|
374
|
+
minResponseTime: number;
|
|
375
|
+
/**
|
|
376
|
+
* - Lifetime maximum response time.
|
|
377
|
+
*/
|
|
378
|
+
maxResponseTime: number;
|
|
379
|
+
/**
|
|
380
|
+
* - Lifetime maximum requests per second.
|
|
381
|
+
*/
|
|
382
|
+
maxRequestsPerSecond: number;
|
|
383
|
+
/**
|
|
384
|
+
* - Lifetime memory extremes.
|
|
385
|
+
*/
|
|
386
|
+
maxMemory: MemoryLifetime;
|
|
387
|
+
/**
|
|
388
|
+
* - CPU extremes.
|
|
389
|
+
*/
|
|
390
|
+
cpu: {
|
|
391
|
+
max: number;
|
|
392
|
+
userMax: number;
|
|
393
|
+
systemMax: number;
|
|
394
|
+
};
|
|
395
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const traceManager: TraceManager;
|
|
2
|
+
export type TraceEntry = import("../admin/js/types.js").TraceEntry;
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {import('../admin/js/types.js').TraceEntry} TraceEntry
|
|
5
|
+
*/
|
|
6
|
+
declare class TraceManager {
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
filename: string;
|
|
9
|
+
maxEntries: number;
|
|
10
|
+
/**
|
|
11
|
+
* Toggle tracing
|
|
12
|
+
* @param {boolean} enabled - New state
|
|
13
|
+
*/
|
|
14
|
+
setEnabled(enabled: boolean): void;
|
|
15
|
+
/**
|
|
16
|
+
* Is tracing enabled?
|
|
17
|
+
* @returns {boolean} - The state
|
|
18
|
+
*/
|
|
19
|
+
isEnabled(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Add a trace entry
|
|
22
|
+
* @param {object} entry - The trace entry
|
|
23
|
+
*/
|
|
24
|
+
addTrace(entry: object): void;
|
|
25
|
+
/**
|
|
26
|
+
* Clear all traces
|
|
27
|
+
*/
|
|
28
|
+
clear(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get the full path to the trace file
|
|
31
|
+
* @returns {string} - The path
|
|
32
|
+
*/
|
|
33
|
+
getFilePath(): string;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-bold:700;--tracking-wider:.05em;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-success:#10b981;--color-danger:#ef4444}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.static{position:static}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.table{display:table}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-3{gap:calc(var(--spacing)*3)}.gap-6{gap:calc(var(--spacing)*6)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.pt-4{padding-top:calc(var(--spacing)*4)}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.text-danger{color:var(--color-danger)}.text-success{color:var(--color-success)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.opacity-75{opacity:.75}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}body{-webkit-font-smoothing:antialiased;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}body.dark{--bg-main:#0f172a;--bg-side:#1e293b;--bg-card:#1e293b;--bg-hover:#334155;--text-main:#94a3b8;--text-bright:#f8fafc;--border:#334155}body:not(.dark){--bg-main:#f8fafc;--bg-side:#fff;--bg-card:#fff;--bg-hover:#f1f5f9;--text-main:#475569;--text-bright:#0f172a;--border:#e2e8f0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}
|