@adonis-agora/telescope 0.12.0 → 0.14.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 (99) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/dist/providers/telescope_provider.d.ts.map +1 -1
  3. package/dist/providers/telescope_provider.js +6 -2
  4. package/dist/providers/telescope_provider.js.map +1 -1
  5. package/dist/providers/telescope_ui_provider.d.ts.map +1 -1
  6. package/dist/providers/telescope_ui_provider.js +7 -0
  7. package/dist/providers/telescope_ui_provider.js.map +1 -1
  8. package/dist/providers/telescope_watchers_provider.d.ts +25 -0
  9. package/dist/providers/telescope_watchers_provider.d.ts.map +1 -1
  10. package/dist/providers/telescope_watchers_provider.js +66 -5
  11. package/dist/providers/telescope_watchers_provider.js.map +1 -1
  12. package/dist/src/ai/index.d.ts +1 -1
  13. package/dist/src/ai/index.js +1 -1
  14. package/dist/src/alerts/index.d.ts +1 -1
  15. package/dist/src/alerts/index.js +1 -1
  16. package/dist/src/client_errors/ingestor.d.ts +20 -0
  17. package/dist/src/client_errors/ingestor.d.ts.map +1 -1
  18. package/dist/src/client_errors/ingestor.js +29 -2
  19. package/dist/src/client_errors/ingestor.js.map +1 -1
  20. package/dist/src/define_config.d.ts +10 -1
  21. package/dist/src/define_config.d.ts.map +1 -1
  22. package/dist/src/define_config.js +1 -0
  23. package/dist/src/define_config.js.map +1 -1
  24. package/dist/src/extension/registry.d.ts +14 -1
  25. package/dist/src/extension/registry.d.ts.map +1 -1
  26. package/dist/src/extension/registry.js +38 -0
  27. package/dist/src/extension/registry.js.map +1 -1
  28. package/dist/src/extension/types.d.ts +22 -0
  29. package/dist/src/extension/types.d.ts.map +1 -1
  30. package/dist/src/extension/types.js.map +1 -1
  31. package/dist/src/index.d.ts +6 -4
  32. package/dist/src/index.d.ts.map +1 -1
  33. package/dist/src/index.js +3 -2
  34. package/dist/src/index.js.map +1 -1
  35. package/dist/src/mcp/index.d.ts +1 -1
  36. package/dist/src/mcp/index.js +1 -1
  37. package/dist/src/metrics/metrics_service.d.ts +36 -2
  38. package/dist/src/metrics/metrics_service.d.ts.map +1 -1
  39. package/dist/src/metrics/metrics_service.js +47 -5
  40. package/dist/src/metrics/metrics_service.js.map +1 -1
  41. package/dist/src/metrics/pulse.d.ts +2 -0
  42. package/dist/src/metrics/pulse.d.ts.map +1 -1
  43. package/dist/src/metrics/pulse.js +1 -0
  44. package/dist/src/metrics/pulse.js.map +1 -1
  45. package/dist/src/metrics/screens.d.ts +41 -0
  46. package/dist/src/metrics/screens.d.ts.map +1 -0
  47. package/dist/src/metrics/screens.js +70 -0
  48. package/dist/src/metrics/screens.js.map +1 -0
  49. package/dist/src/metrics/stats.d.ts +14 -0
  50. package/dist/src/metrics/stats.d.ts.map +1 -1
  51. package/dist/src/metrics/stats.js +1 -0
  52. package/dist/src/metrics/stats.js.map +1 -1
  53. package/dist/src/profiling/index.d.ts +1 -1
  54. package/dist/src/profiling/index.js +1 -1
  55. package/dist/src/registry.d.ts +9 -2
  56. package/dist/src/registry.d.ts.map +1 -1
  57. package/dist/src/registry.js +8 -1
  58. package/dist/src/registry.js.map +1 -1
  59. package/dist/src/request_watcher.d.ts +105 -1
  60. package/dist/src/request_watcher.d.ts.map +1 -1
  61. package/dist/src/request_watcher.js +95 -1
  62. package/dist/src/request_watcher.js.map +1 -1
  63. package/dist/src/store.d.ts +46 -0
  64. package/dist/src/store.d.ts.map +1 -1
  65. package/dist/src/stores/lucid.d.ts +18 -1
  66. package/dist/src/stores/lucid.d.ts.map +1 -1
  67. package/dist/src/stores/lucid.js +40 -0
  68. package/dist/src/stores/lucid.js.map +1 -1
  69. package/dist/src/stores/memory.d.ts +7 -1
  70. package/dist/src/stores/memory.d.ts.map +1 -1
  71. package/dist/src/stores/memory.js +35 -0
  72. package/dist/src/stores/memory.js.map +1 -1
  73. package/dist/src/telescope_middleware.d.ts.map +1 -1
  74. package/dist/src/telescope_middleware.js +2 -0
  75. package/dist/src/telescope_middleware.js.map +1 -1
  76. package/dist/src/ui/api.d.ts +16 -1
  77. package/dist/src/ui/api.d.ts.map +1 -1
  78. package/dist/src/ui/api.js +53 -5
  79. package/dist/src/ui/api.js.map +1 -1
  80. package/dist/src/ui/index.d.ts +1 -1
  81. package/dist/src/ui/index.js +1 -1
  82. package/dist/src/watchers/define_config.d.ts +28 -0
  83. package/dist/src/watchers/define_config.d.ts.map +1 -1
  84. package/dist/src/watchers/define_config.js +10 -0
  85. package/dist/src/watchers/define_config.js.map +1 -1
  86. package/dist/src/watchers/index.d.ts +4 -4
  87. package/dist/src/watchers/index.d.ts.map +1 -1
  88. package/dist/src/watchers/index.js +2 -3
  89. package/dist/src/watchers/index.js.map +1 -1
  90. package/dist/src/watchers/logs_watcher.d.ts +0 -19
  91. package/dist/src/watchers/logs_watcher.d.ts.map +1 -1
  92. package/dist/src/watchers/logs_watcher.js +22 -0
  93. package/dist/src/watchers/logs_watcher.js.map +1 -1
  94. package/dist/src/watchers/redis_watcher.d.ts +78 -1
  95. package/dist/src/watchers/redis_watcher.d.ts.map +1 -1
  96. package/dist/src/watchers/redis_watcher.js +124 -1
  97. package/dist/src/watchers/redis_watcher.js.map +1 -1
  98. package/dist/stubs/config/telescope.stub +20 -0
  99. package/package.json +1 -1
@@ -24,6 +24,19 @@ function isThenable(value) {
24
24
  'then' in value &&
25
25
  typeof value.then === 'function');
26
26
  }
27
+ /** Default flood threshold (entries/minute) — see {@link RedisWatcherOptions.floodWarnPerMinute}. */
28
+ const DEFAULT_FLOOD_WARN_PER_MINUTE = 600;
29
+ /** The first argument of a redis command, as a string, or `null` when unkeyed. */
30
+ function firstKey(command) {
31
+ const args = command.args;
32
+ if (!Array.isArray(args) || args.length === 0)
33
+ return null;
34
+ const key = args[0];
35
+ if (typeof key === 'string')
36
+ return key;
37
+ // ioredis passes Buffers for binary-safe keys; only decode when it is cheap.
38
+ return typeof Buffer !== 'undefined' && Buffer.isBuffer(key) ? key.toString('utf8') : null;
39
+ }
27
40
  /**
28
41
  * Records every Redis command issued through `@adonisjs/redis` as a `redis`
29
42
  * telescope entry — the command name, args, connection and round-trip duration,
@@ -55,10 +68,53 @@ export class RedisWatcher {
55
68
  /** Clients we patched, with their connection name, for clean restore on stop. */
56
69
  wrapped = [];
57
70
  unsubscribeManager = null;
71
+ ignoreCommands;
72
+ ignoreKeys;
73
+ ignoreConnections;
74
+ sampleRate;
75
+ floodWarnPerMinute;
76
+ /** Flood accounting: entries recorded in the current minute, plus the loudest
77
+ * command/key seen, so the warning can name the actual culprit. */
78
+ windowStartedAt = now();
79
+ windowCount = 0;
80
+ windowCommands = new Map();
81
+ windowKeyPrefixes = new Map();
82
+ floodWarned = false;
58
83
  /** Construct with the resolved `@adonisjs/redis` manager (or `null` when the
59
84
  * optional peer is absent — the watcher then no-ops). */
60
- constructor(manager) {
85
+ constructor(manager, options = {}) {
61
86
  this.manager = isManager(manager) ? manager : null;
87
+ this.ignoreCommands = new Set((options.ignoreCommands ?? []).map((c) => c.toUpperCase()));
88
+ this.ignoreKeys = options.ignoreKeys ?? [];
89
+ this.ignoreConnections = new Set((options.ignoreConnections ?? []).map((c) => c.toLowerCase()));
90
+ // Clamp rather than throw: a bad sampleRate should not take the app down at boot.
91
+ this.sampleRate = Math.min(1, Math.max(0, options.sampleRate ?? 1));
92
+ this.floodWarnPerMinute = Math.max(0, options.floodWarnPerMinute ?? DEFAULT_FLOOD_WARN_PER_MINUTE);
93
+ }
94
+ /**
95
+ * Whether this command is recorded. Ordered cheapest-first: the connection and
96
+ * command checks are set lookups, the key check walks the (usually empty) pattern
97
+ * list, and sampling comes last so a filtered-out command never burns entropy.
98
+ */
99
+ shouldRecord(command, connection) {
100
+ if (connection !== null && this.ignoreConnections.has(connection.toLowerCase()))
101
+ return false;
102
+ const name = typeof command.name === 'string' ? command.name.toUpperCase() : '';
103
+ if (this.ignoreCommands.has(name))
104
+ return false;
105
+ if (this.ignoreKeys.length > 0) {
106
+ const key = firstKey(command);
107
+ if (key !== null) {
108
+ for (const pattern of this.ignoreKeys) {
109
+ const hit = typeof pattern === 'string' ? key.startsWith(pattern) : pattern.test(key);
110
+ if (hit)
111
+ return false;
112
+ }
113
+ }
114
+ }
115
+ if (this.sampleRate < 1 && Math.random() >= this.sampleRate)
116
+ return false;
117
+ return true;
62
118
  }
63
119
  /** Instrument current + future connections. Idempotent. A no-op when the peer
64
120
  * is absent. */
@@ -114,6 +170,11 @@ export class RedisWatcher {
114
170
  client.__telescopeOriginalSendCommand__ = original;
115
171
  this.wrapped.push({ client, connection });
116
172
  client.sendCommand = function patchedSendCommand(command, ...rest) {
173
+ // Decided BEFORE the call so a filtered command costs one set lookup and
174
+ // never allocates a finalize closure or attaches to the command's promise.
175
+ if (!watcher.shouldRecord(command, connection)) {
176
+ return original.call(client, command, ...rest);
177
+ }
117
178
  const startedAt = now();
118
179
  const result = original.call(client, command, ...rest);
119
180
  if (isThenable(result)) {
@@ -129,8 +190,70 @@ export class RedisWatcher {
129
190
  };
130
191
  }
131
192
  record(command, connection, durationMs) {
193
+ this.accountForFlood(command);
132
194
  safeRecord(buildRedisEntry(command, connection, durationMs), 'RedisWatcher');
133
195
  }
196
+ /**
197
+ * Count what we record in a rolling one-minute window and, the first time it
198
+ * crosses the threshold, warn ONCE naming the loudest command and key prefix.
199
+ *
200
+ * This exists because the failure mode is silent: nothing breaks, the app is fine,
201
+ * and you only discover the watcher is writing 300k rows/day when a console screen
202
+ * gets slow enough to complain about. Naming the culprit turns the fix into a paste
203
+ * instead of an investigation.
204
+ */
205
+ accountForFlood(command) {
206
+ if (this.floodWarnPerMinute === 0 || this.floodWarned)
207
+ return;
208
+ const elapsed = now() - this.windowStartedAt;
209
+ if (elapsed >= 60_000) {
210
+ this.windowStartedAt = now();
211
+ this.windowCount = 0;
212
+ this.windowCommands.clear();
213
+ this.windowKeyPrefixes.clear();
214
+ }
215
+ this.windowCount++;
216
+ const name = typeof command.name === 'string' ? command.name.toUpperCase() : '(unknown)';
217
+ this.windowCommands.set(name, (this.windowCommands.get(name) ?? 0) + 1);
218
+ const key = firstKey(command);
219
+ if (key !== null) {
220
+ // Group by the first two colon-segments — `app:rlflx:foo` → `app:rlflx`, which
221
+ // is the granularity someone would actually paste into `ignoreKeys`.
222
+ const prefix = key.split(':').slice(0, 2).join(':');
223
+ this.windowKeyPrefixes.set(prefix, (this.windowKeyPrefixes.get(prefix) ?? 0) + 1);
224
+ }
225
+ if (this.windowCount < this.floodWarnPerMinute)
226
+ return;
227
+ this.floodWarned = true;
228
+ console.warn(formatFloodWarning(this.windowCount, this.windowCommands, this.windowKeyPrefixes));
229
+ }
230
+ }
231
+ /** Largest-count entry of a tally, or `null` when empty. */
232
+ function topOf(tally) {
233
+ let top = null;
234
+ for (const [name, count] of tally) {
235
+ if (top === null || count > top.count)
236
+ top = { name, count };
237
+ }
238
+ return top;
239
+ }
240
+ /** The flood warning text. Exported for tests — the VALUE here is that the message
241
+ * names the culprit and the exact option, so it is worth pinning. */
242
+ export function formatFloodWarning(count, commands, keyPrefixes) {
243
+ const command = topOf(commands);
244
+ const prefix = topOf(keyPrefixes);
245
+ const lines = [
246
+ `Telescope: the redis watcher recorded ${count} entries in the last minute. ` +
247
+ 'At that rate it will dominate your telescope table and slow the console down.',
248
+ ];
249
+ if (command)
250
+ lines.push(` loudest command: ${command.name} (${command.count})`);
251
+ if (prefix) {
252
+ lines.push(` loudest key prefix: ${prefix.name} (${prefix.count})`);
253
+ lines.push(` to drop it: redis: { ignoreKeys: ['${prefix.name}:'] } in config/telescope_watchers.ts`);
254
+ }
255
+ lines.push(' (or set redis.floodWarnPerMinute: 0 to silence this warning)');
256
+ return lines.join('\n');
134
257
  }
135
258
  /** Narrow an arbitrary value to a {@link RedisManagerLike}. */
136
259
  function isManager(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"redis_watcher.js","sourceRoot":"","sources":["../../../src/watchers/redis_watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis_watcher.js","sourceRoot":"","sources":["../../../src/watchers/redis_watcher.ts"],"names":[],"mappings":"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"}
@@ -88,6 +88,26 @@ export default defineConfig({
88
88
  // skipBody: (request) => request.url.startsWith('/webhooks/'),
89
89
  // },
90
90
 
91
+ /**
92
+ * Enrich every request entry with what only your app knows. Return 'tags' for
93
+ * anything you want to FILTER by in the dashboard, 'context' for detail you only
94
+ * want to read, and 'user' when neither ctx.auth.user nor the
95
+ * @adonis-agora/context userRef() applies.
96
+ *
97
+ * The classic use: have the front end send its current screen in a header, and
98
+ * tag the entry with it — then the dashboard answers "which requests came from
99
+ * the writing screen?" with its normal tag filter.
100
+ *
101
+ * SYNCHRONOUS: it runs on the recording path of every request, so read what is
102
+ * already on the ctx (headers, route, resolved guard state) rather than doing
103
+ * I/O. A throw is swallowed — enrichment never costs you the entry.
104
+ */
105
+ // requestEnrichment: (ctx) => {
106
+ // // header() is optional on the framework-agnostic ctx type — hence the ?. call
107
+ // const screen = ctx.request.header?.('x-screen')
108
+ // return typeof screen === 'string' ? { tags: ['screen:' + screen] } : undefined
109
+ // },
110
+
91
111
  /**
92
112
  * Sensitive-data redaction. Every entry's content is scrubbed before it is
93
113
  * persisted — a built-in set of sensitive keys ('authorization', 'cookie',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/telescope",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Laravel Telescope-style headless observability for AdonisJS — records HTTP requests and every Agora diagnostics event as queryable entries, plus opt-in subpaths for per-technology watchers, a web dashboard, AI exception diagnosis, and alerting.",
5
5
  "license": "MIT",
6
6
  "repository": {