adonisjs-server-stats 1.2.1 → 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 +530 -110
  76. package/dist/src/edge/client/debug-panel.js +663 -22
  77. package/dist/src/edge/client/stats-bar.css +115 -41
  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,182 @@
1
+ /**
2
+ * Inspects Bull Queue jobs, counts, and allows retrying failed jobs.
3
+ *
4
+ * Designed for the full-page dashboard's Jobs section.
5
+ * Only functional when `@rlanz/bull-queue` is installed.
6
+ * All methods catch errors and return safe defaults.
7
+ */
8
+ export class QueueInspector {
9
+ queueManager;
10
+ constructor(queueManager) {
11
+ this.queueManager = queueManager;
12
+ }
13
+ /**
14
+ * Detect whether `@rlanz/bull-queue` is available in the application container.
15
+ */
16
+ static async isAvailable(app) {
17
+ try {
18
+ await app.container.make('queue');
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Get an overview of job counts by status across all queues.
27
+ */
28
+ async getOverview() {
29
+ const defaults = {
30
+ active: 0,
31
+ waiting: 0,
32
+ delayed: 0,
33
+ completed: 0,
34
+ failed: 0,
35
+ paused: 0,
36
+ };
37
+ try {
38
+ const queue = this.getQueue();
39
+ if (!queue)
40
+ return defaults;
41
+ const counts = await queue.getJobCounts('active', 'waiting', 'delayed', 'completed', 'failed', 'paused');
42
+ return {
43
+ active: counts.active ?? 0,
44
+ waiting: counts.waiting ?? 0,
45
+ delayed: counts.delayed ?? 0,
46
+ completed: counts.completed ?? 0,
47
+ failed: counts.failed ?? 0,
48
+ paused: counts.paused ?? 0,
49
+ };
50
+ }
51
+ catch {
52
+ return defaults;
53
+ }
54
+ }
55
+ /**
56
+ * List jobs filtered by status with pagination.
57
+ *
58
+ * @param status Job status to filter by.
59
+ * @param page Page number (1-based).
60
+ * @param perPage Jobs per page.
61
+ */
62
+ async listJobs(status = 'active', page = 1, perPage = 25) {
63
+ try {
64
+ const queue = this.getQueue();
65
+ if (!queue)
66
+ return { jobs: [], total: 0 };
67
+ const start = (page - 1) * perPage;
68
+ const end = start + perPage - 1;
69
+ const [rawJobs, counts] = await Promise.all([
70
+ queue.getJobs([status], start, end),
71
+ queue.getJobCounts(status),
72
+ ]);
73
+ const jobs = (rawJobs ?? [])
74
+ .filter((job) => job !== null && job !== undefined)
75
+ .map((job) => this.formatJobSummary(job, status));
76
+ return {
77
+ jobs,
78
+ total: counts[status] ?? 0,
79
+ };
80
+ }
81
+ catch {
82
+ return { jobs: [], total: 0 };
83
+ }
84
+ }
85
+ /**
86
+ * Get full detail for a single job by ID.
87
+ */
88
+ async getJob(id) {
89
+ try {
90
+ const queue = this.getQueue();
91
+ if (!queue)
92
+ return null;
93
+ const job = await queue.getJob(id);
94
+ if (!job)
95
+ return null;
96
+ const state = (await job.getState());
97
+ return {
98
+ ...this.formatJobSummary(job, state),
99
+ stackTrace: job.stacktrace ?? [],
100
+ returnValue: job.returnvalue ?? null,
101
+ opts: job.opts ?? {},
102
+ };
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ /**
109
+ * Retry a failed job.
110
+ *
111
+ * @returns `true` if the job was successfully requeued.
112
+ */
113
+ async retryJob(id) {
114
+ try {
115
+ const queue = this.getQueue();
116
+ if (!queue)
117
+ return false;
118
+ const job = await queue.getJob(id);
119
+ if (!job)
120
+ return false;
121
+ const state = await job.getState();
122
+ if (state !== 'failed')
123
+ return false;
124
+ await job.retry();
125
+ return true;
126
+ }
127
+ catch {
128
+ return false;
129
+ }
130
+ }
131
+ // ---------------------------------------------------------------------------
132
+ // Private helpers
133
+ // ---------------------------------------------------------------------------
134
+ /**
135
+ * Get the underlying Bull Queue instance from the queue manager.
136
+ *
137
+ * `@rlanz/bull-queue` exposes the BullMQ Queue via `.queue` on the manager
138
+ * or via `.useQueue()`. We try both patterns for compatibility.
139
+ */
140
+ getQueue() {
141
+ try {
142
+ // @rlanz/bull-queue v3+ exposes queue directly
143
+ if (this.queueManager.queue) {
144
+ return this.queueManager.queue;
145
+ }
146
+ // Try getting the default queue
147
+ if (typeof this.queueManager.useQueue === 'function') {
148
+ return this.queueManager.useQueue('default');
149
+ }
150
+ // Fallback: the manager itself may be a Queue instance
151
+ if (typeof this.queueManager.getJobCounts === 'function') {
152
+ return this.queueManager;
153
+ }
154
+ return null;
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ }
160
+ /**
161
+ * Format a Bull job into our summary shape.
162
+ */
163
+ formatJobSummary(job, status) {
164
+ const processedAt = job.processedOn ?? null;
165
+ const finishedAt = job.finishedOn ?? null;
166
+ const duration = processedAt != null && finishedAt != null ? finishedAt - processedAt : null;
167
+ return {
168
+ id: String(job.id),
169
+ name: job.name ?? 'unknown',
170
+ status,
171
+ data: job.data ?? null,
172
+ attempts: job.attemptsMade ?? 0,
173
+ maxAttempts: job.opts?.attempts ?? 1,
174
+ progress: job.progress ?? 0,
175
+ failedReason: job.failedReason ?? null,
176
+ createdAt: job.timestamp ?? 0,
177
+ processedAt,
178
+ finishedAt,
179
+ duration,
180
+ };
181
+ }
182
+ }
@@ -0,0 +1,18 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Auto-migrate all dashboard SQLite tables.
4
+ *
5
+ * Uses raw SQL (not Lucid migrations) so we never pollute the host
6
+ * application's migration history. Each `CREATE TABLE` / `CREATE INDEX`
7
+ * uses `IF NOT EXISTS` so the function is idempotent.
8
+ */
9
+ export declare function autoMigrate(db: Knex): Promise<void>;
10
+ /**
11
+ * Delete records older than `retentionDays` from all tables.
12
+ *
13
+ * Foreign-key cascades on `server_stats_requests` handle the child
14
+ * tables (queries, events, traces). Standalone tables (logs, emails,
15
+ * metrics, saved_filters) are pruned individually.
16
+ */
17
+ export declare function runRetentionCleanup(db: Knex, retentionDays: number): Promise<void>;
18
+ //# sourceMappingURL=migrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/dashboard/migrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA+HzD;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxF"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Auto-migrate all dashboard SQLite tables.
3
+ *
4
+ * Uses raw SQL (not Lucid migrations) so we never pollute the host
5
+ * application's migration history. Each `CREATE TABLE` / `CREATE INDEX`
6
+ * uses `IF NOT EXISTS` so the function is idempotent.
7
+ */
8
+ export async function autoMigrate(db) {
9
+ // -- server_stats_requests --------------------------------------------------
10
+ await db.raw(`
11
+ CREATE TABLE IF NOT EXISTS server_stats_requests (
12
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
13
+ method TEXT NOT NULL,
14
+ url TEXT NOT NULL,
15
+ status_code INTEGER NOT NULL,
16
+ duration REAL NOT NULL,
17
+ span_count INTEGER DEFAULT 0,
18
+ warning_count INTEGER DEFAULT 0,
19
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
20
+ )
21
+ `);
22
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_requests_created ON server_stats_requests(created_at)`);
23
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_requests_url ON server_stats_requests(url)`);
24
+ // -- server_stats_queries ---------------------------------------------------
25
+ await db.raw(`
26
+ CREATE TABLE IF NOT EXISTS server_stats_queries (
27
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
28
+ request_id INTEGER REFERENCES server_stats_requests(id) ON DELETE CASCADE,
29
+ sql_text TEXT NOT NULL,
30
+ sql_normalized TEXT NOT NULL,
31
+ bindings TEXT,
32
+ duration REAL NOT NULL,
33
+ method TEXT,
34
+ model TEXT,
35
+ connection TEXT,
36
+ in_transaction INTEGER DEFAULT 0,
37
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
38
+ )
39
+ `);
40
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_queries_created ON server_stats_queries(created_at)`);
41
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_queries_normalized ON server_stats_queries(sql_normalized)`);
42
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_queries_request ON server_stats_queries(request_id)`);
43
+ // -- server_stats_events ----------------------------------------------------
44
+ await db.raw(`
45
+ CREATE TABLE IF NOT EXISTS server_stats_events (
46
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
47
+ request_id INTEGER REFERENCES server_stats_requests(id) ON DELETE CASCADE,
48
+ event_name TEXT NOT NULL,
49
+ data TEXT,
50
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
51
+ )
52
+ `);
53
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_events_created ON server_stats_events(created_at)`);
54
+ // -- server_stats_emails ----------------------------------------------------
55
+ await db.raw(`
56
+ CREATE TABLE IF NOT EXISTS server_stats_emails (
57
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
58
+ from_addr TEXT NOT NULL,
59
+ to_addr TEXT NOT NULL,
60
+ cc TEXT,
61
+ bcc TEXT,
62
+ subject TEXT NOT NULL,
63
+ html TEXT,
64
+ text_body TEXT,
65
+ mailer TEXT NOT NULL,
66
+ status TEXT NOT NULL,
67
+ message_id TEXT,
68
+ attachment_count INTEGER DEFAULT 0,
69
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
70
+ )
71
+ `);
72
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_emails_created ON server_stats_emails(created_at)`);
73
+ // -- server_stats_logs ------------------------------------------------------
74
+ await db.raw(`
75
+ CREATE TABLE IF NOT EXISTS server_stats_logs (
76
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
77
+ level TEXT NOT NULL,
78
+ message TEXT NOT NULL,
79
+ request_id TEXT,
80
+ data TEXT,
81
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
82
+ )
83
+ `);
84
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_logs_created ON server_stats_logs(created_at)`);
85
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_logs_level ON server_stats_logs(level)`);
86
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_logs_request ON server_stats_logs(request_id)`);
87
+ // -- server_stats_traces ----------------------------------------------------
88
+ await db.raw(`
89
+ CREATE TABLE IF NOT EXISTS server_stats_traces (
90
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
91
+ request_id INTEGER REFERENCES server_stats_requests(id) ON DELETE CASCADE,
92
+ method TEXT NOT NULL,
93
+ url TEXT NOT NULL,
94
+ status_code INTEGER NOT NULL,
95
+ total_duration REAL NOT NULL,
96
+ span_count INTEGER DEFAULT 0,
97
+ spans TEXT NOT NULL,
98
+ warnings TEXT,
99
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
100
+ )
101
+ `);
102
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_traces_created ON server_stats_traces(created_at)`);
103
+ // -- server_stats_metrics ---------------------------------------------------
104
+ await db.raw(`
105
+ CREATE TABLE IF NOT EXISTS server_stats_metrics (
106
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
107
+ bucket TEXT NOT NULL,
108
+ request_count INTEGER DEFAULT 0,
109
+ avg_duration REAL DEFAULT 0,
110
+ p95_duration REAL DEFAULT 0,
111
+ error_count INTEGER DEFAULT 0,
112
+ query_count INTEGER DEFAULT 0,
113
+ avg_query_duration REAL DEFAULT 0,
114
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
115
+ )
116
+ `);
117
+ await db.raw(`CREATE INDEX IF NOT EXISTS idx_ss_metrics_bucket ON server_stats_metrics(bucket)`);
118
+ // -- server_stats_saved_filters ---------------------------------------------
119
+ await db.raw(`
120
+ CREATE TABLE IF NOT EXISTS server_stats_saved_filters (
121
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
122
+ name TEXT NOT NULL,
123
+ section TEXT NOT NULL,
124
+ filter_config TEXT NOT NULL,
125
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
126
+ )
127
+ `);
128
+ }
129
+ /**
130
+ * Delete records older than `retentionDays` from all tables.
131
+ *
132
+ * Foreign-key cascades on `server_stats_requests` handle the child
133
+ * tables (queries, events, traces). Standalone tables (logs, emails,
134
+ * metrics, saved_filters) are pruned individually.
135
+ */
136
+ export async function runRetentionCleanup(db, retentionDays) {
137
+ const modifier = `-${retentionDays} days`;
138
+ // Cascade deletes queries, events, traces via FK ON DELETE CASCADE
139
+ await db.raw(`DELETE FROM server_stats_requests WHERE created_at < datetime('now', ?)`, [modifier]);
140
+ // Standalone tables
141
+ await db.raw(`DELETE FROM server_stats_logs WHERE created_at < datetime('now', ?)`, [modifier]);
142
+ await db.raw(`DELETE FROM server_stats_emails WHERE created_at < datetime('now', ?)`, [modifier]);
143
+ await db.raw(`DELETE FROM server_stats_metrics WHERE created_at < datetime('now', ?)`, [modifier]);
144
+ }
@@ -0,0 +1,19 @@
1
+ import { BaseModel } from '@adonisjs/lucid/orm';
2
+ export default class StatsEmail extends BaseModel {
3
+ static connection: string;
4
+ static table: string;
5
+ id: number;
6
+ fromAddr: string;
7
+ toAddr: string;
8
+ cc: string | null;
9
+ bcc: string | null;
10
+ subject: string;
11
+ html: string | null;
12
+ textBody: string | null;
13
+ mailer: string;
14
+ status: string;
15
+ messageId: string | null;
16
+ attachmentCount: number;
17
+ createdAt: string;
18
+ }
19
+ //# sourceMappingURL=stats_email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats_email.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAwB;IAG5B,EAAE,EAAE,MAAM,CAAA;IAGV,QAAQ,EAAE,MAAM,CAAA;IAGhB,MAAM,EAAE,MAAM,CAAA;IAGd,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IAGjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAGlB,OAAO,EAAE,MAAM,CAAA;IAGf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAGnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAGvB,MAAM,EAAE,MAAM,CAAA;IAGd,MAAM,EAAE,MAAM,CAAA;IAGd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,eAAe,EAAE,MAAM,CAAA;IAGvB,SAAS,EAAE,MAAM,CAAA;CAC1B"}
@@ -0,0 +1,66 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseModel, column } from '@adonisjs/lucid/orm';
11
+ export default class StatsEmail extends BaseModel {
12
+ static connection = 'server_stats';
13
+ static table = 'server_stats_emails';
14
+ }
15
+ __decorate([
16
+ column({ isPrimary: true }),
17
+ __metadata("design:type", Number)
18
+ ], StatsEmail.prototype, "id", void 0);
19
+ __decorate([
20
+ column({ columnName: 'from_addr' }),
21
+ __metadata("design:type", String)
22
+ ], StatsEmail.prototype, "fromAddr", void 0);
23
+ __decorate([
24
+ column({ columnName: 'to_addr' }),
25
+ __metadata("design:type", String)
26
+ ], StatsEmail.prototype, "toAddr", void 0);
27
+ __decorate([
28
+ column(),
29
+ __metadata("design:type", Object)
30
+ ], StatsEmail.prototype, "cc", void 0);
31
+ __decorate([
32
+ column(),
33
+ __metadata("design:type", Object)
34
+ ], StatsEmail.prototype, "bcc", void 0);
35
+ __decorate([
36
+ column(),
37
+ __metadata("design:type", String)
38
+ ], StatsEmail.prototype, "subject", void 0);
39
+ __decorate([
40
+ column(),
41
+ __metadata("design:type", Object)
42
+ ], StatsEmail.prototype, "html", void 0);
43
+ __decorate([
44
+ column({ columnName: 'text_body' }),
45
+ __metadata("design:type", Object)
46
+ ], StatsEmail.prototype, "textBody", void 0);
47
+ __decorate([
48
+ column(),
49
+ __metadata("design:type", String)
50
+ ], StatsEmail.prototype, "mailer", void 0);
51
+ __decorate([
52
+ column(),
53
+ __metadata("design:type", String)
54
+ ], StatsEmail.prototype, "status", void 0);
55
+ __decorate([
56
+ column({ columnName: 'message_id' }),
57
+ __metadata("design:type", Object)
58
+ ], StatsEmail.prototype, "messageId", void 0);
59
+ __decorate([
60
+ column({ columnName: 'attachment_count' }),
61
+ __metadata("design:type", Number)
62
+ ], StatsEmail.prototype, "attachmentCount", void 0);
63
+ __decorate([
64
+ column({ columnName: 'created_at' }),
65
+ __metadata("design:type", String)
66
+ ], StatsEmail.prototype, "createdAt", void 0);
@@ -0,0 +1,14 @@
1
+ import { BaseModel } from '@adonisjs/lucid/orm';
2
+ import type { BelongsTo } from '@adonisjs/lucid/types/relations';
3
+ import StatsRequest from './stats_request.js';
4
+ export default class StatsEvent extends BaseModel {
5
+ static connection: string;
6
+ static table: string;
7
+ id: number;
8
+ requestId: number | null;
9
+ eventName: string;
10
+ data: any | null;
11
+ createdAt: string;
12
+ request: BelongsTo<typeof StatsRequest>;
13
+ }
14
+ //# sourceMappingURL=stats_event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats_event.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAwB;IAG5B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,SAAS,EAAE,MAAM,CAAA;IAOjB,IAAI,EAAE,GAAG,GAAG,IAAI,CAAA;IAGhB,SAAS,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,SAAS,CAAC,OAAO,YAAY,CAAC,CAAA;CAChD"}
@@ -0,0 +1,43 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseModel, column, belongsTo } from '@adonisjs/lucid/orm';
11
+ import StatsRequest from './stats_request.js';
12
+ export default class StatsEvent extends BaseModel {
13
+ static connection = 'server_stats';
14
+ static table = 'server_stats_events';
15
+ }
16
+ __decorate([
17
+ column({ isPrimary: true }),
18
+ __metadata("design:type", Number)
19
+ ], StatsEvent.prototype, "id", void 0);
20
+ __decorate([
21
+ column({ columnName: 'request_id' }),
22
+ __metadata("design:type", Object)
23
+ ], StatsEvent.prototype, "requestId", void 0);
24
+ __decorate([
25
+ column({ columnName: 'event_name' }),
26
+ __metadata("design:type", String)
27
+ ], StatsEvent.prototype, "eventName", void 0);
28
+ __decorate([
29
+ column({
30
+ columnName: 'data',
31
+ prepare: (value) => (value ? JSON.stringify(value) : null),
32
+ consume: (value) => (value ? JSON.parse(value) : null),
33
+ }),
34
+ __metadata("design:type", Object)
35
+ ], StatsEvent.prototype, "data", void 0);
36
+ __decorate([
37
+ column({ columnName: 'created_at' }),
38
+ __metadata("design:type", String)
39
+ ], StatsEvent.prototype, "createdAt", void 0);
40
+ __decorate([
41
+ belongsTo(() => StatsRequest, { foreignKey: 'requestId' }),
42
+ __metadata("design:type", Object)
43
+ ], StatsEvent.prototype, "request", void 0);
@@ -0,0 +1,12 @@
1
+ import { BaseModel } from '@adonisjs/lucid/orm';
2
+ export default class StatsLog extends BaseModel {
3
+ static connection: string;
4
+ static table: string;
5
+ id: number;
6
+ level: string;
7
+ message: string;
8
+ requestId: string | null;
9
+ data: any | null;
10
+ createdAt: string;
11
+ }
12
+ //# sourceMappingURL=stats_log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats_log.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;IAC7C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAsB;IAG1B,EAAE,EAAE,MAAM,CAAA;IAGV,KAAK,EAAE,MAAM,CAAA;IAGb,OAAO,EAAE,MAAM,CAAA;IAGf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAOxB,IAAI,EAAE,GAAG,GAAG,IAAI,CAAA;IAGhB,SAAS,EAAE,MAAM,CAAA;CAC1B"}
@@ -0,0 +1,42 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseModel, column } from '@adonisjs/lucid/orm';
11
+ export default class StatsLog extends BaseModel {
12
+ static connection = 'server_stats';
13
+ static table = 'server_stats_logs';
14
+ }
15
+ __decorate([
16
+ column({ isPrimary: true }),
17
+ __metadata("design:type", Number)
18
+ ], StatsLog.prototype, "id", void 0);
19
+ __decorate([
20
+ column(),
21
+ __metadata("design:type", String)
22
+ ], StatsLog.prototype, "level", void 0);
23
+ __decorate([
24
+ column(),
25
+ __metadata("design:type", String)
26
+ ], StatsLog.prototype, "message", void 0);
27
+ __decorate([
28
+ column({ columnName: 'request_id' }),
29
+ __metadata("design:type", Object)
30
+ ], StatsLog.prototype, "requestId", void 0);
31
+ __decorate([
32
+ column({
33
+ columnName: 'data',
34
+ prepare: (value) => (value ? JSON.stringify(value) : null),
35
+ consume: (value) => (value ? JSON.parse(value) : null),
36
+ }),
37
+ __metadata("design:type", Object)
38
+ ], StatsLog.prototype, "data", void 0);
39
+ __decorate([
40
+ column({ columnName: 'created_at' }),
41
+ __metadata("design:type", String)
42
+ ], StatsLog.prototype, "createdAt", void 0);
@@ -0,0 +1,15 @@
1
+ import { BaseModel } from '@adonisjs/lucid/orm';
2
+ export default class StatsMetric extends BaseModel {
3
+ static connection: string;
4
+ static table: string;
5
+ id: number;
6
+ bucket: string;
7
+ requestCount: number;
8
+ avgDuration: number;
9
+ p95Duration: number;
10
+ errorCount: number;
11
+ queryCount: number;
12
+ avgQueryDuration: number;
13
+ createdAt: string;
14
+ }
15
+ //# sourceMappingURL=stats_metric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats_metric.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_metric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAChD,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAyB;IAG7B,EAAE,EAAE,MAAM,CAAA;IAGV,MAAM,EAAE,MAAM,CAAA;IAGd,YAAY,EAAE,MAAM,CAAA;IAGpB,WAAW,EAAE,MAAM,CAAA;IAGnB,WAAW,EAAE,MAAM,CAAA;IAGnB,UAAU,EAAE,MAAM,CAAA;IAGlB,UAAU,EAAE,MAAM,CAAA;IAGlB,gBAAgB,EAAE,MAAM,CAAA;IAGxB,SAAS,EAAE,MAAM,CAAA;CAC1B"}
@@ -0,0 +1,50 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseModel, column } from '@adonisjs/lucid/orm';
11
+ export default class StatsMetric extends BaseModel {
12
+ static connection = 'server_stats';
13
+ static table = 'server_stats_metrics';
14
+ }
15
+ __decorate([
16
+ column({ isPrimary: true }),
17
+ __metadata("design:type", Number)
18
+ ], StatsMetric.prototype, "id", void 0);
19
+ __decorate([
20
+ column(),
21
+ __metadata("design:type", String)
22
+ ], StatsMetric.prototype, "bucket", void 0);
23
+ __decorate([
24
+ column({ columnName: 'request_count' }),
25
+ __metadata("design:type", Number)
26
+ ], StatsMetric.prototype, "requestCount", void 0);
27
+ __decorate([
28
+ column({ columnName: 'avg_duration' }),
29
+ __metadata("design:type", Number)
30
+ ], StatsMetric.prototype, "avgDuration", void 0);
31
+ __decorate([
32
+ column({ columnName: 'p95_duration' }),
33
+ __metadata("design:type", Number)
34
+ ], StatsMetric.prototype, "p95Duration", void 0);
35
+ __decorate([
36
+ column({ columnName: 'error_count' }),
37
+ __metadata("design:type", Number)
38
+ ], StatsMetric.prototype, "errorCount", void 0);
39
+ __decorate([
40
+ column({ columnName: 'query_count' }),
41
+ __metadata("design:type", Number)
42
+ ], StatsMetric.prototype, "queryCount", void 0);
43
+ __decorate([
44
+ column({ columnName: 'avg_query_duration' }),
45
+ __metadata("design:type", Number)
46
+ ], StatsMetric.prototype, "avgQueryDuration", void 0);
47
+ __decorate([
48
+ column({ columnName: 'created_at' }),
49
+ __metadata("design:type", String)
50
+ ], StatsMetric.prototype, "createdAt", void 0);
@@ -0,0 +1,20 @@
1
+ import { BaseModel } from '@adonisjs/lucid/orm';
2
+ import type { BelongsTo } from '@adonisjs/lucid/types/relations';
3
+ import StatsRequest from './stats_request.js';
4
+ export default class StatsQuery extends BaseModel {
5
+ static connection: string;
6
+ static table: string;
7
+ id: number;
8
+ requestId: number | null;
9
+ sqlText: string;
10
+ sqlNormalized: string;
11
+ bindings: any[] | null;
12
+ duration: number;
13
+ method: string | null;
14
+ model: string | null;
15
+ connection: string | null;
16
+ inTransaction: number;
17
+ createdAt: string;
18
+ request: BelongsTo<typeof StatsRequest>;
19
+ }
20
+ //# sourceMappingURL=stats_query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats_query.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAE7C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAAyB;IAG7B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAGxB,OAAO,EAAE,MAAM,CAAA;IAGf,aAAa,EAAE,MAAM,CAAA;IAOrB,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IAGtB,QAAQ,EAAE,MAAM,CAAA;IAGhB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAGrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAGpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAGzB,aAAa,EAAE,MAAM,CAAA;IAGrB,SAAS,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,SAAS,CAAC,OAAO,YAAY,CAAC,CAAA;CAChD"}