adonisjs-server-stats 1.10.0 → 1.10.3
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 +23 -14
- package/dist/core/config-utils.d.ts +8 -0
- package/dist/core/constants.d.ts +4 -0
- package/dist/core/dashboard-data-controller.d.ts +16 -0
- package/dist/core/dashboard-data-helpers.d.ts +12 -0
- package/dist/core/debug-data-controller.d.ts +4 -0
- package/dist/core/define-config-helpers.d.ts +25 -0
- package/dist/core/feature-detect-helpers.d.ts +36 -0
- package/dist/core/formatters-helpers.d.ts +23 -0
- package/dist/core/index.js +594 -509
- package/dist/core/log-utils-helpers.d.ts +13 -0
- package/dist/core/metrics.d.ts +3 -28
- package/dist/core/pagination.d.ts +0 -9
- package/dist/core/server-stats-controller.d.ts +6 -0
- package/dist/core/transmit-helpers.d.ts +7 -0
- package/dist/core/types-dashboard.d.ts +178 -0
- package/dist/core/types-diagnostics.d.ts +85 -0
- package/dist/core/types.d.ts +10 -442
- package/dist/react/{CacheSection-UCMptWyn.js → CacheSection-baMZotSn.js} +2 -2
- package/dist/react/CacheTab-2cw_rMzj.js +117 -0
- package/dist/react/{ConfigSection-DfFd-WRq.js → ConfigSection-DGgqjAal.js} +1 -1
- package/dist/react/{ConfigTab-Bdg8YMer.js → ConfigTab-H3OnYqmK.js} +1 -1
- package/dist/react/CustomPaneTab-B6r7ha0u.js +98 -0
- package/dist/react/{EmailsSection-CM7stSyh.js → EmailsSection-C-UZISG-.js} +2 -2
- package/dist/react/EmailsTab-DbK4Eobn.js +139 -0
- package/dist/react/{EventsSection-ByQ-9blq.js → EventsSection-C7RQW_LY.js} +2 -2
- package/dist/react/EventsTab-CfVr7AiM.js +57 -0
- package/dist/react/{FilterBar-DQRXpWrb.js → FilterBar-CQ7bD669.js} +15 -15
- package/dist/react/{JobsSection-DF3qEv9O.js → JobsSection-CQHNK_Ls.js} +2 -2
- package/dist/react/{JobsTab-BbrBWIOb.js → JobsTab-znzf6jzk.js} +54 -42
- package/dist/react/{LogsSection-DcFTZY7b.js → LogsSection-Dmm3rE2B.js} +9 -3
- package/dist/react/LogsTab-D8unMV5P.js +108 -0
- package/dist/react/{OverviewSection-C4T1ur51.js → OverviewSection-ABP9ueBo.js} +1 -1
- package/dist/react/{QueriesSection-PswteoF9.js → QueriesSection-CnmSkznA.js} +2 -2
- package/dist/react/{QueriesTab-osLUWd4L.js → QueriesTab-BQzcxEiW.js} +37 -40
- package/dist/react/{RelatedLogs-DFDOyUMr.js → RelatedLogs-3A8RuGKH.js} +15 -3
- package/dist/react/{RequestsSection-Nag30rEA.js → RequestsSection-kW79_M7k.js} +3 -3
- package/dist/react/{RoutesSection-BUSkM6PY.js → RoutesSection-BRhxrtjZ.js} +2 -2
- package/dist/react/RoutesTab-CpYH5lUw.js +68 -0
- package/dist/react/{TimelineTab-Covg5weo.js → TimelineTab-DjLR35Ce.js} +47 -53
- package/dist/react/index-CsImORX6.js +1121 -0
- package/dist/react/index.js +1 -1
- package/dist/react/react/components/{Dashboard/shared → shared}/FilterBar.d.ts +4 -3
- package/dist/react/react/hooks/useDashboardData.d.ts +4 -8
- package/dist/react/style.css +1 -1
- package/dist/src/collectors/app_collector.d.ts +0 -8
- package/dist/src/collectors/app_collector.js +45 -52
- package/dist/src/collectors/auto_detect.d.ts +0 -23
- package/dist/src/collectors/auto_detect.js +33 -55
- package/dist/src/collectors/db_pool_collector.d.ts +14 -16
- package/dist/src/collectors/db_pool_collector.js +72 -57
- package/dist/src/collectors/log_collector.d.ts +0 -47
- package/dist/src/collectors/log_collector.js +36 -65
- package/dist/src/collectors/queue_collector.d.ts +0 -20
- package/dist/src/collectors/queue_collector.js +60 -76
- package/dist/src/collectors/redis_collector.d.ts +10 -10
- package/dist/src/collectors/redis_collector.js +69 -66
- package/dist/src/config/deprecation_migration.d.ts +7 -0
- package/dist/src/config/deprecation_migration.js +201 -0
- package/dist/src/controller/debug_controller.d.ts +1 -1
- package/dist/src/controller/debug_controller.js +87 -81
- package/dist/src/dashboard/cache_handlers.d.ts +14 -0
- package/dist/src/dashboard/cache_handlers.js +52 -0
- package/dist/src/dashboard/chart_aggregator.d.ts +0 -7
- package/dist/src/dashboard/chart_aggregator.js +68 -50
- package/dist/src/dashboard/coalesce_cache.d.ts +25 -0
- package/dist/src/dashboard/coalesce_cache.js +47 -0
- package/dist/src/dashboard/dashboard_controller.d.ts +11 -37
- package/dist/src/dashboard/dashboard_controller.js +51 -544
- package/dist/src/dashboard/dashboard_page_assets.d.ts +17 -0
- package/dist/src/dashboard/dashboard_page_assets.js +51 -0
- package/dist/src/dashboard/dashboard_store.d.ts +19 -218
- package/dist/src/dashboard/dashboard_store.js +115 -1116
- package/dist/src/dashboard/dashboard_types.d.ts +83 -0
- package/dist/src/dashboard/dashboard_types.js +4 -0
- package/dist/src/dashboard/detail_queries.d.ts +19 -0
- package/dist/src/dashboard/detail_queries.js +98 -0
- package/dist/src/dashboard/email_event_builder.d.ts +8 -0
- package/dist/src/dashboard/email_event_builder.js +65 -0
- package/dist/src/dashboard/explain_query.d.ts +8 -0
- package/dist/src/dashboard/explain_query.js +22 -0
- package/dist/src/dashboard/filter_handlers.d.ts +23 -0
- package/dist/src/dashboard/filter_handlers.js +56 -0
- package/dist/src/dashboard/filtered_queries.d.ts +15 -0
- package/dist/src/dashboard/filtered_queries.js +155 -0
- package/dist/src/dashboard/flush_manager.d.ts +25 -0
- package/dist/src/dashboard/flush_manager.js +107 -0
- package/dist/src/dashboard/format_helpers.d.ts +126 -0
- package/dist/src/dashboard/format_helpers.js +140 -0
- package/dist/src/dashboard/inspector_manager.d.ts +36 -0
- package/dist/src/dashboard/inspector_manager.js +102 -0
- package/dist/src/dashboard/integrations/config_inspector.js +11 -13
- package/dist/src/dashboard/integrations/queue_inspector.d.ts +3 -3
- package/dist/src/dashboard/integrations/queue_inspector.js +13 -10
- package/dist/src/dashboard/jobs_handlers.d.ts +14 -0
- package/dist/src/dashboard/jobs_handlers.js +61 -0
- package/dist/src/dashboard/knex_factory.d.ts +18 -0
- package/dist/src/dashboard/knex_factory.js +91 -0
- package/dist/src/dashboard/migrator.js +30 -159
- package/dist/src/dashboard/migrator_tables.d.ts +19 -0
- package/dist/src/dashboard/migrator_tables.js +153 -0
- package/dist/src/dashboard/overview_queries.d.ts +66 -0
- package/dist/src/dashboard/overview_queries.js +155 -0
- package/dist/src/dashboard/overview_query_runners.d.ts +25 -0
- package/dist/src/dashboard/overview_query_runners.js +84 -0
- package/dist/src/dashboard/overview_store_queries.d.ts +40 -0
- package/dist/src/dashboard/overview_store_queries.js +69 -0
- package/dist/src/dashboard/paginate_helper.d.ts +12 -0
- package/dist/src/dashboard/paginate_helper.js +33 -0
- package/dist/src/dashboard/query_explain_handler.d.ts +10 -0
- package/dist/src/dashboard/query_explain_handler.js +80 -0
- package/dist/src/dashboard/read_queries.d.ts +32 -0
- package/dist/src/dashboard/read_queries.js +107 -0
- package/dist/src/dashboard/saved_filter_queries.d.ts +10 -0
- package/dist/src/dashboard/saved_filter_queries.js +24 -0
- package/dist/src/dashboard/storage_stats.d.ts +41 -0
- package/dist/src/dashboard/storage_stats.js +81 -0
- package/dist/src/dashboard/write_queue.d.ts +106 -0
- package/dist/src/dashboard/write_queue.js +225 -0
- package/dist/src/data/data_access.d.ts +2 -39
- package/dist/src/data/data_access.js +17 -193
- package/dist/src/data/data_access_helpers.d.ts +130 -0
- package/dist/src/data/data_access_helpers.js +212 -0
- package/dist/src/debug/debug_store.js +37 -32
- package/dist/src/debug/email_collector.d.ts +1 -10
- package/dist/src/debug/email_collector.js +78 -81
- package/dist/src/debug/event_collector.d.ts +0 -9
- package/dist/src/debug/event_collector.js +79 -62
- package/dist/src/debug/query_collector.js +23 -19
- package/dist/src/debug/route_inspector.d.ts +1 -5
- package/dist/src/debug/route_inspector.js +50 -51
- package/dist/src/debug/trace_collector.d.ts +9 -1
- package/dist/src/debug/trace_collector.js +21 -15
- package/dist/src/debug/types.d.ts +1 -1
- package/dist/src/define_config.d.ts +0 -65
- package/dist/src/define_config.js +93 -333
- package/dist/src/edge/client/dashboard.js +2 -2
- package/dist/src/edge/client/debug-panel-deferred.js +1 -1
- package/dist/src/edge/client/stats-bar.js +1 -1
- package/dist/src/edge/client-vue/dashboard.js +5 -5
- package/dist/src/edge/client-vue/debug-panel-deferred.js +3 -3
- package/dist/src/edge/client-vue/stats-bar.js +3 -3
- package/dist/src/edge/plugin.d.ts +0 -16
- package/dist/src/edge/plugin.js +57 -64
- package/dist/src/engine/request_metrics.d.ts +1 -0
- package/dist/src/engine/request_metrics.js +32 -42
- package/dist/src/middleware/request_tracking_middleware.d.ts +2 -8
- package/dist/src/middleware/request_tracking_middleware.js +65 -93
- package/dist/src/provider/auth_middleware_detector.d.ts +16 -0
- package/dist/src/provider/auth_middleware_detector.js +97 -0
- package/dist/src/provider/boot_helpers.d.ts +20 -0
- package/dist/src/provider/boot_helpers.js +91 -0
- package/dist/src/provider/boot_initializer.d.ts +28 -0
- package/dist/src/provider/boot_initializer.js +35 -0
- package/dist/src/provider/dashboard_init.d.ts +30 -0
- package/dist/src/provider/dashboard_init.js +138 -0
- package/dist/src/provider/dashboard_setup.d.ts +25 -0
- package/dist/src/provider/dashboard_setup.js +78 -0
- package/dist/src/provider/diagnostics.d.ts +134 -0
- package/dist/src/provider/diagnostics.js +127 -0
- package/dist/src/provider/email_bridge.d.ts +43 -0
- package/dist/src/provider/email_bridge.js +80 -0
- package/dist/src/provider/email_helpers.d.ts +13 -0
- package/dist/src/provider/email_helpers.js +68 -0
- package/dist/src/provider/pino_hook.d.ts +17 -0
- package/dist/src/provider/pino_hook.js +35 -0
- package/dist/src/provider/provider_helpers_extra.d.ts +47 -0
- package/dist/src/provider/provider_helpers_extra.js +177 -0
- package/dist/src/provider/server_stats_provider.d.ts +39 -85
- package/dist/src/provider/server_stats_provider.js +132 -951
- package/dist/src/provider/shutdown_helpers.d.ts +43 -0
- package/dist/src/provider/shutdown_helpers.js +70 -0
- package/dist/src/provider/toolbar_setup.d.ts +57 -0
- package/dist/src/provider/toolbar_setup.js +141 -0
- package/dist/src/routes/dashboard_routes.d.ts +14 -0
- package/dist/src/routes/dashboard_routes.js +197 -0
- package/dist/src/routes/debug_routes.d.ts +14 -0
- package/dist/src/routes/debug_routes.js +101 -0
- package/dist/src/routes/register_routes.d.ts +0 -78
- package/dist/src/routes/register_routes.js +22 -352
- package/dist/src/routes/stats_routes.d.ts +5 -0
- package/dist/src/routes/stats_routes.js +14 -0
- package/dist/src/styles/components.css +96 -0
- package/dist/src/styles/dashboard.css +8 -90
- package/dist/src/styles/debug-panel.css +1 -31
- package/dist/src/types.d.ts +305 -14
- package/dist/vue/{CacheSection-oFAJL3mo.js → CacheSection-ITqvpfH5.js} +1 -1
- package/dist/vue/{ConfigSection-BhfJ4KqL.js → ConfigSection-DTn3GslE.js} +1 -1
- package/dist/vue/{EmailsSection-BcNyhyHs.js → EmailsSection-DtLJ4XoS.js} +1 -1
- package/dist/vue/{EventsSection-r60Q5Lmu.js → EventsSection-BOYYz0Ty.js} +1 -1
- package/dist/vue/{JobsSection-BHL-hkQw.js → JobsSection-BazTxcJL.js} +1 -1
- package/dist/vue/{LogsSection-DRMGzJmg.js → LogsSection-D55PjTKX.js} +9 -3
- package/dist/vue/{LogsTab-Bg3o0Mm6.js → LogsTab-47zEK7jL.js} +4 -1
- package/dist/vue/{OverviewSection-CXh6Ja1B.js → OverviewSection-1uBKo-Tu.js} +1 -1
- package/dist/vue/{QueriesSection-IodIsCJ-.js → QueriesSection-rpoZ4ogd.js} +1 -1
- package/dist/vue/{RequestsSection-BPuMdmMc.js → RequestsSection-x7LvT0MC.js} +1 -1
- package/dist/vue/{RoutesSection-NKo3Rbq3.js → RoutesSection-CCD0zZqQ.js} +1 -1
- package/dist/vue/composables/useDashboardData.d.ts +12 -23
- package/dist/vue/index-C8MxnS7Q.js +1232 -0
- package/dist/vue/index.js +1 -1
- package/dist/vue/style.css +1 -1
- package/package.json +1 -1
- package/dist/react/CacheTab-CA8LB1J5.js +0 -123
- package/dist/react/CustomPaneTab-Bxtv_8Rw.js +0 -104
- package/dist/react/EmailsTab-BDhEiomM.js +0 -153
- package/dist/react/EventsTab-CMfY98Rl.js +0 -63
- package/dist/react/LogsTab-CicucmVk.js +0 -103
- package/dist/react/RoutesTab-DgVzd2PZ.js +0 -74
- package/dist/react/index-Cflz9Ebj.js +0 -1069
- package/dist/vue/index-Dtgysd26.js +0 -1229
|
@@ -1,46 +1,64 @@
|
|
|
1
1
|
import { log } from '../utils/logger.js';
|
|
2
|
+
/** Resolve middleware items from a MiddlewareStore or array. */
|
|
3
|
+
function resolveMiddlewareItems(middleware) {
|
|
4
|
+
if (!middleware)
|
|
5
|
+
return [];
|
|
6
|
+
if (Array.isArray(middleware))
|
|
7
|
+
return middleware;
|
|
8
|
+
if (typeof middleware.all === 'function')
|
|
9
|
+
return middleware.all();
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
/** Resolve a single middleware item to its display name. */
|
|
13
|
+
function resolveMiddlewareName(m) {
|
|
14
|
+
if (typeof m === 'string')
|
|
15
|
+
return m;
|
|
16
|
+
if (typeof m === 'function')
|
|
17
|
+
return m.name || null;
|
|
18
|
+
if (m?.name) {
|
|
19
|
+
const args = m.args?.length ? `(${JSON.stringify(m.args).slice(1, -1)})` : '';
|
|
20
|
+
return m.name + args;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
2
24
|
/**
|
|
3
25
|
* Reads the router's route table at boot time and caches it.
|
|
4
|
-
* Static data computed once — routes don't change after boot.
|
|
5
26
|
*/
|
|
6
27
|
export class RouteInspector {
|
|
7
28
|
routes = [];
|
|
8
|
-
/**
|
|
9
|
-
* Inspect the router and cache all routes.
|
|
10
|
-
* Call this in the provider's `ready()` hook.
|
|
11
|
-
*/
|
|
12
29
|
inspect(router) {
|
|
13
30
|
try {
|
|
14
|
-
// AdonisJS router exposes routes via toJSON()
|
|
15
31
|
const routeData = router.toJSON();
|
|
16
32
|
this.routes = [];
|
|
17
|
-
// routeData is a map of domains -> routes
|
|
18
33
|
for (const domain in routeData) {
|
|
19
34
|
const domainRoutes = routeData[domain];
|
|
20
35
|
if (!Array.isArray(domainRoutes))
|
|
21
36
|
continue;
|
|
22
|
-
|
|
23
|
-
const methods = Array.isArray(route.methods)
|
|
24
|
-
? route.methods.filter((m) => m !== 'HEAD')
|
|
25
|
-
: [];
|
|
26
|
-
const handler = this.resolveHandler(route.handler);
|
|
27
|
-
const middlewareList = this.resolveMiddleware(route.middleware);
|
|
28
|
-
for (const method of methods) {
|
|
29
|
-
this.routes.push({
|
|
30
|
-
method,
|
|
31
|
-
pattern: route.pattern || '/',
|
|
32
|
-
name: route.name || null,
|
|
33
|
-
handler,
|
|
34
|
-
middleware: middlewareList,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
}
|
|
37
|
+
this.#processDomainRoutes(domainRoutes);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
catch (err) {
|
|
41
41
|
log.warn(`route inspector: could not read routes — ${err?.message || 'unknown error'}`);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
#processDomainRoutes(domainRoutes) {
|
|
45
|
+
for (const route of domainRoutes) {
|
|
46
|
+
const methods = Array.isArray(route.methods)
|
|
47
|
+
? route.methods.filter((m) => m !== 'HEAD')
|
|
48
|
+
: [];
|
|
49
|
+
const handler = this.resolveHandler(route.handler);
|
|
50
|
+
const middlewareList = this.resolveMiddleware(route.middleware);
|
|
51
|
+
for (const method of methods) {
|
|
52
|
+
this.routes.push({
|
|
53
|
+
method,
|
|
54
|
+
pattern: route.pattern || '/',
|
|
55
|
+
name: route.name || null,
|
|
56
|
+
handler,
|
|
57
|
+
middleware: middlewareList,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
44
62
|
resolveHandler(handler) {
|
|
45
63
|
if (!handler)
|
|
46
64
|
return 'unknown';
|
|
@@ -48,44 +66,25 @@ export class RouteInspector {
|
|
|
48
66
|
return handler;
|
|
49
67
|
if (typeof handler === 'function')
|
|
50
68
|
return handler.name || 'closure';
|
|
51
|
-
|
|
69
|
+
return this.#resolveObjectHandler(handler);
|
|
70
|
+
}
|
|
71
|
+
#resolveObjectHandler(handler) {
|
|
52
72
|
if (handler.reference) {
|
|
53
73
|
const ref = handler.reference;
|
|
54
74
|
if (typeof ref === 'string')
|
|
55
75
|
return ref;
|
|
56
|
-
if (Array.isArray(ref) && ref.length >= 2)
|
|
76
|
+
if (Array.isArray(ref) && ref.length >= 2)
|
|
57
77
|
return `${ref[0]}#${ref[1]}`;
|
|
58
|
-
}
|
|
59
78
|
}
|
|
60
|
-
|
|
61
|
-
if (handler.name)
|
|
62
|
-
return handler.name;
|
|
63
|
-
return 'unknown';
|
|
79
|
+
return handler.name || 'unknown';
|
|
64
80
|
}
|
|
65
81
|
resolveMiddleware(middleware) {
|
|
66
|
-
|
|
67
|
-
return [];
|
|
68
|
-
// AdonisJS v6 middleware is a Middleware instance from @poppinss/middleware.
|
|
69
|
-
// Call .all() to get the Set of middleware items.
|
|
70
|
-
const items = !Array.isArray(middleware) && typeof middleware.all === 'function'
|
|
71
|
-
? middleware.all()
|
|
72
|
-
: Array.isArray(middleware)
|
|
73
|
-
? middleware
|
|
74
|
-
: [];
|
|
82
|
+
const items = resolveMiddlewareItems(middleware);
|
|
75
83
|
const result = [];
|
|
76
84
|
for (const m of items) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
else if (typeof m === 'function') {
|
|
81
|
-
if (m.name)
|
|
82
|
-
result.push(m.name);
|
|
83
|
-
}
|
|
84
|
-
else if (m?.name) {
|
|
85
|
-
const args = m.args?.length ? `(${JSON.stringify(m.args).slice(1, -1)})` : '';
|
|
86
|
-
result.push(m.name + args);
|
|
87
|
-
}
|
|
88
|
-
// Skip unnamed global middleware (router.use lazy imports) — same for every route
|
|
85
|
+
const name = resolveMiddlewareName(m);
|
|
86
|
+
if (name)
|
|
87
|
+
result.push(name);
|
|
89
88
|
}
|
|
90
89
|
return result;
|
|
91
90
|
}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { TraceSpan, TraceRecord, Emitter } from './types.js';
|
|
2
|
+
/** Input for adding a span to the current trace. */
|
|
3
|
+
export interface AddSpanInput {
|
|
4
|
+
label: string;
|
|
5
|
+
category: TraceSpan['category'];
|
|
6
|
+
startOffset: number;
|
|
7
|
+
duration: number;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
}
|
|
2
10
|
/**
|
|
3
11
|
* Wrap an async function in a traced span.
|
|
4
12
|
*
|
|
@@ -34,7 +42,7 @@ export declare class TraceCollector {
|
|
|
34
42
|
/** Finish the current trace and save it to the ring buffer. Returns the record, or null if no context. */
|
|
35
43
|
finishTrace(method: string, url: string, statusCode: number, httpRequestId?: string): TraceRecord | null;
|
|
36
44
|
/** Add a span to the current trace (if active). */
|
|
37
|
-
addSpan(
|
|
45
|
+
addSpan(input: AddSpanInput): void;
|
|
38
46
|
/** Wrap a function in a traced span with automatic nesting. */
|
|
39
47
|
span<T>(label: string, category: TraceSpan['category'], fn: () => Promise<T>): Promise<T>;
|
|
40
48
|
/** Hook into db:query events and console.warn to auto-create spans. */
|
|
@@ -5,7 +5,7 @@ import { RingBuffer } from './ring_buffer.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* Module-level singleton reference for the `trace()` helper.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
const globalRef = { current: null };
|
|
9
9
|
/**
|
|
10
10
|
* Wrap an async function in a traced span.
|
|
11
11
|
*
|
|
@@ -22,9 +22,9 @@ let globalTraceCollector = null;
|
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
24
|
export async function trace(label, fn) {
|
|
25
|
-
if (!
|
|
25
|
+
if (!globalRef.current)
|
|
26
26
|
return fn();
|
|
27
|
-
return
|
|
27
|
+
return globalRef.current.span(label, 'custom', fn);
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Collects per-request traces using AsyncLocalStorage.
|
|
@@ -41,7 +41,7 @@ export class TraceCollector {
|
|
|
41
41
|
originalConsoleWarn = null;
|
|
42
42
|
constructor(maxTraces = 200) {
|
|
43
43
|
this.buffer = new RingBuffer(maxTraces);
|
|
44
|
-
|
|
44
|
+
globalRef.current = this;
|
|
45
45
|
}
|
|
46
46
|
/** Start a new trace context for an HTTP request. */
|
|
47
47
|
startTrace(callback) {
|
|
@@ -76,7 +76,7 @@ export class TraceCollector {
|
|
|
76
76
|
return record;
|
|
77
77
|
}
|
|
78
78
|
/** Add a span to the current trace (if active). */
|
|
79
|
-
addSpan(
|
|
79
|
+
addSpan(input) {
|
|
80
80
|
const ctx = this.als.getStore();
|
|
81
81
|
if (!ctx)
|
|
82
82
|
return;
|
|
@@ -85,11 +85,11 @@ export class TraceCollector {
|
|
|
85
85
|
ctx.spans.push({
|
|
86
86
|
id: String(ctx.nextSpanId++),
|
|
87
87
|
parentId: ctx.currentSpanId,
|
|
88
|
-
label,
|
|
89
|
-
category,
|
|
90
|
-
startOffset: round(startOffset),
|
|
91
|
-
duration: round(duration),
|
|
92
|
-
metadata,
|
|
88
|
+
label: input.label,
|
|
89
|
+
category: input.category,
|
|
90
|
+
startOffset: round(input.startOffset),
|
|
91
|
+
duration: round(input.duration),
|
|
92
|
+
metadata: input.metadata,
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
/** Wrap a function in a traced span with automatic nesting. */
|
|
@@ -131,10 +131,16 @@ export class TraceCollector {
|
|
|
131
131
|
? data.duration[0] * 1e3 + data.duration[1] / 1e6
|
|
132
132
|
: 0;
|
|
133
133
|
const offset = performance.now() - ctx.requestStart - duration;
|
|
134
|
-
this.addSpan(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
this.addSpan({
|
|
135
|
+
label: data.sql || 'query',
|
|
136
|
+
category: 'db',
|
|
137
|
+
startOffset: offset,
|
|
138
|
+
duration,
|
|
139
|
+
metadata: {
|
|
140
|
+
method: data.method,
|
|
141
|
+
model: data.model,
|
|
142
|
+
connection: data.connection,
|
|
143
|
+
},
|
|
138
144
|
});
|
|
139
145
|
};
|
|
140
146
|
emitter.on('db:query', this.dbHandler);
|
|
@@ -160,7 +166,7 @@ export class TraceCollector {
|
|
|
160
166
|
this.dbHandler = null;
|
|
161
167
|
this.emitter = null;
|
|
162
168
|
this.originalConsoleWarn = null;
|
|
163
|
-
|
|
169
|
+
globalRef.current = null;
|
|
164
170
|
}
|
|
165
171
|
getTraces() {
|
|
166
172
|
return this.buffer.toArray().reverse();
|
|
@@ -1,67 +1,2 @@
|
|
|
1
1
|
import type { ResolvedServerStatsConfig, ServerStatsConfig } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Define the server stats configuration with full type safety.
|
|
4
|
-
*
|
|
5
|
-
* All top-level fields are optional. Sensible defaults are applied
|
|
6
|
-
* for any omitted fields:
|
|
7
|
-
*
|
|
8
|
-
* | Field | Default |
|
|
9
|
-
* |---------------|--------------------------------|
|
|
10
|
-
* | `intervalMs` | `3000` |
|
|
11
|
-
* | `transport` | `'transmit'` |
|
|
12
|
-
* | `channelName` | `'admin/server-stats'` |
|
|
13
|
-
* | `endpoint` | `'/admin/api/server-stats'` |
|
|
14
|
-
* | `collectors` | `'auto'` |
|
|
15
|
-
* | `skipInTest` | `true` |
|
|
16
|
-
*
|
|
17
|
-
* New simplified aliases (Phase 1) are also supported. When both the
|
|
18
|
-
* old name and its alias are provided, the **new name takes precedence**.
|
|
19
|
-
*
|
|
20
|
-
* | Alias | Resolves to |
|
|
21
|
-
* |------------------|------------------|
|
|
22
|
-
* | `pollInterval` | `intervalMs` |
|
|
23
|
-
* | `realtime` | `transport` |
|
|
24
|
-
* | `statsEndpoint` | `endpoint` |
|
|
25
|
-
* | `authorize` | `shouldShow` |
|
|
26
|
-
* | `toolbar` | `devToolbar` |
|
|
27
|
-
* | `dashboard` | `devToolbar` |
|
|
28
|
-
* | `advanced` | various |
|
|
29
|
-
*
|
|
30
|
-
* This is the main entry point for configuring `adonisjs-server-stats`.
|
|
31
|
-
* Call it in `config/server_stats.ts` and export the result as default.
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```ts
|
|
35
|
-
* // config/server_stats.ts — minimal (all defaults)
|
|
36
|
-
* import { defineConfig } from 'adonisjs-server-stats'
|
|
37
|
-
*
|
|
38
|
-
* export default defineConfig({})
|
|
39
|
-
* ```
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```ts
|
|
43
|
-
* // config/server_stats.ts — explicit collectors
|
|
44
|
-
* import { defineConfig } from 'adonisjs-server-stats'
|
|
45
|
-
* import { processCollector, httpCollector } from 'adonisjs-server-stats/collectors'
|
|
46
|
-
*
|
|
47
|
-
* export default defineConfig({
|
|
48
|
-
* intervalMs: 3000,
|
|
49
|
-
* transport: 'transmit',
|
|
50
|
-
* collectors: [processCollector(), httpCollector()],
|
|
51
|
-
* })
|
|
52
|
-
* ```
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* ```ts
|
|
56
|
-
* // config/server_stats.ts — new simplified aliases
|
|
57
|
-
* import { defineConfig } from 'adonisjs-server-stats'
|
|
58
|
-
*
|
|
59
|
-
* export default defineConfig({
|
|
60
|
-
* pollInterval: 3000,
|
|
61
|
-
* realtime: true,
|
|
62
|
-
* toolbar: true,
|
|
63
|
-
* dashboard: true,
|
|
64
|
-
* })
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
2
|
export declare function defineConfig(config: ServerStatsConfig): ResolvedServerStatsConfig;
|