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.
- package/README.md +144 -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 +530 -110
- package/dist/src/edge/client/debug-panel.js +663 -22
- package/dist/src/edge/client/stats-bar.css +115 -41
- 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,67 @@
|
|
|
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 StatsQuery extends BaseModel {
|
|
13
|
+
static connection = 'server_stats';
|
|
14
|
+
static table = 'server_stats_queries';
|
|
15
|
+
}
|
|
16
|
+
__decorate([
|
|
17
|
+
column({ isPrimary: true }),
|
|
18
|
+
__metadata("design:type", Number)
|
|
19
|
+
], StatsQuery.prototype, "id", void 0);
|
|
20
|
+
__decorate([
|
|
21
|
+
column({ columnName: 'request_id' }),
|
|
22
|
+
__metadata("design:type", Object)
|
|
23
|
+
], StatsQuery.prototype, "requestId", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
column({ columnName: 'sql_text' }),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], StatsQuery.prototype, "sqlText", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
column({ columnName: 'sql_normalized' }),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], StatsQuery.prototype, "sqlNormalized", void 0);
|
|
32
|
+
__decorate([
|
|
33
|
+
column({
|
|
34
|
+
columnName: 'bindings',
|
|
35
|
+
prepare: (value) => (value ? JSON.stringify(value) : null),
|
|
36
|
+
consume: (value) => (value ? JSON.parse(value) : null),
|
|
37
|
+
}),
|
|
38
|
+
__metadata("design:type", Object)
|
|
39
|
+
], StatsQuery.prototype, "bindings", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
column(),
|
|
42
|
+
__metadata("design:type", Number)
|
|
43
|
+
], StatsQuery.prototype, "duration", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
column(),
|
|
46
|
+
__metadata("design:type", Object)
|
|
47
|
+
], StatsQuery.prototype, "method", void 0);
|
|
48
|
+
__decorate([
|
|
49
|
+
column(),
|
|
50
|
+
__metadata("design:type", Object)
|
|
51
|
+
], StatsQuery.prototype, "model", void 0);
|
|
52
|
+
__decorate([
|
|
53
|
+
column(),
|
|
54
|
+
__metadata("design:type", Object)
|
|
55
|
+
], StatsQuery.prototype, "connection", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
column({ columnName: 'in_transaction' }),
|
|
58
|
+
__metadata("design:type", Number)
|
|
59
|
+
], StatsQuery.prototype, "inTransaction", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
column({ columnName: 'created_at' }),
|
|
62
|
+
__metadata("design:type", String)
|
|
63
|
+
], StatsQuery.prototype, "createdAt", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
belongsTo(() => StatsRequest, { foreignKey: 'requestId' }),
|
|
66
|
+
__metadata("design:type", Object)
|
|
67
|
+
], StatsQuery.prototype, "request", void 0);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseModel } from '@adonisjs/lucid/orm';
|
|
2
|
+
import type { HasMany } from '@adonisjs/lucid/types/relations';
|
|
3
|
+
import StatsQuery from './stats_query.js';
|
|
4
|
+
import StatsEvent from './stats_event.js';
|
|
5
|
+
import StatsTrace from './stats_trace.js';
|
|
6
|
+
export default class StatsRequest extends BaseModel {
|
|
7
|
+
static connection: string;
|
|
8
|
+
static table: string;
|
|
9
|
+
id: number;
|
|
10
|
+
method: string;
|
|
11
|
+
url: string;
|
|
12
|
+
statusCode: number;
|
|
13
|
+
duration: number;
|
|
14
|
+
spanCount: number;
|
|
15
|
+
warningCount: number;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
queries: HasMany<typeof StatsQuery>;
|
|
18
|
+
events: HasMany<typeof StatsEvent>;
|
|
19
|
+
traces: HasMany<typeof StatsTrace>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=stats_request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_request.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,qBAAqB,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,UAAU,MAAM,kBAAkB,CAAA;AACzC,OAAO,UAAU,MAAM,kBAAkB,CAAA;AACzC,OAAO,UAAU,MAAM,kBAAkB,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IACjD,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAA0B;IAG9B,EAAE,EAAE,MAAM,CAAA;IAGV,MAAM,EAAE,MAAM,CAAA;IAGd,GAAG,EAAE,MAAM,CAAA;IAGX,UAAU,EAAE,MAAM,CAAA;IAGlB,QAAQ,EAAE,MAAM,CAAA;IAGhB,SAAS,EAAE,MAAM,CAAA;IAGjB,YAAY,EAAE,MAAM,CAAA;IAGpB,SAAS,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,OAAO,CAAC,OAAO,UAAU,CAAC,CAAA;IAGnC,MAAM,EAAE,OAAO,CAAC,OAAO,UAAU,CAAC,CAAA;IAGlC,MAAM,EAAE,OAAO,CAAC,OAAO,UAAU,CAAC,CAAA;CAC3C"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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, hasMany } from '@adonisjs/lucid/orm';
|
|
11
|
+
import StatsQuery from './stats_query.js';
|
|
12
|
+
import StatsEvent from './stats_event.js';
|
|
13
|
+
import StatsTrace from './stats_trace.js';
|
|
14
|
+
export default class StatsRequest extends BaseModel {
|
|
15
|
+
static connection = 'server_stats';
|
|
16
|
+
static table = 'server_stats_requests';
|
|
17
|
+
}
|
|
18
|
+
__decorate([
|
|
19
|
+
column({ isPrimary: true }),
|
|
20
|
+
__metadata("design:type", Number)
|
|
21
|
+
], StatsRequest.prototype, "id", void 0);
|
|
22
|
+
__decorate([
|
|
23
|
+
column(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], StatsRequest.prototype, "method", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
column(),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], StatsRequest.prototype, "url", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
column({ columnName: 'status_code' }),
|
|
32
|
+
__metadata("design:type", Number)
|
|
33
|
+
], StatsRequest.prototype, "statusCode", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
column(),
|
|
36
|
+
__metadata("design:type", Number)
|
|
37
|
+
], StatsRequest.prototype, "duration", void 0);
|
|
38
|
+
__decorate([
|
|
39
|
+
column({ columnName: 'span_count' }),
|
|
40
|
+
__metadata("design:type", Number)
|
|
41
|
+
], StatsRequest.prototype, "spanCount", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
column({ columnName: 'warning_count' }),
|
|
44
|
+
__metadata("design:type", Number)
|
|
45
|
+
], StatsRequest.prototype, "warningCount", void 0);
|
|
46
|
+
__decorate([
|
|
47
|
+
column({ columnName: 'created_at' }),
|
|
48
|
+
__metadata("design:type", String)
|
|
49
|
+
], StatsRequest.prototype, "createdAt", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
hasMany(() => StatsQuery, { foreignKey: 'requestId' }),
|
|
52
|
+
__metadata("design:type", Object)
|
|
53
|
+
], StatsRequest.prototype, "queries", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
hasMany(() => StatsEvent, { foreignKey: 'requestId' }),
|
|
56
|
+
__metadata("design:type", Object)
|
|
57
|
+
], StatsRequest.prototype, "events", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
hasMany(() => StatsTrace, { foreignKey: 'requestId' }),
|
|
60
|
+
__metadata("design:type", Object)
|
|
61
|
+
], StatsRequest.prototype, "traces", void 0);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseModel } from '@adonisjs/lucid/orm';
|
|
2
|
+
export default class StatsSavedFilter extends BaseModel {
|
|
3
|
+
static connection: string;
|
|
4
|
+
static table: string;
|
|
5
|
+
id: number;
|
|
6
|
+
name: string;
|
|
7
|
+
section: string;
|
|
8
|
+
filterConfig: Record<string, any>;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=stats_saved_filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_saved_filter.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_saved_filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IACrD,MAAM,CAAC,UAAU,SAAiB;IAClC,MAAM,CAAC,KAAK,SAA+B;IAGnC,EAAE,EAAE,MAAM,CAAA;IAGV,IAAI,EAAE,MAAM,CAAA;IAGZ,OAAO,EAAE,MAAM,CAAA;IAOf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAGjC,SAAS,EAAE,MAAM,CAAA;CAC1B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 StatsSavedFilter extends BaseModel {
|
|
12
|
+
static connection = 'server_stats';
|
|
13
|
+
static table = 'server_stats_saved_filters';
|
|
14
|
+
}
|
|
15
|
+
__decorate([
|
|
16
|
+
column({ isPrimary: true }),
|
|
17
|
+
__metadata("design:type", Number)
|
|
18
|
+
], StatsSavedFilter.prototype, "id", void 0);
|
|
19
|
+
__decorate([
|
|
20
|
+
column(),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], StatsSavedFilter.prototype, "name", void 0);
|
|
23
|
+
__decorate([
|
|
24
|
+
column(),
|
|
25
|
+
__metadata("design:type", String)
|
|
26
|
+
], StatsSavedFilter.prototype, "section", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
column({
|
|
29
|
+
columnName: 'filter_config',
|
|
30
|
+
prepare: (value) => JSON.stringify(value),
|
|
31
|
+
consume: (value) => JSON.parse(value),
|
|
32
|
+
}),
|
|
33
|
+
__metadata("design:type", Object)
|
|
34
|
+
], StatsSavedFilter.prototype, "filterConfig", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
column({ columnName: 'created_at' }),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], StatsSavedFilter.prototype, "createdAt", void 0);
|
|
@@ -0,0 +1,19 @@
|
|
|
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 StatsTrace extends BaseModel {
|
|
5
|
+
static connection: string;
|
|
6
|
+
static table: string;
|
|
7
|
+
id: number;
|
|
8
|
+
requestId: number | null;
|
|
9
|
+
method: string;
|
|
10
|
+
url: string;
|
|
11
|
+
statusCode: number;
|
|
12
|
+
totalDuration: number;
|
|
13
|
+
spanCount: number;
|
|
14
|
+
spans: any[];
|
|
15
|
+
warnings: string[] | null;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
request: BelongsTo<typeof StatsRequest>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=stats_trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats_trace.d.ts","sourceRoot":"","sources":["../../../../src/dashboard/models/stats_trace.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,MAAM,EAAE,MAAM,CAAA;IAGd,GAAG,EAAE,MAAM,CAAA;IAGX,UAAU,EAAE,MAAM,CAAA;IAGlB,aAAa,EAAE,MAAM,CAAA;IAGrB,SAAS,EAAE,MAAM,CAAA;IAOjB,KAAK,EAAE,GAAG,EAAE,CAAA;IAOZ,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAGzB,SAAS,EAAE,MAAM,CAAA;IAGjB,OAAO,EAAE,SAAS,CAAC,OAAO,YAAY,CAAC,CAAA;CAChD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 StatsTrace extends BaseModel {
|
|
13
|
+
static connection = 'server_stats';
|
|
14
|
+
static table = 'server_stats_traces';
|
|
15
|
+
}
|
|
16
|
+
__decorate([
|
|
17
|
+
column({ isPrimary: true }),
|
|
18
|
+
__metadata("design:type", Number)
|
|
19
|
+
], StatsTrace.prototype, "id", void 0);
|
|
20
|
+
__decorate([
|
|
21
|
+
column({ columnName: 'request_id' }),
|
|
22
|
+
__metadata("design:type", Object)
|
|
23
|
+
], StatsTrace.prototype, "requestId", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
column(),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], StatsTrace.prototype, "method", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
column(),
|
|
30
|
+
__metadata("design:type", String)
|
|
31
|
+
], StatsTrace.prototype, "url", void 0);
|
|
32
|
+
__decorate([
|
|
33
|
+
column({ columnName: 'status_code' }),
|
|
34
|
+
__metadata("design:type", Number)
|
|
35
|
+
], StatsTrace.prototype, "statusCode", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
column({ columnName: 'total_duration' }),
|
|
38
|
+
__metadata("design:type", Number)
|
|
39
|
+
], StatsTrace.prototype, "totalDuration", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
column({ columnName: 'span_count' }),
|
|
42
|
+
__metadata("design:type", Number)
|
|
43
|
+
], StatsTrace.prototype, "spanCount", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
column({
|
|
46
|
+
columnName: 'spans',
|
|
47
|
+
prepare: (value) => JSON.stringify(value),
|
|
48
|
+
consume: (value) => JSON.parse(value),
|
|
49
|
+
}),
|
|
50
|
+
__metadata("design:type", Array)
|
|
51
|
+
], StatsTrace.prototype, "spans", void 0);
|
|
52
|
+
__decorate([
|
|
53
|
+
column({
|
|
54
|
+
columnName: 'warnings',
|
|
55
|
+
prepare: (value) => (value ? JSON.stringify(value) : null),
|
|
56
|
+
consume: (value) => (value ? JSON.parse(value) : null),
|
|
57
|
+
}),
|
|
58
|
+
__metadata("design:type", Object)
|
|
59
|
+
], StatsTrace.prototype, "warnings", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
column({ columnName: 'created_at' }),
|
|
62
|
+
__metadata("design:type", String)
|
|
63
|
+
], StatsTrace.prototype, "createdAt", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
belongsTo(() => StatsRequest, { foreignKey: 'requestId' }),
|
|
66
|
+
__metadata("design:type", Object)
|
|
67
|
+
], StatsTrace.prototype, "request", void 0);
|
|
@@ -15,6 +15,11 @@ export declare class DebugStore {
|
|
|
15
15
|
readonly routes: RouteInspector;
|
|
16
16
|
readonly traces: TraceCollector | null;
|
|
17
17
|
constructor(config: DevToolbarConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Register a callback that fires whenever any collector records a new item.
|
|
20
|
+
* The callback receives the item type ('query' | 'event' | 'email' | 'trace').
|
|
21
|
+
*/
|
|
22
|
+
onNewItem(cb: ((type: string) => void) | null): void;
|
|
18
23
|
start(emitter: any, router: any): Promise<void>;
|
|
19
24
|
stop(): void;
|
|
20
25
|
/** Serialize all collector data to a JSON file (atomic write). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug_store.d.ts","sourceRoot":"","sources":["../../../src/debug/debug_store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;gBAE3B,MAAM,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"debug_store.d.ts","sourceRoot":"","sources":["../../../src/debug/debug_store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;gBAE3B,MAAM,EAAE,gBAAgB;IAWpC;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAO9C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD,IAAI,IAAI,IAAI;IAOZ,kEAAkE;IAC5D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjD,uDAAuD;IACjD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBpD"}
|
|
@@ -22,6 +22,16 @@ export class DebugStore {
|
|
|
22
22
|
this.routes = new RouteInspector();
|
|
23
23
|
this.traces = config.tracing ? new TraceCollector(config.maxTraces) : null;
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Register a callback that fires whenever any collector records a new item.
|
|
27
|
+
* The callback receives the item type ('query' | 'event' | 'email' | 'trace').
|
|
28
|
+
*/
|
|
29
|
+
onNewItem(cb) {
|
|
30
|
+
this.queries.onNewItem(cb ? () => cb('query') : null);
|
|
31
|
+
this.events.onNewItem(cb ? () => cb('event') : null);
|
|
32
|
+
this.emails.onNewItem(cb ? () => cb('email') : null);
|
|
33
|
+
this.traces?.onNewItem(cb ? () => cb('trace') : null);
|
|
34
|
+
}
|
|
25
35
|
async start(emitter, router) {
|
|
26
36
|
await this.queries.start(emitter);
|
|
27
37
|
this.events.start(emitter);
|
|
@@ -29,6 +29,8 @@ export declare class EmailCollector {
|
|
|
29
29
|
* - An object: `{ address: "user@example.com", name: "User" }`
|
|
30
30
|
* - An array of strings or objects
|
|
31
31
|
*/
|
|
32
|
+
/** Register a callback that fires whenever a new email is recorded. */
|
|
33
|
+
onNewItem(cb: ((item: EmailRecord) => void) | null): void;
|
|
32
34
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
33
35
|
loadRecords(records: EmailRecord[]): void;
|
|
34
36
|
private extractAddresses;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/email_collector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,QAAQ,CAAmD;gBAEvD,SAAS,GAAE,MAAY;IAI7B,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAwDxC,IAAI,IAAI,IAAI;IAUZ,SAAS,IAAI,WAAW,EAAE;IAI1B,SAAS,CAAC,CAAC,GAAE,MAAY,GAAG,WAAW,EAAE;IAIzC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMvC,aAAa,IAAI,MAAM;IAIvB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,WAAW;IAsBnB;;;;;;;OAOG;IACH,0EAA0E;IAC1E,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;IAMzC,OAAO,CAAC,gBAAgB;CAYzB"}
|
|
1
|
+
{"version":3,"file":"email_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/email_collector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,QAAQ,CAAmD;gBAEvD,SAAS,GAAE,MAAY;IAI7B,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAwDxC,IAAI,IAAI,IAAI;IAUZ,SAAS,IAAI,WAAW,EAAE;IAI1B,SAAS,CAAC,CAAC,GAAE,MAAY,GAAG,WAAW,EAAE;IAIzC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMvC,aAAa,IAAI,MAAM;IAIvB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,WAAW;IAsBnB;;;;;;;OAOG;IACH,uEAAuE;IACvE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAIzD,0EAA0E;IAC1E,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;IAMzC,OAAO,CAAC,gBAAgB;CAYzB"}
|
|
@@ -114,6 +114,10 @@ export class EmailCollector {
|
|
|
114
114
|
* - An object: `{ address: "user@example.com", name: "User" }`
|
|
115
115
|
* - An array of strings or objects
|
|
116
116
|
*/
|
|
117
|
+
/** Register a callback that fires whenever a new email is recorded. */
|
|
118
|
+
onNewItem(cb) {
|
|
119
|
+
this.buffer.onPush(cb);
|
|
120
|
+
}
|
|
117
121
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
118
122
|
loadRecords(records) {
|
|
119
123
|
this.buffer.load(records);
|
|
@@ -16,6 +16,8 @@ export declare class EventCollector {
|
|
|
16
16
|
getLatest(n?: number): EventRecord[];
|
|
17
17
|
getTotalCount(): number;
|
|
18
18
|
clear(): void;
|
|
19
|
+
/** Register a callback that fires whenever a new event is recorded. */
|
|
20
|
+
onNewItem(cb: ((item: EventRecord) => void) | null): void;
|
|
19
21
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
20
22
|
loadRecords(records: EventRecord[]): void;
|
|
21
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/event_collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/event_collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAa;gBAEhB,SAAS,GAAE,MAAY;IAInC,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAmCzB,IAAI,IAAI,IAAI;IAQZ,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,YAAY;IAapB,SAAS,IAAI,WAAW,EAAE;IAI1B,SAAS,CAAC,CAAC,GAAE,MAAY,GAAG,WAAW,EAAE;IAIzC,aAAa,IAAI,MAAM;IAIvB,KAAK,IAAI,IAAI;IAIb,uEAAuE;IACvE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAIzD,0EAA0E;IAC1E,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;CAK1C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RingBuffer } from "./ring_buffer.js";
|
|
2
|
+
import { isExcludedRequest } from "../middleware/request_tracking_middleware.js";
|
|
2
3
|
/**
|
|
3
4
|
* Wraps the AdonisJS emitter to log all events with timestamps.
|
|
4
5
|
* Uses monkey-patching of emitter.emit to intercept all events.
|
|
@@ -19,11 +20,15 @@ export class EventCollector {
|
|
|
19
20
|
emitter.emit = function (event, data) {
|
|
20
21
|
// Resolve event name: class-based events use the class name, string events are used as-is
|
|
21
22
|
const eventName = typeof event === "string" ? event : event?.name || "unknown";
|
|
22
|
-
// Skip internal/noisy events
|
|
23
|
+
// Skip internal/noisy events, mail events (handled by EmailCollector),
|
|
24
|
+
// HTTP lifecycle events (redundant with timeline), and events triggered
|
|
25
|
+
// by debug panel polling requests
|
|
23
26
|
if (!eventName.startsWith("__") &&
|
|
24
27
|
eventName !== "db:query" &&
|
|
25
28
|
!eventName.startsWith("mail:") &&
|
|
26
|
-
eventName !== "queued:mail:error"
|
|
29
|
+
eventName !== "queued:mail:error" &&
|
|
30
|
+
eventName !== "http:request_completed" &&
|
|
31
|
+
!isExcludedRequest()) {
|
|
27
32
|
const record = {
|
|
28
33
|
id: self.buffer.getNextId(),
|
|
29
34
|
event: eventName,
|
|
@@ -86,6 +91,10 @@ export class EventCollector {
|
|
|
86
91
|
clear() {
|
|
87
92
|
this.buffer.clear();
|
|
88
93
|
}
|
|
94
|
+
/** Register a callback that fires whenever a new event is recorded. */
|
|
95
|
+
onNewItem(cb) {
|
|
96
|
+
this.buffer.onPush(cb);
|
|
97
|
+
}
|
|
89
98
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
90
99
|
loadRecords(records) {
|
|
91
100
|
this.buffer.load(records);
|
|
@@ -23,6 +23,8 @@ export declare class QueryCollector {
|
|
|
23
23
|
};
|
|
24
24
|
getTotalCount(): number;
|
|
25
25
|
clear(): void;
|
|
26
|
+
/** Register a callback that fires whenever a new query is recorded. */
|
|
27
|
+
onNewItem(cb: ((item: QueryRecord) => void) | null): void;
|
|
26
28
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
27
29
|
loadRecords(records: QueryRecord[]): void;
|
|
28
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/query_collector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/query_collector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAsC;gBAEzC,UAAU,GAAE,MAAY,EAAE,eAAe,GAAE,MAAY;IAK7D,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCxC,IAAI,IAAI,IAAI;IAYZ,UAAU,IAAI,WAAW,EAAE;IAI3B,SAAS,CAAC,CAAC,GAAE,MAAY,GAAG,WAAW,EAAE;IAIzC,UAAU;;;;;;IA0BV,aAAa,IAAI,MAAM;IAIvB,KAAK,IAAI,IAAI;IAIb,uEAAuE;IACvE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAIzD,0EAA0E;IAC1E,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;CAK1C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RingBuffer } from "./ring_buffer.js";
|
|
2
|
+
import { isExcludedRequest } from "../middleware/request_tracking_middleware.js";
|
|
2
3
|
/**
|
|
3
4
|
* Listens to Lucid's `db:query` event and stores queries in a ring buffer.
|
|
4
5
|
*
|
|
@@ -17,6 +18,12 @@ export class QueryCollector {
|
|
|
17
18
|
async start(emitter) {
|
|
18
19
|
this.emitter = emitter;
|
|
19
20
|
this.handler = (data) => {
|
|
21
|
+
// Self-exclude: skip queries from the dashboard's dedicated SQLite connection
|
|
22
|
+
if (data.connection === 'server_stats')
|
|
23
|
+
return;
|
|
24
|
+
// Self-exclude: skip queries triggered by debug panel polling requests
|
|
25
|
+
if (isExcludedRequest())
|
|
26
|
+
return;
|
|
20
27
|
const duration = typeof data.duration === "number"
|
|
21
28
|
? data.duration
|
|
22
29
|
: Array.isArray(data.duration)
|
|
@@ -77,6 +84,10 @@ export class QueryCollector {
|
|
|
77
84
|
clear() {
|
|
78
85
|
this.buffer.clear();
|
|
79
86
|
}
|
|
87
|
+
/** Register a callback that fires whenever a new query is recorded. */
|
|
88
|
+
onNewItem(cb) {
|
|
89
|
+
this.buffer.onPush(cb);
|
|
90
|
+
}
|
|
80
91
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
81
92
|
loadRecords(records) {
|
|
82
93
|
this.buffer.load(records);
|
|
@@ -8,7 +8,10 @@ export declare class RingBuffer<T> {
|
|
|
8
8
|
private head;
|
|
9
9
|
private count;
|
|
10
10
|
private nextId;
|
|
11
|
+
private pushCallback;
|
|
11
12
|
constructor(capacity: number);
|
|
13
|
+
/** Register a callback that fires whenever a new item is pushed. */
|
|
14
|
+
onPush(cb: ((item: T) => void) | null): void;
|
|
12
15
|
push(item: T): void;
|
|
13
16
|
/** Returns all items in insertion order (oldest first). */
|
|
14
17
|
toArray(): T[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ring_buffer.d.ts","sourceRoot":"","sources":["../../../src/debug/ring_buffer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ring_buffer.d.ts","sourceRoot":"","sources":["../../../src/debug/ring_buffer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAU,CAAC,CAAC;IAOX,OAAO,CAAC,QAAQ;IAN5B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAoC;gBAEpC,QAAQ,EAAE,MAAM;IAIpC,oEAAoE;IACpE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAI5C,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IASnB,2DAA2D;IAC3D,OAAO,IAAI,CAAC,EAAE;IAcd,sDAAsD;IACtD,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE;IAKtB,SAAS,IAAI,MAAM;IAInB,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;IAMb,mFAAmF;IACnF,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI;IAMtB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAG5B"}
|
|
@@ -8,16 +8,22 @@ export class RingBuffer {
|
|
|
8
8
|
head = 0;
|
|
9
9
|
count = 0;
|
|
10
10
|
nextId = 1;
|
|
11
|
+
pushCallback = null;
|
|
11
12
|
constructor(capacity) {
|
|
12
13
|
this.capacity = capacity;
|
|
13
14
|
this.buffer = new Array(capacity);
|
|
14
15
|
}
|
|
16
|
+
/** Register a callback that fires whenever a new item is pushed. */
|
|
17
|
+
onPush(cb) {
|
|
18
|
+
this.pushCallback = cb;
|
|
19
|
+
}
|
|
15
20
|
push(item) {
|
|
16
21
|
this.buffer[this.head] = item;
|
|
17
22
|
this.head = (this.head + 1) % this.capacity;
|
|
18
23
|
if (this.count < this.capacity) {
|
|
19
24
|
this.count++;
|
|
20
25
|
}
|
|
26
|
+
this.pushCallback?.(item);
|
|
21
27
|
}
|
|
22
28
|
/** Returns all items in insertion order (oldest first). */
|
|
23
29
|
toArray() {
|
|
@@ -30,8 +30,8 @@ export declare class TraceCollector {
|
|
|
30
30
|
constructor(maxTraces?: number);
|
|
31
31
|
/** Start a new trace context for an HTTP request. */
|
|
32
32
|
startTrace(callback: () => Promise<void>): Promise<void>;
|
|
33
|
-
/** Finish the current trace and save it to the ring buffer. */
|
|
34
|
-
finishTrace(method: string, url: string, statusCode: number):
|
|
33
|
+
/** Finish the current trace and save it to the ring buffer. Returns the record, or null if no context. */
|
|
34
|
+
finishTrace(method: string, url: string, statusCode: number): TraceRecord | null;
|
|
35
35
|
/** Add a span to the current trace (if active). */
|
|
36
36
|
addSpan(label: string, category: TraceSpan['category'], startOffset: number, duration: number, metadata?: Record<string, any>): void;
|
|
37
37
|
/** Wrap a function in a traced span with automatic nesting. */
|
|
@@ -45,6 +45,8 @@ export declare class TraceCollector {
|
|
|
45
45
|
getTrace(id: number): TraceRecord | undefined;
|
|
46
46
|
getTotalCount(): number;
|
|
47
47
|
clear(): void;
|
|
48
|
+
/** Register a callback that fires whenever a new trace is recorded. */
|
|
49
|
+
onNewItem(cb: ((item: TraceRecord) => void) | null): void;
|
|
48
50
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
49
51
|
loadRecords(records: TraceRecord[]): void;
|
|
50
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/trace_collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAmBxD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9E;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,GAAG,CAAwC;IACnD,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,mBAAmB,CAAmC;gBAElD,SAAS,GAAE,MAAY;IAKnC,qDAAqD;IACrD,UAAU,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD
|
|
1
|
+
{"version":3,"file":"trace_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/trace_collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAmBxD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9E;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,GAAG,CAAwC;IACnD,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,mBAAmB,CAAmC;gBAElD,SAAS,GAAE,MAAY;IAKnC,qDAAqD;IACrD,UAAU,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD,0GAA0G;IAC1G,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAsBhF,mDAAmD;IACnD,OAAO,CACL,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,EAC/B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,IAAI;IAeP,+DAA+D;IACzD,IAAI,CAAC,CAAC,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC;IAyBb,uEAAuE;IACvE,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAsCzB,uDAAuD;IACvD,IAAI,IAAI,IAAI;IAaZ,SAAS,IAAI,WAAW,EAAE;IAI1B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;IAInC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI7C,aAAa,IAAI,MAAM;IAIvB,KAAK,IAAI,IAAI;IAIb,uEAAuE;IACvE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAIzD,0EAA0E;IAC1E,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;CAK1C"}
|
|
@@ -52,11 +52,11 @@ export class TraceCollector {
|
|
|
52
52
|
};
|
|
53
53
|
return this.als.run(ctx, callback);
|
|
54
54
|
}
|
|
55
|
-
/** Finish the current trace and save it to the ring buffer. */
|
|
55
|
+
/** Finish the current trace and save it to the ring buffer. Returns the record, or null if no context. */
|
|
56
56
|
finishTrace(method, url, statusCode) {
|
|
57
57
|
const ctx = this.als.getStore();
|
|
58
58
|
if (!ctx)
|
|
59
|
-
return;
|
|
59
|
+
return null;
|
|
60
60
|
const totalDuration = performance.now() - ctx.requestStart;
|
|
61
61
|
const record = {
|
|
62
62
|
id: this.buffer.getNextId(),
|
|
@@ -70,6 +70,7 @@ export class TraceCollector {
|
|
|
70
70
|
timestamp: Date.now(),
|
|
71
71
|
};
|
|
72
72
|
this.buffer.push(record);
|
|
73
|
+
return record;
|
|
73
74
|
}
|
|
74
75
|
/** Add a span to the current trace (if active). */
|
|
75
76
|
addSpan(label, category, startOffset, duration, metadata) {
|
|
@@ -172,6 +173,10 @@ export class TraceCollector {
|
|
|
172
173
|
clear() {
|
|
173
174
|
this.buffer.clear();
|
|
174
175
|
}
|
|
176
|
+
/** Register a callback that fires whenever a new trace is recorded. */
|
|
177
|
+
onNewItem(cb) {
|
|
178
|
+
this.buffer.onPush(cb);
|
|
179
|
+
}
|
|
175
180
|
/** Restore persisted records into the buffer and reset the ID counter. */
|
|
176
181
|
loadRecords(records) {
|
|
177
182
|
this.buffer.load(records);
|
|
@@ -167,6 +167,14 @@ export interface DevToolbarConfig {
|
|
|
167
167
|
tracing: boolean;
|
|
168
168
|
/** Maximum traces to keep in the ring buffer. */
|
|
169
169
|
maxTraces: number;
|
|
170
|
+
/** Whether the full-page dashboard is enabled. */
|
|
171
|
+
dashboard: boolean;
|
|
172
|
+
/** URL path for the full-page dashboard. */
|
|
173
|
+
dashboardPath: string;
|
|
174
|
+
/** Data retention period in days for historical persistence. */
|
|
175
|
+
retentionDays: number;
|
|
176
|
+
/** Path to the SQLite database file for historical persistence. */
|
|
177
|
+
dbPath: string;
|
|
170
178
|
}
|
|
171
179
|
/**
|
|
172
180
|
* Color names available for the `badge` column format.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/debug/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/debug/types.ts"],"names":[],"mappings":"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"}
|