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.
Files changed (95) hide show
  1. package/README.md +148 -9
  2. package/dist/src/dashboard/chart_aggregator.d.ts +21 -0
  3. package/dist/src/dashboard/chart_aggregator.d.ts.map +1 -0
  4. package/dist/src/dashboard/chart_aggregator.js +89 -0
  5. package/dist/src/dashboard/dashboard_controller.d.ts +147 -0
  6. package/dist/src/dashboard/dashboard_controller.d.ts.map +1 -0
  7. package/dist/src/dashboard/dashboard_controller.js +1008 -0
  8. package/dist/src/dashboard/dashboard_routes.d.ts +16 -0
  9. package/dist/src/dashboard/dashboard_routes.d.ts.map +1 -0
  10. package/dist/src/dashboard/dashboard_routes.js +88 -0
  11. package/dist/src/dashboard/dashboard_store.d.ts +158 -0
  12. package/dist/src/dashboard/dashboard_store.d.ts.map +1 -0
  13. package/dist/src/dashboard/dashboard_store.js +723 -0
  14. package/dist/src/dashboard/integrations/cache_inspector.d.ts +88 -0
  15. package/dist/src/dashboard/integrations/cache_inspector.d.ts.map +1 -0
  16. package/dist/src/dashboard/integrations/cache_inspector.js +215 -0
  17. package/dist/src/dashboard/integrations/config_inspector.d.ts +33 -0
  18. package/dist/src/dashboard/integrations/config_inspector.d.ts.map +1 -0
  19. package/dist/src/dashboard/integrations/config_inspector.js +155 -0
  20. package/dist/src/dashboard/integrations/index.d.ts +7 -0
  21. package/dist/src/dashboard/integrations/index.d.ts.map +1 -0
  22. package/dist/src/dashboard/integrations/index.js +3 -0
  23. package/dist/src/dashboard/integrations/queue_inspector.d.ts +106 -0
  24. package/dist/src/dashboard/integrations/queue_inspector.d.ts.map +1 -0
  25. package/dist/src/dashboard/integrations/queue_inspector.js +182 -0
  26. package/dist/src/dashboard/migrator.d.ts +18 -0
  27. package/dist/src/dashboard/migrator.d.ts.map +1 -0
  28. package/dist/src/dashboard/migrator.js +144 -0
  29. package/dist/src/dashboard/models/stats_email.d.ts +19 -0
  30. package/dist/src/dashboard/models/stats_email.d.ts.map +1 -0
  31. package/dist/src/dashboard/models/stats_email.js +66 -0
  32. package/dist/src/dashboard/models/stats_event.d.ts +14 -0
  33. package/dist/src/dashboard/models/stats_event.d.ts.map +1 -0
  34. package/dist/src/dashboard/models/stats_event.js +43 -0
  35. package/dist/src/dashboard/models/stats_log.d.ts +12 -0
  36. package/dist/src/dashboard/models/stats_log.d.ts.map +1 -0
  37. package/dist/src/dashboard/models/stats_log.js +42 -0
  38. package/dist/src/dashboard/models/stats_metric.d.ts +15 -0
  39. package/dist/src/dashboard/models/stats_metric.d.ts.map +1 -0
  40. package/dist/src/dashboard/models/stats_metric.js +50 -0
  41. package/dist/src/dashboard/models/stats_query.d.ts +20 -0
  42. package/dist/src/dashboard/models/stats_query.d.ts.map +1 -0
  43. package/dist/src/dashboard/models/stats_query.js +67 -0
  44. package/dist/src/dashboard/models/stats_request.d.ts +21 -0
  45. package/dist/src/dashboard/models/stats_request.d.ts.map +1 -0
  46. package/dist/src/dashboard/models/stats_request.js +61 -0
  47. package/dist/src/dashboard/models/stats_saved_filter.d.ts +11 -0
  48. package/dist/src/dashboard/models/stats_saved_filter.d.ts.map +1 -0
  49. package/dist/src/dashboard/models/stats_saved_filter.js +38 -0
  50. package/dist/src/dashboard/models/stats_trace.d.ts +19 -0
  51. package/dist/src/dashboard/models/stats_trace.d.ts.map +1 -0
  52. package/dist/src/dashboard/models/stats_trace.js +67 -0
  53. package/dist/src/debug/debug_store.d.ts +5 -0
  54. package/dist/src/debug/debug_store.d.ts.map +1 -1
  55. package/dist/src/debug/debug_store.js +10 -0
  56. package/dist/src/debug/email_collector.d.ts +2 -0
  57. package/dist/src/debug/email_collector.d.ts.map +1 -1
  58. package/dist/src/debug/email_collector.js +4 -0
  59. package/dist/src/debug/event_collector.d.ts +2 -0
  60. package/dist/src/debug/event_collector.d.ts.map +1 -1
  61. package/dist/src/debug/event_collector.js +11 -2
  62. package/dist/src/debug/query_collector.d.ts +2 -0
  63. package/dist/src/debug/query_collector.d.ts.map +1 -1
  64. package/dist/src/debug/query_collector.js +11 -0
  65. package/dist/src/debug/ring_buffer.d.ts +3 -0
  66. package/dist/src/debug/ring_buffer.d.ts.map +1 -1
  67. package/dist/src/debug/ring_buffer.js +6 -0
  68. package/dist/src/debug/trace_collector.d.ts +4 -2
  69. package/dist/src/debug/trace_collector.d.ts.map +1 -1
  70. package/dist/src/debug/trace_collector.js +7 -2
  71. package/dist/src/debug/types.d.ts +8 -0
  72. package/dist/src/debug/types.d.ts.map +1 -1
  73. package/dist/src/edge/client/dashboard.css +1504 -0
  74. package/dist/src/edge/client/dashboard.js +2378 -0
  75. package/dist/src/edge/client/debug-panel.css +528 -108
  76. package/dist/src/edge/client/debug-panel.js +663 -22
  77. package/dist/src/edge/client/stats-bar.css +112 -38
  78. package/dist/src/edge/client/stats-bar.js +37 -3
  79. package/dist/src/edge/plugin.d.ts.map +1 -1
  80. package/dist/src/edge/plugin.js +21 -0
  81. package/dist/src/edge/views/dashboard.edge +382 -0
  82. package/dist/src/edge/views/debug-panel.edge +60 -14
  83. package/dist/src/edge/views/stats-bar.edge +9 -0
  84. package/dist/src/index.d.ts +2 -0
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js +1 -0
  87. package/dist/src/middleware/request_tracking_middleware.d.ts +20 -0
  88. package/dist/src/middleware/request_tracking_middleware.d.ts.map +1 -1
  89. package/dist/src/middleware/request_tracking_middleware.js +66 -2
  90. package/dist/src/provider/server_stats_provider.d.ts +13 -0
  91. package/dist/src/provider/server_stats_provider.d.ts.map +1 -1
  92. package/dist/src/provider/server_stats_provider.js +175 -1
  93. package/dist/src/types.d.ts +42 -0
  94. package/dist/src/types.d.ts.map +1 -1
  95. 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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"}