adonisjs-server-stats 1.2.2 → 1.3.1
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 +148 -9
- package/dist/src/dashboard/chart_aggregator.d.ts +21 -0
- package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -0
- package/dist/src/dashboard/chart_aggregator.js +89 -0
- package/dist/src/dashboard/dashboard_controller.d.ts +147 -0
- package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -0
- package/dist/src/dashboard/dashboard_controller.js +1008 -0
- package/dist/src/dashboard/dashboard_routes.d.ts +16 -0
- package/dist/src/dashboard/dashboard_routes.d.ts.map +1 -0
- package/dist/src/dashboard/dashboard_routes.js +88 -0
- package/dist/src/dashboard/dashboard_store.d.ts +158 -0
- package/dist/src/dashboard/dashboard_store.d.ts.map +1 -0
- package/dist/src/dashboard/dashboard_store.js +723 -0
- package/dist/src/dashboard/integrations/cache_inspector.d.ts +88 -0
- package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -0
- package/dist/src/dashboard/integrations/cache_inspector.js +215 -0
- package/dist/src/dashboard/integrations/config_inspector.d.ts +33 -0
- package/dist/src/dashboard/integrations/config_inspector.d.ts.map +1 -0
- package/dist/src/dashboard/integrations/config_inspector.js +155 -0
- package/dist/src/dashboard/integrations/index.d.ts +7 -0
- package/dist/src/dashboard/integrations/index.d.ts.map +1 -0
- package/dist/src/dashboard/integrations/index.js +3 -0
- package/dist/src/dashboard/integrations/queue_inspector.d.ts +106 -0
- package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -0
- package/dist/src/dashboard/integrations/queue_inspector.js +182 -0
- package/dist/src/dashboard/migrator.d.ts +18 -0
- package/dist/src/dashboard/migrator.d.ts.map +1 -0
- package/dist/src/dashboard/migrator.js +144 -0
- package/dist/src/dashboard/models/stats_email.d.ts +19 -0
- package/dist/src/dashboard/models/stats_email.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_email.js +66 -0
- package/dist/src/dashboard/models/stats_event.d.ts +14 -0
- package/dist/src/dashboard/models/stats_event.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_event.js +43 -0
- package/dist/src/dashboard/models/stats_log.d.ts +12 -0
- package/dist/src/dashboard/models/stats_log.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_log.js +42 -0
- package/dist/src/dashboard/models/stats_metric.d.ts +15 -0
- package/dist/src/dashboard/models/stats_metric.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_metric.js +50 -0
- package/dist/src/dashboard/models/stats_query.d.ts +20 -0
- package/dist/src/dashboard/models/stats_query.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_query.js +67 -0
- package/dist/src/dashboard/models/stats_request.d.ts +21 -0
- package/dist/src/dashboard/models/stats_request.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_request.js +61 -0
- package/dist/src/dashboard/models/stats_saved_filter.d.ts +11 -0
- package/dist/src/dashboard/models/stats_saved_filter.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_saved_filter.js +38 -0
- package/dist/src/dashboard/models/stats_trace.d.ts +19 -0
- package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -0
- package/dist/src/dashboard/models/stats_trace.js +67 -0
- package/dist/src/debug/debug_store.d.ts +5 -0
- package/dist/src/debug/debug_store.d.ts.map +1 -1
- package/dist/src/debug/debug_store.js +10 -0
- package/dist/src/debug/email_collector.d.ts +2 -0
- package/dist/src/debug/email_collector.d.ts.map +1 -1
- package/dist/src/debug/email_collector.js +4 -0
- package/dist/src/debug/event_collector.d.ts +2 -0
- package/dist/src/debug/event_collector.d.ts.map +1 -1
- package/dist/src/debug/event_collector.js +11 -2
- package/dist/src/debug/query_collector.d.ts +2 -0
- package/dist/src/debug/query_collector.d.ts.map +1 -1
- package/dist/src/debug/query_collector.js +11 -0
- package/dist/src/debug/ring_buffer.d.ts +3 -0
- package/dist/src/debug/ring_buffer.d.ts.map +1 -1
- package/dist/src/debug/ring_buffer.js +6 -0
- package/dist/src/debug/trace_collector.d.ts +4 -2
- package/dist/src/debug/trace_collector.d.ts.map +1 -1
- package/dist/src/debug/trace_collector.js +7 -2
- package/dist/src/debug/types.d.ts +8 -0
- package/dist/src/debug/types.d.ts.map +1 -1
- package/dist/src/edge/client/dashboard.css +1504 -0
- package/dist/src/edge/client/dashboard.js +2378 -0
- package/dist/src/edge/client/debug-panel.css +528 -108
- package/dist/src/edge/client/debug-panel.js +663 -22
- package/dist/src/edge/client/stats-bar.css +112 -38
- package/dist/src/edge/client/stats-bar.js +37 -3
- package/dist/src/edge/plugin.d.ts.map +1 -1
- package/dist/src/edge/plugin.js +21 -0
- package/dist/src/edge/views/dashboard.edge +382 -0
- package/dist/src/edge/views/debug-panel.edge +60 -14
- package/dist/src/edge/views/stats-bar.edge +9 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/middleware/request_tracking_middleware.d.ts +20 -0
- package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
- package/dist/src/middleware/request_tracking_middleware.js +66 -2
- package/dist/src/provider/server_stats_provider.d.ts +13 -0
- package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
- package/dist/src/provider/server_stats_provider.js +175 -1
- package/dist/src/types.d.ts +42 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +14 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type DashboardController from './dashboard_controller.js';
|
|
2
|
+
/**
|
|
3
|
+
* Register all dashboard routes under the configured path.
|
|
4
|
+
*
|
|
5
|
+
* Uses closure-based handlers with a lazy controller getter so that
|
|
6
|
+
* routes can be registered during `boot()` (before the router commits)
|
|
7
|
+
* while the controller is created later during `ready()`.
|
|
8
|
+
*
|
|
9
|
+
* @param router The AdonisJS router instance.
|
|
10
|
+
* @param dashboardPath The base path for the dashboard (e.g. `/__stats`).
|
|
11
|
+
* @param getController Lazy getter that returns the controller (or null if not ready).
|
|
12
|
+
* @param shouldShow Optional access-control callback; when set, all routes
|
|
13
|
+
* are gated by it (returns 403 on denial).
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerDashboardRoutes(router: any, dashboardPath: string, getController: () => DashboardController | null, shouldShow?: (ctx: any) => boolean): void;
|
|
16
|
+
//# sourceMappingURL=dashboard_routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard_routes.d.ts","sourceRoot":"","sources":["../../../src/dashboard/dashboard_routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,mBAAmB,MAAM,2BAA2B,CAAA;AAEhE;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,GAAG,EACX,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,mBAAmB,GAAG,IAAI,EAC/C,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,QAyEnC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register all dashboard routes under the configured path.
|
|
3
|
+
*
|
|
4
|
+
* Uses closure-based handlers with a lazy controller getter so that
|
|
5
|
+
* routes can be registered during `boot()` (before the router commits)
|
|
6
|
+
* while the controller is created later during `ready()`.
|
|
7
|
+
*
|
|
8
|
+
* @param router The AdonisJS router instance.
|
|
9
|
+
* @param dashboardPath The base path for the dashboard (e.g. `/__stats`).
|
|
10
|
+
* @param getController Lazy getter that returns the controller (or null if not ready).
|
|
11
|
+
* @param shouldShow Optional access-control callback; when set, all routes
|
|
12
|
+
* are gated by it (returns 403 on denial).
|
|
13
|
+
*/
|
|
14
|
+
export function registerDashboardRoutes(router, dashboardPath, getController, shouldShow) {
|
|
15
|
+
// Normalize: strip trailing slash
|
|
16
|
+
const base = dashboardPath.replace(/\/+$/, '');
|
|
17
|
+
// Helper to bind a controller method as a closure route handler.
|
|
18
|
+
// Returns 503 if the controller isn't ready yet (server still booting).
|
|
19
|
+
const bind = (method) => {
|
|
20
|
+
return async (ctx) => {
|
|
21
|
+
const controller = getController();
|
|
22
|
+
if (!controller) {
|
|
23
|
+
return ctx.response.serviceUnavailable({ error: 'Dashboard is starting up, please retry' });
|
|
24
|
+
}
|
|
25
|
+
return controller[method].call(controller, ctx);
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
const middleware = shouldShow ? [createAccessMiddleware(shouldShow)] : [];
|
|
29
|
+
router
|
|
30
|
+
.group(() => {
|
|
31
|
+
// Page
|
|
32
|
+
router.get('/', bind('page')).as('server-stats.dashboard');
|
|
33
|
+
// Overview
|
|
34
|
+
router.get('/api/overview', bind('overview')).as('server-stats.overview');
|
|
35
|
+
router.get('/api/overview/chart', bind('overviewChart')).as('server-stats.overview.chart');
|
|
36
|
+
// Requests
|
|
37
|
+
router.get('/api/requests', bind('requests')).as('server-stats.requests');
|
|
38
|
+
router.get('/api/requests/:id', bind('requestDetail')).as('server-stats.requests.show');
|
|
39
|
+
// Queries
|
|
40
|
+
router.get('/api/queries', bind('queries')).as('server-stats.queries');
|
|
41
|
+
router.get('/api/queries/grouped', bind('queriesGrouped')).as('server-stats.queries.grouped');
|
|
42
|
+
router.get('/api/queries/:id/explain', bind('queryExplain')).as('server-stats.queries.explain');
|
|
43
|
+
// Events
|
|
44
|
+
router.get('/api/events', bind('events')).as('server-stats.events');
|
|
45
|
+
// Routes
|
|
46
|
+
router.get('/api/routes', bind('routes')).as('server-stats.routes');
|
|
47
|
+
// Logs
|
|
48
|
+
router.get('/api/logs', bind('logs')).as('server-stats.logs');
|
|
49
|
+
// Emails
|
|
50
|
+
router.get('/api/emails', bind('emails')).as('server-stats.emails');
|
|
51
|
+
router.get('/api/emails/:id/preview', bind('emailPreview')).as('server-stats.emails.preview');
|
|
52
|
+
// Traces
|
|
53
|
+
router.get('/api/traces', bind('traces')).as('server-stats.traces');
|
|
54
|
+
router.get('/api/traces/:id', bind('traceDetail')).as('server-stats.traces.show');
|
|
55
|
+
// Cache
|
|
56
|
+
router.get('/api/cache', bind('cacheStats')).as('server-stats.cache');
|
|
57
|
+
router.get('/api/cache/:key', bind('cacheKey')).as('server-stats.cache.show').where('key', /.*/);
|
|
58
|
+
// Jobs / Queue
|
|
59
|
+
router.get('/api/jobs', bind('jobs')).as('server-stats.jobs');
|
|
60
|
+
router.get('/api/jobs/:id', bind('jobDetail')).as('server-stats.jobs.show');
|
|
61
|
+
router.post('/api/jobs/:id/retry', bind('jobRetry')).as('server-stats.jobs.retry');
|
|
62
|
+
// Config
|
|
63
|
+
router.get('/api/config', bind('config')).as('server-stats.config');
|
|
64
|
+
// Saved Filters
|
|
65
|
+
router.get('/api/filters', bind('savedFilters')).as('server-stats.filters');
|
|
66
|
+
router.post('/api/filters', bind('createSavedFilter')).as('server-stats.filters.create');
|
|
67
|
+
router.delete('/api/filters/:id', bind('deleteSavedFilter')).as('server-stats.filters.delete');
|
|
68
|
+
})
|
|
69
|
+
.prefix(base)
|
|
70
|
+
.use(middleware);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a middleware function that gates access using the shouldShow callback.
|
|
74
|
+
* Returns 403 if the callback returns false.
|
|
75
|
+
*/
|
|
76
|
+
function createAccessMiddleware(shouldShow) {
|
|
77
|
+
return async (ctx, next) => {
|
|
78
|
+
try {
|
|
79
|
+
if (!shouldShow(ctx)) {
|
|
80
|
+
return ctx.response.forbidden({ error: 'Access denied' });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return ctx.response.forbidden({ error: 'Access denied' });
|
|
85
|
+
}
|
|
86
|
+
await next();
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { DevToolbarConfig } from '../debug/types.js';
|
|
2
|
+
import type { QueryRecord, EventRecord, EmailRecord, TraceRecord } from '../debug/types.js';
|
|
3
|
+
export interface RequestFilters {
|
|
4
|
+
method?: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
statusMin?: number;
|
|
7
|
+
statusMax?: number;
|
|
8
|
+
durationMin?: number;
|
|
9
|
+
durationMax?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface QueryFilters {
|
|
12
|
+
method?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
connection?: string;
|
|
15
|
+
durationMin?: number;
|
|
16
|
+
durationMax?: number;
|
|
17
|
+
requestId?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface EventFilters {
|
|
20
|
+
eventName?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface EmailFilters {
|
|
23
|
+
from?: string;
|
|
24
|
+
to?: string;
|
|
25
|
+
subject?: string;
|
|
26
|
+
mailer?: string;
|
|
27
|
+
status?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface LogFilters {
|
|
30
|
+
level?: string;
|
|
31
|
+
requestId?: string;
|
|
32
|
+
search?: string;
|
|
33
|
+
/** Structured filters: array of { field, operator, value } */
|
|
34
|
+
structured?: {
|
|
35
|
+
field: string;
|
|
36
|
+
operator: 'equals' | 'contains' | 'startsWith';
|
|
37
|
+
value: string;
|
|
38
|
+
}[];
|
|
39
|
+
}
|
|
40
|
+
export interface TraceFilters {
|
|
41
|
+
method?: string;
|
|
42
|
+
url?: string;
|
|
43
|
+
statusMin?: number;
|
|
44
|
+
statusMax?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface PaginatedResult<T> {
|
|
47
|
+
data: T[];
|
|
48
|
+
total: number;
|
|
49
|
+
page: number;
|
|
50
|
+
perPage: number;
|
|
51
|
+
lastPage: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Bridges the in-memory RingBuffer collectors to SQLite persistence
|
|
55
|
+
* and provides query methods for the dashboard API.
|
|
56
|
+
*
|
|
57
|
+
* Handles auto-migration, retention cleanup, periodic metrics aggregation,
|
|
58
|
+
* and self-exclusion of dashboard routes and server_stats connection queries.
|
|
59
|
+
*/
|
|
60
|
+
export declare class DashboardStore {
|
|
61
|
+
private db;
|
|
62
|
+
private emitter;
|
|
63
|
+
private config;
|
|
64
|
+
private dashboardPath;
|
|
65
|
+
private retentionTimer;
|
|
66
|
+
private chartAggregator;
|
|
67
|
+
private handlers;
|
|
68
|
+
constructor(config: DevToolbarConfig);
|
|
69
|
+
/**
|
|
70
|
+
* Initialize the SQLite connection, run migrations and retention
|
|
71
|
+
* cleanup, start chart aggregation, and wire event listeners.
|
|
72
|
+
*/
|
|
73
|
+
start(_lucidDb: any, emitter: any, appRoot: string): Promise<void>;
|
|
74
|
+
/** Shut down timers, event listeners, and database connection. */
|
|
75
|
+
stop(): Promise<void>;
|
|
76
|
+
/** Get the raw Knex database connection (for DashboardController). */
|
|
77
|
+
getDb(): any;
|
|
78
|
+
/** Whether the store is initialized and ready. */
|
|
79
|
+
isReady(): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Record a completed request. Returns the inserted row ID, or null
|
|
82
|
+
* if the request was self-excluded or an error occurred.
|
|
83
|
+
*/
|
|
84
|
+
recordRequest(method: string, url: string, statusCode: number, duration: number, spanCount?: number, warningCount?: number): Promise<number | null>;
|
|
85
|
+
/** Batch-insert queries for a request. Filters out server_stats connection queries. */
|
|
86
|
+
recordQueries(requestId: number, queries: QueryRecord[]): Promise<void>;
|
|
87
|
+
/** Batch-insert events for a request. */
|
|
88
|
+
recordEvents(requestId: number, events: EventRecord[]): Promise<void>;
|
|
89
|
+
/** Record a single email. */
|
|
90
|
+
recordEmail(record: EmailRecord): Promise<void>;
|
|
91
|
+
/** Record a single log entry (from LogStreamService). */
|
|
92
|
+
recordLog(entry: Record<string, unknown>): Promise<void>;
|
|
93
|
+
/** Record a trace for a request. */
|
|
94
|
+
recordTrace(requestId: number, trace: TraceRecord): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Convenience: persist a full request with associated queries and trace.
|
|
97
|
+
* Calls recordRequest, recordQueries, and recordTrace in sequence.
|
|
98
|
+
*/
|
|
99
|
+
persistRequest(method: string, url: string, statusCode: number, duration: number, queries: QueryRecord[], trace: TraceRecord | null): Promise<number | null>;
|
|
100
|
+
/** Paginated request history with optional filters. */
|
|
101
|
+
getRequests(page?: number, perPage?: number, filters?: RequestFilters): Promise<PaginatedResult<any>>;
|
|
102
|
+
/** Paginated query history with optional filters. */
|
|
103
|
+
getQueries(page?: number, perPage?: number, filters?: QueryFilters): Promise<PaginatedResult<any>>;
|
|
104
|
+
/**
|
|
105
|
+
* Grouped query patterns: aggregated by sql_normalized
|
|
106
|
+
* with count, avg/min/max/total duration.
|
|
107
|
+
*/
|
|
108
|
+
getQueriesGrouped(): Promise<any[]>;
|
|
109
|
+
/** Paginated event history with optional filters. */
|
|
110
|
+
getEvents(page?: number, perPage?: number, filters?: EventFilters): Promise<PaginatedResult<any>>;
|
|
111
|
+
/** Paginated email history with optional filters. */
|
|
112
|
+
getEmails(page?: number, perPage?: number, filters?: EmailFilters): Promise<PaginatedResult<any>>;
|
|
113
|
+
/** Get email HTML body for preview. */
|
|
114
|
+
getEmailHtml(id: number): Promise<string | null>;
|
|
115
|
+
/**
|
|
116
|
+
* Paginated log history with structured search support.
|
|
117
|
+
*
|
|
118
|
+
* Structured filters query into the JSON `data` column using
|
|
119
|
+
* SQLite's `json_extract()`.
|
|
120
|
+
*/
|
|
121
|
+
getLogs(page?: number, perPage?: number, filters?: LogFilters): Promise<PaginatedResult<any>>;
|
|
122
|
+
/** Paginated trace history with optional filters. */
|
|
123
|
+
getTraces(page?: number, perPage?: number, filters?: TraceFilters): Promise<PaginatedResult<any>>;
|
|
124
|
+
/** Single trace with full span data. */
|
|
125
|
+
getTraceDetail(id: number): Promise<any | null>;
|
|
126
|
+
/** Single request with associated queries, events, and trace. */
|
|
127
|
+
getRequestDetail(id: number): Promise<any | null>;
|
|
128
|
+
/**
|
|
129
|
+
* Aggregated overview metrics for the dashboard cards.
|
|
130
|
+
*
|
|
131
|
+
* @param range — '1h' | '6h' | '24h' | '7d'
|
|
132
|
+
*/
|
|
133
|
+
getOverviewMetrics(range?: string): Promise<any>;
|
|
134
|
+
/**
|
|
135
|
+
* Time-series chart data from server_stats_metrics.
|
|
136
|
+
*
|
|
137
|
+
* @param range — '1h' | '6h' | '24h' | '7d'
|
|
138
|
+
*/
|
|
139
|
+
getChartData(range?: string): Promise<any[]>;
|
|
140
|
+
getSavedFilters(section?: string): Promise<any[]>;
|
|
141
|
+
createSavedFilter(name: string, section: string, filterConfig: Record<string, any>): Promise<any>;
|
|
142
|
+
deleteSavedFilter(id: number): Promise<boolean>;
|
|
143
|
+
/**
|
|
144
|
+
* Run EXPLAIN on a stored query using the app's default database connection.
|
|
145
|
+
* Only allows SELECT queries for safety.
|
|
146
|
+
*
|
|
147
|
+
* @param queryId — ID from server_stats_queries
|
|
148
|
+
* @param appDb — The application's Lucid database manager
|
|
149
|
+
*/
|
|
150
|
+
runExplain(queryId: number, appDb: any): Promise<any>;
|
|
151
|
+
/** Generic paginated query with filter callback. */
|
|
152
|
+
private paginate;
|
|
153
|
+
/**
|
|
154
|
+
* Wire email event listeners to persist emails as they arrive.
|
|
155
|
+
*/
|
|
156
|
+
private wireEventListeners;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=dashboard_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard_store.d.ts","sourceRoot":"","sources":["../../../src/dashboard/dashboard_store.ts"],"names":[],"mappings":"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"}
|