adonisjs-server-stats 1.2.2 → 1.3.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.
Files changed (95) hide show
  1. package/README.md +144 -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
package/README.md CHANGED
@@ -37,12 +37,14 @@ Zero frontend dependencies. Zero build step. Just `@serverStats()` and go.
37
37
  - **Debug toolbar** -- SQL queries, events, emails, routes, logs with search and filtering
38
38
  - **Request tracing** -- per-request waterfall timeline showing DB queries, events, and custom spans
39
39
  - **Custom panes** -- add your own tabs (webhooks, emails, cache, anything) with a simple config
40
+ - **Full-page dashboard** -- dedicated page at `/__stats` with overview cards, charts, request history, query analysis, EXPLAIN plans, cache/queue/config inspection, and saved filters
40
41
  - **Pluggable collectors** -- use built-in collectors or write your own
41
42
  - **Visibility control** -- show only to admins, specific roles, or in dev mode
42
43
  - **SSE broadcasting** -- real-time updates via AdonisJS Transmit
43
44
  - **Prometheus export** -- expose all metrics as Prometheus gauges
44
45
  - **Self-contained** -- inline HTML/CSS/JS Edge tag, no React, no external assets
45
46
  - **Graceful degradation** -- missing optional dependencies are handled automatically
47
+ - **Theme support** -- dark and light themes across dashboard, debug panel, and stats bar with system preference detection and manual toggle
46
48
 
47
49
  ## Installation
48
50
 
@@ -226,6 +228,10 @@ export default class ServerStatsController {
226
228
  | `persistDebugData` | `boolean \| string` | `false` | Persist debug data to disk across restarts. `true` writes to `.adonisjs/server-stats/debug-data.json`, or pass a custom path. |
227
229
  | `tracing` | `boolean` | `false` | Enable per-request tracing with timeline visualization |
228
230
  | `maxTraces` | `number` | `200` | Max request traces to buffer |
231
+ | `dashboard` | `boolean` | `false` | Enable the full-page dashboard (requires `better-sqlite3`) |
232
+ | `dashboardPath` | `string` | `'/__stats'` | URL path for the dashboard page |
233
+ | `retentionDays` | `number` | `7` | Days to keep historical data in SQLite |
234
+ | `dbPath` | `string` | `'tmp/server-stats.sqlite3'` | Path to the SQLite database file |
229
235
  | `panes` | `DebugPane[]` | -- | Custom debug panel tabs |
230
236
 
231
237
  ---
@@ -466,6 +472,120 @@ const result = await trace('organization.fetchMembers', async () => {
466
472
 
467
473
  If tracing is disabled or no request is active, `trace()` executes the function directly with no overhead.
468
474
 
475
+ ### Full-Page Dashboard
476
+
477
+ The dashboard is a dedicated page that provides historical data, charts, query analysis, and integration inspectors -- all persisted to a local SQLite database. It's like having Laravel Telescope built into your dev toolbar.
478
+
479
+ #### Prerequisites
480
+
481
+ The dashboard requires `better-sqlite3` for local data storage:
482
+
483
+ ```bash
484
+ npm install better-sqlite3
485
+ ```
486
+
487
+ If `better-sqlite3` is not installed, the dashboard will log a helpful message and disable itself gracefully -- the rest of the stats bar and debug toolbar continues to work.
488
+
489
+ #### Enable the Dashboard
490
+
491
+ ```ts
492
+ // config/server_stats.ts
493
+ export default defineConfig({
494
+ devToolbar: {
495
+ enabled: true,
496
+ dashboard: true,
497
+ },
498
+ })
499
+ ```
500
+
501
+ Restart your dev server and visit **`/__stats`** (or your configured `dashboardPath`).
502
+
503
+ #### Configuration
504
+
505
+ ```ts
506
+ devToolbar: {
507
+ enabled: true,
508
+ dashboard: true,
509
+
510
+ // URL path for the dashboard (default: '/__stats')
511
+ dashboardPath: '/__stats',
512
+
513
+ // Days to retain historical data (default: 7)
514
+ retentionDays: 7,
515
+
516
+ // SQLite database file path, relative to app root (default: 'tmp/server-stats.sqlite3')
517
+ dbPath: 'tmp/server-stats.sqlite3',
518
+
519
+ // Enable tracing for per-request timeline in the dashboard (recommended)
520
+ tracing: true,
521
+ }
522
+ ```
523
+
524
+ #### Dashboard Sections
525
+
526
+ | Section | Description |
527
+ |------------|-------------|
528
+ | **Overview** | Performance cards (avg/p95 response time, req/min, error rate) with sparkline charts and configurable time ranges (1h/6h/24h/7d) |
529
+ | **Requests** | Paginated request history with method, URL, status, duration. Click for detail view with associated queries and trace |
530
+ | **Queries** | All captured SQL queries with duration, model, connection. Grouped view shows query patterns by normalized SQL. EXPLAIN plan support for SELECT queries |
531
+ | **Events** | Application events captured from the AdonisJS emitter |
532
+ | **Routes** | Full route table with methods, patterns, handlers, and middleware stacks |
533
+ | **Logs** | Log history with level filtering, text search, and structured JSON field search (e.g. filter by `userId = 5`) |
534
+ | **Emails** | Email history with sender, recipient, subject, status. Click for HTML preview in iframe |
535
+ | **Timeline** | Per-request waterfall timeline (requires `tracing: true`) |
536
+ | **Cache** | Redis key browser with SCAN-based listing, type-aware detail view, and server stats (requires `@adonisjs/redis`) |
537
+ | **Jobs** | Queue overview with job listing, detail, and retry for failed jobs (requires `@rlanz/bull-queue`) |
538
+ | **Config** | Sanitized view of app configuration and environment variables. Secrets are auto-redacted |
539
+
540
+ #### Access Control
541
+
542
+ The dashboard reuses the `shouldShow` callback from the main config. If set, all dashboard routes are gated by it -- unauthorized requests receive a 403.
543
+
544
+ ```ts
545
+ export default defineConfig({
546
+ shouldShow: (ctx) => ctx.auth?.user?.role === 'admin',
547
+ devToolbar: {
548
+ enabled: true,
549
+ dashboard: true,
550
+ },
551
+ })
552
+ ```
553
+
554
+ #### Deep Links from Debug Panel
555
+
556
+ When the dashboard is enabled, the debug panel gains link icons on query, event, email, and trace rows. Clicking them opens the dashboard in a new tab, navigating directly to the relevant section and item.
557
+
558
+ #### Real-Time Updates
559
+
560
+ The dashboard supports real-time updates via two mechanisms:
561
+ - **Transmit (SSE)**: If `@adonisjs/transmit` is installed, the dashboard subscribes to `server-stats/dashboard` for live overview updates
562
+ - **Polling fallback**: If Transmit is not available, the dashboard polls the API at a configurable interval
563
+
564
+ #### Data Storage
565
+
566
+ The dashboard uses a dedicated SQLite database (separate from your app's database) with 8 tables prefixed with `server_stats_`. The database is:
567
+ - **Auto-migrated** on startup (no manual migration step)
568
+ - **Self-contained** -- uses its own Knex connection, never touches your app's migration history
569
+ - **Self-cleaning** -- old data is automatically purged based on `retentionDays`
570
+ - **WAL mode** -- concurrent reads don't block writes
571
+
572
+ The SQLite file is created at the configured `dbPath` (default: `tmp/server-stats.sqlite3`). Add it to your `.gitignore`:
573
+
574
+ ```
575
+ tmp/server-stats.sqlite3
576
+ ```
577
+
578
+ #### Theme Support
579
+
580
+ All three UIs (dashboard, debug panel, and stats bar) support dark and light themes:
581
+
582
+ - **System preference** -- automatically follows `prefers-color-scheme` (dark is default)
583
+ - **Manual toggle** -- sun/moon button in the dashboard sidebar and debug panel tab bar
584
+ - **Synced** -- theme choice is shared via `localStorage` across all three UIs, including cross-tab sync
585
+ - **Scoped** -- CSS variables are scoped to their containers, so they won't leak into your app's styles
586
+
587
+ ---
588
+
469
589
  ### Custom Debug Panes
470
590
 
471
591
  Add custom tabs to the debug panel:
@@ -629,6 +749,20 @@ import type {
629
749
  TraceRecord,
630
750
  } from 'adonisjs-server-stats'
631
751
 
752
+ // Dashboard types
753
+ import type {
754
+ RequestFilters,
755
+ QueryFilters,
756
+ EventFilters,
757
+ EmailFilters,
758
+ LogFilters,
759
+ TraceFilters,
760
+ PaginatedResult,
761
+ } from 'adonisjs-server-stats'
762
+
763
+ // Dashboard store (for advanced use)
764
+ import { DashboardStore } from 'adonisjs-server-stats'
765
+
632
766
  // Trace helper
633
767
  import { trace } from 'adonisjs-server-stats'
634
768
 
@@ -649,15 +783,16 @@ import type {
649
783
 
650
784
  All integrations use lazy `import()` -- missing peer deps won't crash the app. The corresponding collector simply returns defaults.
651
785
 
652
- | Dependency | Required By |
653
- |-----------------------------|-----------------------------------|
654
- | `@adonisjs/core` | Everything (required) |
655
- | `@adonisjs/lucid` | `dbPoolCollector`, `appCollector` |
656
- | `@adonisjs/redis` | `redisCollector` |
657
- | `@adonisjs/transmit` | Provider (SSE broadcast) |
658
- | `@julr/adonisjs-prometheus` | `serverStatsCollector` |
659
- | `bullmq` | `queueCollector` |
660
- | `edge.js` | Edge tag |
786
+ | Dependency | Required By |
787
+ |-----------------------------|------------------------------------------------|
788
+ | `@adonisjs/core` | Everything (required) |
789
+ | `@adonisjs/lucid` | `dbPoolCollector`, `appCollector`, dashboard |
790
+ | `@adonisjs/redis` | `redisCollector`, dashboard cache inspector |
791
+ | `@adonisjs/transmit` | Provider (SSE broadcast), dashboard real-time |
792
+ | `@julr/adonisjs-prometheus` | `serverStatsCollector` |
793
+ | `bullmq` | `queueCollector` |
794
+ | `better-sqlite3` | Dashboard (`dashboard: true`) |
795
+ | `edge.js` | Edge tag |
661
796
 
662
797
  ## License
663
798
 
@@ -0,0 +1,21 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Periodically aggregates recent request data into time-bucketed
4
+ * metrics stored in `server_stats_metrics`.
5
+ *
6
+ * Runs every 60 seconds. Each tick:
7
+ * 1. Counts requests in the last minute
8
+ * 2. Calculates avg/p95 response time
9
+ * 3. Counts errors (4xx + 5xx)
10
+ * 4. Counts queries and average query duration
11
+ * 5. Stores a row with a bucket timestamp rounded to the minute
12
+ */
13
+ export declare class ChartAggregator {
14
+ private db;
15
+ private timer;
16
+ constructor(db: Knex);
17
+ start(): void;
18
+ stop(): void;
19
+ private aggregate;
20
+ }
21
+ //# sourceMappingURL=chart_aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart_aggregator.d.ts","sourceRoot":"","sources":["../../../src/dashboard/chart_aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,KAAK,CAA8C;gBAE/C,EAAE,EAAE,IAAI;IAIpB,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;YAOE,SAAS;CA4DxB"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Periodically aggregates recent request data into time-bucketed
3
+ * metrics stored in `server_stats_metrics`.
4
+ *
5
+ * Runs every 60 seconds. Each tick:
6
+ * 1. Counts requests in the last minute
7
+ * 2. Calculates avg/p95 response time
8
+ * 3. Counts errors (4xx + 5xx)
9
+ * 4. Counts queries and average query duration
10
+ * 5. Stores a row with a bucket timestamp rounded to the minute
11
+ */
12
+ export class ChartAggregator {
13
+ db;
14
+ timer = null;
15
+ constructor(db) {
16
+ this.db = db;
17
+ }
18
+ start() {
19
+ // Run immediately on startup, then every 60s
20
+ this.aggregate().catch(() => { });
21
+ this.timer = setInterval(() => {
22
+ this.aggregate().catch(() => { });
23
+ }, 60_000);
24
+ }
25
+ stop() {
26
+ if (this.timer) {
27
+ clearInterval(this.timer);
28
+ this.timer = null;
29
+ }
30
+ }
31
+ async aggregate() {
32
+ const bucket = getBucketTimestamp();
33
+ // Check if we already have a row for this bucket (idempotent)
34
+ const existing = await this.db('server_stats_metrics')
35
+ .where('bucket', bucket)
36
+ .first();
37
+ if (existing)
38
+ return;
39
+ // Get requests from the last 60 seconds
40
+ const cutoff = new Date(Date.now() - 60_000).toISOString().replace('T', ' ').slice(0, 19);
41
+ const requests = await this.db('server_stats_requests')
42
+ .where('created_at', '>=', cutoff)
43
+ .select('duration', 'status_code');
44
+ const requestCount = requests.length;
45
+ if (requestCount === 0) {
46
+ // Still insert a zero-row so the chart shows continuous data
47
+ await this.db('server_stats_metrics').insert({
48
+ bucket,
49
+ request_count: 0,
50
+ avg_duration: 0,
51
+ p95_duration: 0,
52
+ error_count: 0,
53
+ query_count: 0,
54
+ avg_query_duration: 0,
55
+ });
56
+ return;
57
+ }
58
+ // Calculate avg and p95 duration
59
+ const durations = requests.map((r) => r.duration).sort((a, b) => a - b);
60
+ const avgDuration = durations.reduce((sum, d) => sum + d, 0) / requestCount;
61
+ const p95Index = Math.floor(requestCount * 0.95);
62
+ const p95Duration = durations[Math.min(p95Index, requestCount - 1)];
63
+ // Count errors (status >= 400)
64
+ const errorCount = requests.filter((r) => r.status_code >= 400).length;
65
+ // Get query stats for the same window
66
+ const queryStats = await this.db('server_stats_queries')
67
+ .where('created_at', '>=', cutoff)
68
+ .select(this.db.raw('COUNT(*) as query_count'), this.db.raw('AVG(duration) as avg_query_duration'))
69
+ .first();
70
+ await this.db('server_stats_metrics').insert({
71
+ bucket,
72
+ request_count: requestCount,
73
+ avg_duration: Math.round(avgDuration * 100) / 100,
74
+ p95_duration: Math.round(p95Duration * 100) / 100,
75
+ error_count: errorCount,
76
+ query_count: queryStats?.query_count ?? 0,
77
+ avg_query_duration: Math.round((queryStats?.avg_query_duration ?? 0) * 100) / 100,
78
+ });
79
+ }
80
+ }
81
+ /**
82
+ * Returns an ISO timestamp string rounded down to the current minute.
83
+ * Used as the bucket key for metrics aggregation.
84
+ */
85
+ function getBucketTimestamp() {
86
+ const now = new Date();
87
+ now.setSeconds(0, 0);
88
+ return now.toISOString().replace('T', ' ').slice(0, 19);
89
+ }
@@ -0,0 +1,147 @@
1
+ import type { HttpContext } from '@adonisjs/core/http';
2
+ import type { ApplicationService } from '@adonisjs/core/types';
3
+ import type { DashboardStore } from './dashboard_store.js';
4
+ import type { DebugStore } from '../debug/debug_store.js';
5
+ /**
6
+ * Controller for the full-page dashboard.
7
+ *
8
+ * Serves the dashboard HTML page and all JSON API endpoints.
9
+ * Constructor-injected with the SQLite-backed DashboardStore,
10
+ * the in-memory DebugStore, and the AdonisJS application instance.
11
+ */
12
+ export default class DashboardController {
13
+ private dashboardStore;
14
+ private debugStore;
15
+ private app;
16
+ private cacheInspector;
17
+ private queueInspector;
18
+ private configInspector;
19
+ private cacheAvailable;
20
+ private queueAvailable;
21
+ private cachedCss;
22
+ private cachedJs;
23
+ private cachedTransmitClient;
24
+ constructor(dashboardStore: DashboardStore, debugStore: DebugStore, app: ApplicationService);
25
+ /**
26
+ * GET {dashboardPath} — Render the dashboard Edge template.
27
+ *
28
+ * Reads the dashboard CSS/JS assets and passes them as template state
29
+ * along with configuration for tracing and custom panes.
30
+ */
31
+ page(ctx: HttpContext): Promise<any>;
32
+ /**
33
+ * GET {dashboardPath}/api/overview — Overview metrics cards.
34
+ */
35
+ overview({ request, response }: HttpContext): Promise<void>;
36
+ /**
37
+ * GET {dashboardPath}/api/overview/chart — Chart data with time range.
38
+ */
39
+ overviewChart({ request, response }: HttpContext): Promise<void>;
40
+ /**
41
+ * GET {dashboardPath}/api/requests — Paginated request history.
42
+ */
43
+ requests({ request, response }: HttpContext): Promise<void>;
44
+ /**
45
+ * GET {dashboardPath}/api/requests/:id — Single request with trace.
46
+ */
47
+ requestDetail({ params, response }: HttpContext): Promise<void>;
48
+ /**
49
+ * GET {dashboardPath}/api/queries — Paginated query history.
50
+ */
51
+ queries({ request, response }: HttpContext): Promise<void>;
52
+ /**
53
+ * GET {dashboardPath}/api/queries/grouped — Grouped by normalized SQL.
54
+ */
55
+ queriesGrouped({ request, response }: HttpContext): Promise<void>;
56
+ /**
57
+ * GET {dashboardPath}/api/queries/:id/explain — Run EXPLAIN on a query.
58
+ */
59
+ queryExplain({ params, response }: HttpContext): Promise<void>;
60
+ /**
61
+ * GET {dashboardPath}/api/events — Paginated event history.
62
+ */
63
+ events({ request, response }: HttpContext): Promise<void>;
64
+ /**
65
+ * GET {dashboardPath}/api/routes — Route table (delegates to DebugStore).
66
+ */
67
+ routes({ response }: HttpContext): Promise<void>;
68
+ /**
69
+ * GET {dashboardPath}/api/logs — Paginated logs with structured search.
70
+ */
71
+ logs({ request, response }: HttpContext): Promise<void>;
72
+ /**
73
+ * GET {dashboardPath}/api/emails — Paginated email history.
74
+ */
75
+ emails({ request, response }: HttpContext): Promise<void>;
76
+ /**
77
+ * GET {dashboardPath}/api/emails/:id/preview — Email HTML preview.
78
+ */
79
+ emailPreview({ params, response }: HttpContext): Promise<void>;
80
+ /**
81
+ * GET {dashboardPath}/api/traces — Paginated trace list (lightweight).
82
+ */
83
+ traces({ request, response }: HttpContext): Promise<void>;
84
+ /**
85
+ * GET {dashboardPath}/api/traces/:id — Single trace with full spans.
86
+ */
87
+ traceDetail({ params, response }: HttpContext): Promise<void>;
88
+ /**
89
+ * GET {dashboardPath}/api/cache — Cache stats and key list.
90
+ */
91
+ cacheStats({ request, response }: HttpContext): Promise<void>;
92
+ /**
93
+ * GET {dashboardPath}/api/cache/:key — Single cache key detail.
94
+ */
95
+ cacheKey({ params, response }: HttpContext): Promise<void>;
96
+ /**
97
+ * GET {dashboardPath}/api/jobs — Job list with status filter.
98
+ */
99
+ jobs({ request, response }: HttpContext): Promise<void>;
100
+ /**
101
+ * GET {dashboardPath}/api/jobs/:id — Single job detail.
102
+ */
103
+ jobDetail({ params, response }: HttpContext): Promise<void>;
104
+ /**
105
+ * POST {dashboardPath}/api/jobs/:id/retry — Retry a failed job.
106
+ */
107
+ jobRetry({ params, response }: HttpContext): Promise<void>;
108
+ /**
109
+ * GET {dashboardPath}/api/config — Sanitized app config and env vars.
110
+ */
111
+ config({ response }: HttpContext): Promise<void>;
112
+ /**
113
+ * GET {dashboardPath}/api/filters — List saved filter presets.
114
+ */
115
+ savedFilters({ response }: HttpContext): Promise<void>;
116
+ /**
117
+ * POST {dashboardPath}/api/filters — Create a saved filter preset.
118
+ */
119
+ createSavedFilter({ request, response }: HttpContext): Promise<void>;
120
+ /**
121
+ * DELETE {dashboardPath}/api/filters/:id — Delete a saved filter preset.
122
+ */
123
+ deleteSavedFilter({ params, response }: HttpContext): Promise<void>;
124
+ /**
125
+ * Check if the current request is authorized via shouldShow.
126
+ */
127
+ private checkAccess;
128
+ /**
129
+ * Get the configured dashboard path.
130
+ */
131
+ private getDashboardPath;
132
+ /**
133
+ * Try to locate and read the @adonisjs/transmit-client build file.
134
+ * Returns the file contents wrapped to expose `window.Transmit`, or
135
+ * an empty string if the package is not installed.
136
+ */
137
+ private loadTransmitClient;
138
+ /**
139
+ * Lazily initialize and return the CacheInspector (if Redis is available).
140
+ */
141
+ private getCacheInspector;
142
+ /**
143
+ * Lazily initialize and return the QueueInspector (if Bull Queue is available).
144
+ */
145
+ private getQueueInspector;
146
+ }
147
+ //# sourceMappingURL=dashboard_controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard_controller.d.ts","sourceRoot":"","sources":["../../../src/dashboard/dashboard_controller.ts"],"names":[],"mappings":"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"}