adonisjs-server-stats 1.0.4 → 1.0.7
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
CHANGED
|
@@ -13,7 +13,7 @@ Drop a single Edge tag into your layout and get a live stats bar showing CPU, me
|
|
|
13
13
|
|
|
14
14
|
Zero frontend dependencies. Zero build step. Just `@serverStats()` and go.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
<video src="https://github.com/simulieren/adonisjs-server-stats/raw/main/screenshots/adonisjs-server-stats.mp4" controls muted loop width="100%"></video>
|
|
17
17
|
|
|
18
18
|
## Screenshots
|
|
19
19
|
|
|
@@ -89,6 +89,23 @@ server.use([
|
|
|
89
89
|
```ts
|
|
90
90
|
// config/server_stats.ts
|
|
91
91
|
import { defineConfig } from 'adonisjs-server-stats'
|
|
92
|
+
import { processCollector, systemCollector, httpCollector } from 'adonisjs-server-stats/collectors'
|
|
93
|
+
|
|
94
|
+
export default defineConfig({
|
|
95
|
+
collectors: [
|
|
96
|
+
processCollector(),
|
|
97
|
+
systemCollector(),
|
|
98
|
+
httpCollector(),
|
|
99
|
+
],
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
That's it -- this gives you CPU, memory, event loop lag, and HTTP throughput out of the box. All other options have sensible defaults. Add more collectors as needed:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
// config/server_stats.ts
|
|
107
|
+
import env from '#start/env'
|
|
108
|
+
import { defineConfig } from 'adonisjs-server-stats'
|
|
92
109
|
import {
|
|
93
110
|
processCollector,
|
|
94
111
|
systemCollector,
|
|
@@ -99,14 +116,12 @@ import {
|
|
|
99
116
|
logCollector,
|
|
100
117
|
appCollector,
|
|
101
118
|
} from 'adonisjs-server-stats/collectors'
|
|
102
|
-
import env from '#start/env'
|
|
103
119
|
|
|
104
120
|
export default defineConfig({
|
|
105
121
|
intervalMs: 3000,
|
|
106
122
|
transport: 'transmit',
|
|
107
123
|
channelName: 'admin/server-stats',
|
|
108
124
|
endpoint: '/admin/api/server-stats',
|
|
109
|
-
shouldShow: (ctx) => !!ctx.auth?.user?.isAdmin,
|
|
110
125
|
collectors: [
|
|
111
126
|
processCollector(),
|
|
112
127
|
systemCollector(),
|
|
@@ -133,7 +148,7 @@ export default defineConfig({
|
|
|
133
148
|
// start/routes.ts
|
|
134
149
|
router
|
|
135
150
|
.get('/admin/api/server-stats', '#controllers/admin/server_stats_controller.index')
|
|
136
|
-
.use(middleware.superadmin())
|
|
151
|
+
.use(middleware.superadmin()) // Replace with your own middleware
|
|
137
152
|
```
|
|
138
153
|
|
|
139
154
|
### 5. Create the controller
|
|
@@ -278,23 +293,35 @@ interface MetricCollector {
|
|
|
278
293
|
|
|
279
294
|
## Visibility Control (`shouldShow`)
|
|
280
295
|
|
|
281
|
-
|
|
296
|
+
By default the stats bar renders for every request. Use `shouldShow` to restrict it. The callback receives the AdonisJS `HttpContext` and should return `true` to show the bar, `false` to hide it.
|
|
297
|
+
|
|
298
|
+
Because `shouldShow` runs **after** middleware (including auth), you have full access to `ctx.auth`.
|
|
282
299
|
|
|
283
300
|
```ts
|
|
284
301
|
export default defineConfig({
|
|
285
|
-
// Only
|
|
286
|
-
shouldShow: (
|
|
302
|
+
// Only show in development
|
|
303
|
+
shouldShow: () => env.get('NODE_ENV'),
|
|
304
|
+
})
|
|
305
|
+
```
|
|
287
306
|
|
|
288
|
-
|
|
289
|
-
|
|
307
|
+
```ts
|
|
308
|
+
export default defineConfig({
|
|
309
|
+
// Only show for logged-in admin users
|
|
310
|
+
shouldShow: (ctx) => ctx.auth?.user?.isAdmin === true,
|
|
311
|
+
})
|
|
312
|
+
```
|
|
290
313
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
314
|
+
```ts
|
|
315
|
+
export default defineConfig({
|
|
316
|
+
// Only show for specific roles
|
|
317
|
+
shouldShow: (ctx) => {
|
|
318
|
+
const role = ctx.auth?.user?.role
|
|
319
|
+
return role === 'admin' || role === 'superadmin'
|
|
320
|
+
},
|
|
294
321
|
})
|
|
295
322
|
```
|
|
296
323
|
|
|
297
|
-
When `shouldShow` is not set, the
|
|
324
|
+
> **Tip:** When `shouldShow` is not set, the bar renders for everyone. In production you almost always want to set this.
|
|
298
325
|
|
|
299
326
|
---
|
|
300
327
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/event_collector.ts"],"names":[],"mappings":"AACA,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;
|
|
1
|
+
{"version":3,"file":"event_collector.d.ts","sourceRoot":"","sources":["../../../src/debug/event_collector.ts"],"names":[],"mappings":"AACA,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;IA0BzB,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;CAGd"}
|
|
@@ -17,11 +17,13 @@ export class EventCollector {
|
|
|
17
17
|
this.originalEmit = emitter.emit.bind(emitter);
|
|
18
18
|
const self = this;
|
|
19
19
|
emitter.emit = function (event, data) {
|
|
20
|
+
// Resolve event name: class-based events use the class name, string events are used as-is
|
|
21
|
+
const eventName = typeof event === "string" ? event : event?.name || "unknown";
|
|
20
22
|
// Skip internal/noisy events
|
|
21
|
-
if (!
|
|
23
|
+
if (!eventName.startsWith("__") && eventName !== "db:query") {
|
|
22
24
|
const record = {
|
|
23
25
|
id: self.buffer.getNextId(),
|
|
24
|
-
event,
|
|
26
|
+
event: eventName,
|
|
25
27
|
data: self.summarizeData(data),
|
|
26
28
|
timestamp: Date.now(),
|
|
27
29
|
};
|
package/package.json
CHANGED
|
Binary file
|