@adonis-agora/telescope 0.2.0 → 0.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 (120) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/providers/telescope_provider.d.ts +16 -0
  3. package/dist/providers/telescope_provider.d.ts.map +1 -1
  4. package/dist/providers/telescope_provider.js +33 -2
  5. package/dist/providers/telescope_provider.js.map +1 -1
  6. package/dist/providers/telescope_ui_provider.d.ts.map +1 -1
  7. package/dist/providers/telescope_ui_provider.js +87 -1
  8. package/dist/providers/telescope_ui_provider.js.map +1 -1
  9. package/dist/providers/telescope_watchers_provider.d.ts +11 -0
  10. package/dist/providers/telescope_watchers_provider.d.ts.map +1 -1
  11. package/dist/providers/telescope_watchers_provider.js +58 -0
  12. package/dist/providers/telescope_watchers_provider.js.map +1 -1
  13. package/dist/src/define_config.d.ts +50 -0
  14. package/dist/src/define_config.d.ts.map +1 -1
  15. package/dist/src/define_config.js +9 -0
  16. package/dist/src/define_config.js.map +1 -1
  17. package/dist/src/index.d.ts +23 -2
  18. package/dist/src/index.d.ts.map +1 -1
  19. package/dist/src/index.js +17 -1
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/metrics/metrics_service.d.ts +63 -0
  22. package/dist/src/metrics/metrics_service.d.ts.map +1 -0
  23. package/dist/src/metrics/metrics_service.js +116 -0
  24. package/dist/src/metrics/metrics_service.js.map +1 -0
  25. package/dist/src/metrics/rollup.d.ts +61 -0
  26. package/dist/src/metrics/rollup.d.ts.map +1 -0
  27. package/dist/src/metrics/rollup.js +114 -0
  28. package/dist/src/metrics/rollup.js.map +1 -0
  29. package/dist/src/metrics/stats.d.ts +112 -0
  30. package/dist/src/metrics/stats.d.ts.map +1 -0
  31. package/dist/src/metrics/stats.js +255 -0
  32. package/dist/src/metrics/stats.js.map +1 -0
  33. package/dist/src/metrics/timeseries.d.ts +22 -0
  34. package/dist/src/metrics/timeseries.d.ts.map +1 -0
  35. package/dist/src/metrics/timeseries.js +34 -0
  36. package/dist/src/metrics/timeseries.js.map +1 -0
  37. package/dist/src/metrics/traces.d.ts +27 -0
  38. package/dist/src/metrics/traces.d.ts.map +1 -0
  39. package/dist/src/metrics/traces.js +71 -0
  40. package/dist/src/metrics/traces.js.map +1 -0
  41. package/dist/src/metrics/waterfall.d.ts +44 -0
  42. package/dist/src/metrics/waterfall.d.ts.map +1 -0
  43. package/dist/src/metrics/waterfall.js +99 -0
  44. package/dist/src/metrics/waterfall.js.map +1 -0
  45. package/dist/src/query/n_plus_one.d.ts +60 -0
  46. package/dist/src/query/n_plus_one.d.ts.map +1 -0
  47. package/dist/src/query/n_plus_one.js +102 -0
  48. package/dist/src/query/n_plus_one.js.map +1 -0
  49. package/dist/src/registry.d.ts +9 -0
  50. package/dist/src/registry.d.ts.map +1 -1
  51. package/dist/src/registry.js +6 -0
  52. package/dist/src/registry.js.map +1 -1
  53. package/dist/src/sampling/sampling.d.ts +52 -0
  54. package/dist/src/sampling/sampling.d.ts.map +1 -0
  55. package/dist/src/sampling/sampling.js +111 -0
  56. package/dist/src/sampling/sampling.js.map +1 -0
  57. package/dist/src/sampling/sampling_store.d.ts +33 -0
  58. package/dist/src/sampling/sampling_store.d.ts.map +1 -0
  59. package/dist/src/sampling/sampling_store.js +65 -0
  60. package/dist/src/sampling/sampling_store.js.map +1 -0
  61. package/dist/src/stream/entry_events.d.ts +45 -0
  62. package/dist/src/stream/entry_events.d.ts.map +1 -0
  63. package/dist/src/stream/entry_events.js +56 -0
  64. package/dist/src/stream/entry_events.js.map +1 -0
  65. package/dist/src/stream/index.d.ts +6 -0
  66. package/dist/src/stream/index.d.ts.map +1 -0
  67. package/dist/src/stream/index.js +5 -0
  68. package/dist/src/stream/index.js.map +1 -0
  69. package/dist/src/stream/stream_handler.d.ts +42 -0
  70. package/dist/src/stream/stream_handler.d.ts.map +1 -0
  71. package/dist/src/stream/stream_handler.js +48 -0
  72. package/dist/src/stream/stream_handler.js.map +1 -0
  73. package/dist/src/stream/streaming_store.d.ts +31 -0
  74. package/dist/src/stream/streaming_store.d.ts.map +1 -0
  75. package/dist/src/stream/streaming_store.js +49 -0
  76. package/dist/src/stream/streaming_store.js.map +1 -0
  77. package/dist/src/ui/api.d.ts +39 -1
  78. package/dist/src/ui/api.d.ts.map +1 -1
  79. package/dist/src/ui/api.js +116 -1
  80. package/dist/src/ui/api.js.map +1 -1
  81. package/dist/src/ui/define_config.d.ts +27 -0
  82. package/dist/src/ui/define_config.d.ts.map +1 -1
  83. package/dist/src/ui/define_config.js +6 -0
  84. package/dist/src/ui/define_config.js.map +1 -1
  85. package/dist/src/ui/http.d.ts +40 -0
  86. package/dist/src/ui/http.d.ts.map +1 -1
  87. package/dist/src/ui/http.js +43 -0
  88. package/dist/src/ui/http.js.map +1 -1
  89. package/dist/src/ui/index.d.ts +5 -3
  90. package/dist/src/ui/index.d.ts.map +1 -1
  91. package/dist/src/ui/index.js +3 -1
  92. package/dist/src/ui/index.js.map +1 -1
  93. package/dist/src/ui/request_replay.d.ts +56 -0
  94. package/dist/src/ui/request_replay.d.ts.map +1 -0
  95. package/dist/src/ui/request_replay.js +120 -0
  96. package/dist/src/ui/request_replay.js.map +1 -0
  97. package/dist/src/watchers/define_config.d.ts +17 -1
  98. package/dist/src/watchers/define_config.d.ts.map +1 -1
  99. package/dist/src/watchers/define_config.js +13 -0
  100. package/dist/src/watchers/define_config.js.map +1 -1
  101. package/dist/src/watchers/events_watcher.d.ts +63 -0
  102. package/dist/src/watchers/events_watcher.d.ts.map +1 -0
  103. package/dist/src/watchers/events_watcher.js +81 -0
  104. package/dist/src/watchers/events_watcher.js.map +1 -0
  105. package/dist/src/watchers/index.d.ts +6 -0
  106. package/dist/src/watchers/index.d.ts.map +1 -1
  107. package/dist/src/watchers/index.js +6 -0
  108. package/dist/src/watchers/index.js.map +1 -1
  109. package/dist/src/watchers/queue_watcher.d.ts +97 -0
  110. package/dist/src/watchers/queue_watcher.d.ts.map +1 -0
  111. package/dist/src/watchers/queue_watcher.js +114 -0
  112. package/dist/src/watchers/queue_watcher.js.map +1 -0
  113. package/dist/src/watchers/redis_watcher.d.ts +103 -0
  114. package/dist/src/watchers/redis_watcher.d.ts.map +1 -0
  115. package/dist/src/watchers/redis_watcher.js +161 -0
  116. package/dist/src/watchers/redis_watcher.js.map +1 -0
  117. package/dist/stubs/config/telescope.stub +9 -0
  118. package/dist/stubs/config/telescope_ui.stub +13 -0
  119. package/dist/stubs/config/telescope_watchers.stub +14 -3
  120. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # @adonis-agora/telescope
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`50cb0a6`](https://github.com/DavideCarvalho/adonis-telescope/commit/50cb0a67689f6c381b4b85ea5333ffc97b5a00bd) - Add three per-technology watchers, ports of the NestJS originals:
8
+
9
+ - **queue** — records `@adonisjs/queue` job executions (queue, job name, payload, status, attempts, duration) by subscribing to the engine's (`@boringnode/queue`) `node:diagnostics_channel` execution trace. Optional peer: a pure no-op when nothing publishes (peer absent).
10
+ - **events** — records every event emitted through the core `@adonisjs/core` Emitter via `emitter.onAny(...)` (name + payload), with a configurable ignore-list (`db:query` / `mail:sent` excluded by default to avoid double-recording the query/mail watchers).
11
+ - **redis** — records `@adonisjs/redis` commands (command, args, connection, duration) by wrapping the underlying ioredis `sendCommand` on each connection (current and future, via the manager's `connection` event). Optional peer: a no-op when the manager is absent.
12
+
13
+ All three are registered in `config/telescope_watchers.ts` with a toggle, route entries through the central redacting store, and degrade gracefully when their optional peer is missing.
14
+
15
+ The **schedule** watcher was intentionally **skipped**: AdonisJS has no first-party scheduler (unlike `@nestjs/schedule`), and community schedulers expose no event/hook surface to tap without inventing an API. In the Agora ecosystem `@adonis-agora/durable` already bridges scheduled/cron runs onto the diagnostics bus, which the existing diagnostics watcher records — so scheduled-run observability is covered there.
16
+
17
+ - [`a3a114e`](https://github.com/DavideCarvalho/adonis-telescope/commit/a3a114e314c9fe5acbb8262dfd22b07596f62049) - feat: tail-sampling, N+1 detection, and metrics (stats/timeseries/percentiles/waterfall)
18
+
19
+ Three data features ported from the NestJS `nestjs-telescope` originals:
20
+
21
+ - **Tail-sampling** — a per-entry-type keep `rate` with optional `keepErrors` / `keepSlowMs` overrides, applied on the WRITE path via a `SamplingTelescopeStore` decorator so dropped entries are never persisted. The decision is a pure function with an injected RNG (deterministic in tests). Configured via `sampling` (a bare rate or per-type rules); default-off (records everything when unset).
22
+ - **N+1 detection** — read-only analysis over stored entries grouped by trace: a flat family-count (`detectNPlusOne`) and a loop-attribution detector (`detectNPlusOnePatterns`) that names the likely driving parent and ranks loops by total wasted duration. Configured via `nPlusOne: { threshold, enabled }` (default threshold 3). Exposed at `GET <path>/api/metrics/n-plus-one/:traceId`.
23
+ - **Metrics** — storage-agnostic aggregations over the store interface: per-type stats with p50/p95/p99 latency percentiles (raw nearest-rank + a histogram estimate that agrees within one bucket-width), per-type breakdowns (query family / cache / request status / exception groups), throughput timeseries, a trace list, and a per-trace span waterfall. Exposed at `GET <path>/api/metrics/stats`, `/api/metrics/timeseries`, `/api/metrics/traces`, and `/api/metrics/waterfall/:traceId`.
24
+
25
+ - [`e882649`](https://github.com/DavideCarvalho/adonis-telescope/commit/e8826499ff7d1af16d749f2c8b06128b64adadcd) - feat: replay a captured request from the dashboard
26
+
27
+ - [`4f03836`](https://github.com/DavideCarvalho/adonis-telescope/commit/4f03836bc5b5a5cb119ee4f9097d0c5794a99f55) - feat: SSE live-stream of telescope entries to the dashboard
28
+
29
+ Port of the NestJS `sse/` feature. A new in-process entry-events bus (`EntryEvents`) receives every newly-persisted entry from the store's write path — published by an outermost `StreamingTelescopeStore` decorator, so only entries that were actually stored (already redacted, post-sampling — never raw) are streamed. A new `GET <telescope>/api/stream` Server-Sent-Events route (behind the existing UI guard) pushes each entry to the dashboard live as an `entry` frame, with a 15s heartbeat and client-disconnect cleanup.
30
+
31
+ Zero-overhead by default: while no dashboard is connected the publish path is a cheap no-op. Toggle with `stream: { enabled: false }` in `config/telescope.ts` (enabled by default).
32
+
3
33
  ## 0.2.0
4
34
 
5
35
  ### Minor Changes
@@ -19,6 +19,7 @@ export default class TelescopeProvider {
19
19
  protected app: ApplicationService;
20
20
  private store;
21
21
  private diagnosticsWatcher;
22
+ private entryEvents;
22
23
  constructor(app: ApplicationService);
23
24
  register(): void;
24
25
  boot(): Promise<void>;
@@ -36,6 +37,21 @@ export default class TelescopeProvider {
36
37
  * `config.redact.enabled` is `false`.
37
38
  */
38
39
  private applyRedaction;
40
+ /**
41
+ * Wrap the store with the tail-sampling decorator so dropped entries are never
42
+ * persisted (and skip redaction work too, since this is the OUTERMOST wrap).
43
+ * Skipped entirely when no `sampling` config was supplied — the empty `{}`
44
+ * config keeps everything, so the decorator is omitted for zero overhead.
45
+ */
46
+ private applySampling;
47
+ /**
48
+ * Wrap the store with the OUTERMOST streaming decorator so each persisted entry
49
+ * — already redacted (inner) and post-sampling (this sees only entries that were
50
+ * stored) — is published to the SSE bus the UI stream route subscribes to.
51
+ * Skipped when `config.stream.enabled` is `false`. The decorator is a no-op while
52
+ * no client is connected, so it stays zero-overhead by default.
53
+ */
54
+ private applyStreaming;
39
55
  /** Construct the extension registry, giving each extension a context over the store + container. */
40
56
  private buildExtensionRegistry;
41
57
  shutdown(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"telescope_provider.d.ts","sourceRoot":"","sources":["../../providers/telescope_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAmB/D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAIxB,SAAS,CAAC,GAAG,EAAE,kBAAkB;IAH7C,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,kBAAkB,CAAmC;gBAEvC,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IAUF,IAAI;IAuBV;;;;;OAKG;YACW,UAAU;IAexB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAKtB,oGAAoG;IACpG,OAAO,CAAC,sBAAsB;IAaxB,QAAQ;CAKf"}
1
+ {"version":3,"file":"telescope_provider.d.ts","sourceRoot":"","sources":["../../providers/telescope_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAuB/D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAKxB,SAAS,CAAC,GAAG,EAAE,kBAAkB;IAJ7C,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,WAAW,CAA4B;gBAEzB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IAUF,IAAI;IA2BV;;;;;OAKG;YACW,UAAU;IAexB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAKtB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAMtB,oGAAoG;IACpG,OAAO,CAAC,sBAAsB;IAaxB,QAAQ;CAOf"}
@@ -2,9 +2,12 @@ import { resolveConfig, } from '../src/define_config.js';
2
2
  import { DiagnosticsWatcher } from '../src/diagnostics_watcher.js';
3
3
  import { ExtensionRegistry } from '../src/extension/registry.js';
4
4
  import { RedactingTelescopeStore } from '../src/redaction/redacting_store.js';
5
- import { resetTelescopeRuntime, setTelescopeExtensionRegistry, setTelescopeRuntime, } from '../src/registry.js';
5
+ import { resetTelescopeRuntime, setTelescopeEntryEvents, setTelescopeExtensionRegistry, setTelescopeRuntime, } from '../src/registry.js';
6
+ import { SamplingTelescopeStore } from '../src/sampling/sampling_store.js';
6
7
  import { TelescopeService } from '../src/service.js';
7
8
  import { InMemoryTelescopeStore } from '../src/stores/memory.js';
9
+ import { EntryEvents } from '../src/stream/entry_events.js';
10
+ import { StreamingTelescopeStore } from '../src/stream/streaming_store.js';
8
11
  /**
9
12
  * Wires `@adonis-agora/telescope` into the AdonisJS application.
10
13
  *
@@ -25,6 +28,7 @@ export default class TelescopeProvider {
25
28
  app;
26
29
  store = null;
27
30
  diagnosticsWatcher = null;
31
+ entryEvents = null;
28
32
  constructor(app) {
29
33
  this.app = app;
30
34
  }
@@ -39,13 +43,14 @@ export default class TelescopeProvider {
39
43
  }
40
44
  async boot() {
41
45
  const config = resolveConfig(this.app.config.get('telescope', {}));
42
- const store = this.applyRedaction(await this.buildStore(config), config);
46
+ const store = this.applyStreaming(this.applySampling(this.applyRedaction(await this.buildStore(config), config), config), config);
43
47
  this.store = store;
44
48
  if (!config.enabled) {
45
49
  resetTelescopeRuntime();
46
50
  return;
47
51
  }
48
52
  setTelescopeRuntime(store, config.watchers.has('request'));
53
+ setTelescopeEntryEvents(this.entryEvents);
49
54
  if (config.watchers.has('diagnostics')) {
50
55
  const watcher = new DiagnosticsWatcher(store);
51
56
  watcher.start();
@@ -83,6 +88,30 @@ export default class TelescopeProvider {
83
88
  return store;
84
89
  return new RedactingTelescopeStore(store, { keys: config.redact.keys });
85
90
  }
91
+ /**
92
+ * Wrap the store with the tail-sampling decorator so dropped entries are never
93
+ * persisted (and skip redaction work too, since this is the OUTERMOST wrap).
94
+ * Skipped entirely when no `sampling` config was supplied — the empty `{}`
95
+ * config keeps everything, so the decorator is omitted for zero overhead.
96
+ */
97
+ applySampling(store, config) {
98
+ if (Object.keys(config.sampling).length === 0)
99
+ return store;
100
+ return new SamplingTelescopeStore(store, config.sampling);
101
+ }
102
+ /**
103
+ * Wrap the store with the OUTERMOST streaming decorator so each persisted entry
104
+ * — already redacted (inner) and post-sampling (this sees only entries that were
105
+ * stored) — is published to the SSE bus the UI stream route subscribes to.
106
+ * Skipped when `config.stream.enabled` is `false`. The decorator is a no-op while
107
+ * no client is connected, so it stays zero-overhead by default.
108
+ */
109
+ applyStreaming(store, config) {
110
+ if (!config.stream.enabled)
111
+ return store;
112
+ this.entryEvents = new EntryEvents();
113
+ return new StreamingTelescopeStore(store, this.entryEvents);
114
+ }
86
115
  /** Construct the extension registry, giving each extension a context over the store + container. */
87
116
  buildExtensionRegistry(config, store) {
88
117
  if (config.extensions.length === 0)
@@ -97,6 +126,8 @@ export default class TelescopeProvider {
97
126
  async shutdown() {
98
127
  this.diagnosticsWatcher?.stop();
99
128
  this.diagnosticsWatcher = null;
129
+ this.entryEvents?.clear();
130
+ this.entryEvents = null;
100
131
  resetTelescopeRuntime();
101
132
  }
102
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"telescope_provider.js","sourceRoot":"","sources":["../../providers/telescope_provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telescope_provider.js","sourceRoot":"","sources":["../../providers/telescope_provider.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"telescope_ui_provider.d.ts","sourceRoot":"","sources":["../../providers/telescope_ui_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAiB/D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC1B,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,OAAO,CAAC,OAAO;IAMT,IAAI;CA2FX"}
1
+ {"version":3,"file":"telescope_ui_provider.d.ts","sourceRoot":"","sources":["../../providers/telescope_ui_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAkB/D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC1B,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,OAAO,CAAC,OAAO;IAMT,IAAI;CAmLX"}
@@ -1,6 +1,7 @@
1
1
  import { resolveConfig as resolveTelescopeConfig } from '../src/define_config.js';
2
2
  import { getTelescopeRuntime } from '../src/registry.js';
3
3
  import { TelescopeService } from '../src/service.js';
4
+ import { streamEntries } from '../src/stream/stream_handler.js';
4
5
  import { TelescopeApi } from '../src/ui/api.js';
5
6
  import { renderDashboard } from '../src/ui/dashboard.js';
6
7
  import { resolveConfig, } from '../src/ui/define_config.js';
@@ -44,8 +45,19 @@ export default class TelescopeUiProvider {
44
45
  'dashboard routes not registered.');
45
46
  return;
46
47
  }
48
+ const coreConfig = resolveTelescopeConfig(this.app.config.get('telescope', {}));
47
49
  const service = new TelescopeService(store);
48
- const api = new TelescopeApi(service);
50
+ const api = new TelescopeApi(service, {
51
+ ...(coreConfig.nPlusOne.enabled
52
+ ? { nPlusOneThreshold: coreConfig.nPlusOne.threshold }
53
+ : {}),
54
+ },
55
+ // Request replay (additive): off unless the host opts in via telescope_ui config.
56
+ {
57
+ enabled: config.replay.enabled,
58
+ ...(config.replay.port !== undefined ? { port: config.replay.port } : {}),
59
+ ...(config.replay.timeoutMs !== undefined ? { timeoutMs: config.replay.timeoutMs } : {}),
60
+ });
49
61
  const apiBase = `${config.path}/api`;
50
62
  const router = await this.app.container.make('router');
51
63
  const guard = config.authorize;
@@ -87,6 +99,80 @@ export default class TelescopeUiProvider {
87
99
  return api.stats(ctx);
88
100
  })
89
101
  .as('telescope_ui.stats');
102
+ // Request replay (additive): re-issue a captured request from the dashboard.
103
+ // A MUTATION, so it is a POST and is disabled by default (the handler answers
104
+ // 403 unless telescope_ui `replay.enabled` is set) on top of the read guard.
105
+ router
106
+ .post(`${apiBase}/requests/:id/replay`, async (ctx) => {
107
+ if (!(await enforceGuard(ctx, guard)))
108
+ return;
109
+ return api.replayRequest(ctx, String(ctx.params.id));
110
+ })
111
+ .as('telescope_ui.replay');
112
+ // Metrics analytics (stats/timeseries/percentiles/traces/waterfall) + N+1.
113
+ router
114
+ .get(`${apiBase}/metrics/stats`, async (ctx) => {
115
+ if (!(await enforceGuard(ctx, guard)))
116
+ return;
117
+ return api.metricsStats(ctx);
118
+ })
119
+ .as('telescope_ui.metrics_stats');
120
+ router
121
+ .get(`${apiBase}/metrics/timeseries`, async (ctx) => {
122
+ if (!(await enforceGuard(ctx, guard)))
123
+ return;
124
+ return api.metricsTimeseries(ctx);
125
+ })
126
+ .as('telescope_ui.metrics_timeseries');
127
+ router
128
+ .get(`${apiBase}/metrics/traces`, async (ctx) => {
129
+ if (!(await enforceGuard(ctx, guard)))
130
+ return;
131
+ return api.metricsTraces(ctx);
132
+ })
133
+ .as('telescope_ui.metrics_traces');
134
+ router
135
+ .get(`${apiBase}/metrics/waterfall/:traceId`, async (ctx) => {
136
+ if (!(await enforceGuard(ctx, guard)))
137
+ return;
138
+ return api.metricsWaterfall(ctx, String(ctx.params.traceId));
139
+ })
140
+ .as('telescope_ui.metrics_waterfall');
141
+ router
142
+ .get(`${apiBase}/metrics/n-plus-one/:traceId`, async (ctx) => {
143
+ if (!(await enforceGuard(ctx, guard)))
144
+ return;
145
+ return api.metricsNPlusOne(ctx, String(ctx.params.traceId));
146
+ })
147
+ .as('telescope_ui.metrics_n_plus_one');
148
+ // ───────────────────────── SSE live-stream (additive) ─────────────────────────
149
+ // New entries (already redacted + post-sampling) streamed to the dashboard as
150
+ // they arrive. Registered only when the entry-events bus is live (core
151
+ // `config.telescope.stream.enabled !== false`).
152
+ const entryEvents = getTelescopeRuntime().entryEvents;
153
+ if (entryEvents) {
154
+ router
155
+ .get(`${apiBase}/stream`, async (ctx) => {
156
+ if (!(await enforceGuard(ctx, guard)))
157
+ return;
158
+ const raw = ctx.response.response;
159
+ raw.writeHead(200, {
160
+ 'Content-Type': 'text/event-stream',
161
+ 'Cache-Control': 'no-cache, no-transform',
162
+ Connection: 'keep-alive',
163
+ 'X-Accel-Buffering': 'no',
164
+ });
165
+ const sink = {
166
+ write: (chunk) => raw.write(chunk),
167
+ onClose: (handler) => ctx.request.request.on('close', handler),
168
+ };
169
+ const session = streamEntries(entryEvents, sink);
170
+ // Hold the response open: never resolve/return a body. Cleanup runs on
171
+ // the socket 'close' event wired into the sink above.
172
+ ctx.response.response.on('close', () => session.close());
173
+ })
174
+ .as('telescope_ui.stream');
175
+ }
90
176
  // Extension SDK surface (only when at least one extension contributed a registry at boot).
91
177
  const registry = getTelescopeRuntime().registry;
92
178
  if (registry) {
@@ -1 +1 @@
1
- {"version":3,"file":"telescope_ui_provider.js","sourceRoot":"","sources":["../../providers/telescope_ui_provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telescope_ui_provider.js","sourceRoot":"","sources":["../../providers/telescope_ui_provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,IAAI,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAGL,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAChB;IAAtB,YAAsB,GAAuB;QAAvB,QAAG,GAAH,GAAG,CAAoB;IAAG,CAAC;IAEzC,OAAO;QACb,OAAO,aAAa,CAClB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAgC,cAAc,EAAE,SAAS,CAAC,CAC9E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAE5B,IAAI,KAA4B,CAAC;QACjC,IAAI,CAAC;YACH,KAAK,GAAG,mBAAmB,EAAE,CAAC,KAAK,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,+DAA+D,SAAS,CAAC,GAAG,CAAC,EAAE,CAChF,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CACV,4FAA4F;gBAC1F,kCAAkC,CACrC,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,YAAY,CAC1B,OAAO,EACP;YACE,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO;gBAC7B,CAAC,CAAC,EAAE,iBAAiB,EAAE,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE;gBACtD,CAAC,CAAC,EAAE,CAAC;SACR;QACD,kFAAkF;QAClF;YACE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzF,CACF,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;QAE/B,yBAAyB;QACzB,MAAM;aACH,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAkB,EAAE,EAAE;YAC7C,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAChE,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC;aACD,EAAE,CAAC,wBAAwB,CAAC,CAAC;QAEhC,YAAY;QACZ,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,UAAU,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YACvD,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;aACD,EAAE,CAAC,sBAAsB,CAAC,CAAC;QAE9B,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,cAAc,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YAC3D,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC;aACD,EAAE,CAAC,oBAAoB,CAAC,CAAC;QAE5B,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,iBAAiB,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YAC9D,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC;aACD,EAAE,CAAC,oBAAoB,CAAC,CAAC;QAE5B,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,QAAQ,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YACrD,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC;aACD,EAAE,CAAC,oBAAoB,CAAC,CAAC;QAE5B,6EAA6E;QAC7E,8EAA8E;QAC9E,6EAA6E;QAC7E,MAAM;aACH,IAAI,CAAC,GAAG,OAAO,sBAAsB,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YACpE,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC;aACD,EAAE,CAAC,qBAAqB,CAAC,CAAC;QAE7B,2EAA2E;QAC3E,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,gBAAgB,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YAC7D,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC;aACD,EAAE,CAAC,4BAA4B,CAAC,CAAC;QAEpC,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,qBAAqB,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YAClE,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC;aACD,EAAE,CAAC,iCAAiC,CAAC,CAAC;QAEzC,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,iBAAiB,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YAC9D,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC;aACD,EAAE,CAAC,6BAA6B,CAAC,CAAC;QAErC,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,6BAA6B,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YAC1E,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC;aACD,EAAE,CAAC,gCAAgC,CAAC,CAAC;QAExC,MAAM;aACH,GAAG,CAAC,GAAG,OAAO,8BAA8B,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;YAC3E,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YAC9C,OAAO,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC;aACD,EAAE,CAAC,iCAAiC,CAAC,CAAC;QAEzC,iFAAiF;QACjF,8EAA8E;QAC9E,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC,WAAW,CAAC;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM;iBACH,GAAG,CAAC,GAAG,OAAO,SAAS,EAAE,KAAK,EAAE,GAAkB,EAAE,EAAE;gBACrD,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAAE,OAAO;gBAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAClC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,cAAc,EAAE,mBAAmB;oBACnC,eAAe,EAAE,wBAAwB;oBACzC,UAAU,EAAE,YAAY;oBACxB,mBAAmB,EAAE,IAAI;iBAC1B,CAAC,CAAC;gBACH,MAAM,IAAI,GAAY;oBACpB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;oBAClC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;iBAC/D,CAAC;gBACF,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACjD,uEAAuE;gBACvE,sDAAsD;gBACtD,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3D,CAAC,CAAC;iBACD,EAAE,CAAC,qBAAqB,CAAC,CAAC;QAC/B,CAAC;QAED,2FAA2F;QAC3F,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC,QAAQ,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAqB;gBAC/B,KAAK;gBACL,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAc,CAAC,EAAE;gBACvE,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;aACrE,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAElD,MAAM;iBACH,GAAG,CAAC,GAAG,OAAO,OAAO,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;gBACpD,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAAE,OAAO;gBAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC,CAAC;iBACD,EAAE,CAAC,mBAAmB,CAAC,CAAC;YAE3B,MAAM;iBACH,GAAG,CAAC,GAAG,OAAO,0BAA0B,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;gBACvE,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAAE,OAAO;gBAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/E,CAAC,CAAC;iBACD,EAAE,CAAC,uBAAuB,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF;AAyBD,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -18,6 +18,17 @@ export default class TelescopeWatchersProvider {
18
18
  /** Read the watchers config from its own file or the telescope config block. */
19
19
  private resolve;
20
20
  boot(): Promise<void>;
21
+ /** Start the queue watcher: it taps the engine's `node:diagnostics_channel`
22
+ * trace, so it needs no emitter and no container resolution. A no-op (nothing
23
+ * publishes) when `@adonisjs/queue` is absent. */
24
+ private startQueueWatcher;
25
+ /** Start the events watcher: it taps the core Emitter via `onAny`. Degrades to a
26
+ * no-op when the emitter has no `onAny`. */
27
+ private startEventsWatcher;
28
+ /** Start the redis watcher: it instruments the OPTIONAL `@adonisjs/redis`
29
+ * manager resolved from the container. A missing peer / binding degrades to a
30
+ * no-op (the watcher itself no-ops on a null manager). */
31
+ private startRedisWatcher;
21
32
  /** Start the http-client watcher: it patches the global `fetch`, so it needs
22
33
  * no emitter and no container resolution. */
23
34
  private startHttpClientWatcher;
@@ -1 +1 @@
1
- {"version":3,"file":"telescope_watchers_provider.d.ts","sourceRoot":"","sources":["../../providers/telescope_watchers_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAqB/D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGhC,SAAS,CAAC,GAAG,EAAE,kBAAkB;IAF7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;gBAE3C,GAAG,EAAE,kBAAkB;IAE7C,gFAAgF;IAChF,OAAO,CAAC,OAAO;IAeT,IAAI;IAoBV;kDAC8C;IAC9C,OAAO,CAAC,sBAAsB;IAW9B;mFAC+E;YACjE,gBAAgB;IAmB9B,uEAAuE;IACvE,OAAO,CAAC,YAAY;IAYd,QAAQ;CAUf"}
1
+ {"version":3,"file":"telescope_watchers_provider.d.ts","sourceRoot":"","sources":["../../providers/telescope_watchers_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA6B/D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGhC,SAAS,CAAC,GAAG,EAAE,kBAAkB;IAF7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;gBAE3C,GAAG,EAAE,kBAAkB;IAE7C,gFAAgF;IAChF,OAAO,CAAC,OAAO;IAeT,IAAI;IAuBV;;uDAEmD;IACnD,OAAO,CAAC,iBAAiB;IAWzB;iDAC6C;IAC7C,OAAO,CAAC,kBAAkB;IAW1B;;+DAE2D;YAC7C,iBAAiB;IAkB/B;kDAC8C;IAC9C,OAAO,CAAC,sBAAsB;IAW9B;mFAC+E;YACjE,gBAAgB;IAmB9B,uEAAuE;IACvE,OAAO,CAAC,YAAY;IAYd,QAAQ;CAUf"}
@@ -1,9 +1,12 @@
1
1
  import { CacheWatcher } from '../src/watchers/cache_watcher.js';
2
2
  import { resolveConfig, } from '../src/watchers/define_config.js';
3
+ import { EventsWatcher } from '../src/watchers/events_watcher.js';
3
4
  import { HttpClientWatcher } from '../src/watchers/http_client_watcher.js';
4
5
  import { LogsWatcher } from '../src/watchers/logs_watcher.js';
5
6
  import { LucidQueryWatcher } from '../src/watchers/lucid_query_watcher.js';
6
7
  import { MailWatcher } from '../src/watchers/mail_watcher.js';
8
+ import { QueueWatcher } from '../src/watchers/queue_watcher.js';
9
+ import { RedisWatcher } from '../src/watchers/redis_watcher.js';
7
10
  /**
8
11
  * Wires `@adonis-agora/telescope/watchers` into the AdonisJS application.
9
12
  *
@@ -54,6 +57,61 @@ export default class TelescopeWatchersProvider {
54
57
  this.startHttpClientWatcher();
55
58
  if (config.watchers.has('logs'))
56
59
  await this.startLogsWatcher();
60
+ if (config.watchers.has('queue'))
61
+ this.startQueueWatcher();
62
+ if (config.watchers.has('events'))
63
+ this.startEventsWatcher(emitter);
64
+ if (config.watchers.has('redis'))
65
+ await this.startRedisWatcher();
66
+ }
67
+ /** Start the queue watcher: it taps the engine's `node:diagnostics_channel`
68
+ * trace, so it needs no emitter and no container resolution. A no-op (nothing
69
+ * publishes) when `@adonisjs/queue` is absent. */
70
+ startQueueWatcher() {
71
+ const watcher = new QueueWatcher();
72
+ try {
73
+ watcher.start();
74
+ this.started.push(watcher);
75
+ }
76
+ catch (err) {
77
+ const message = err instanceof Error ? err.message : String(err);
78
+ console.error(`TelescopeWatchersProvider: failed to start queue watcher: ${message}`);
79
+ }
80
+ }
81
+ /** Start the events watcher: it taps the core Emitter via `onAny`. Degrades to a
82
+ * no-op when the emitter has no `onAny`. */
83
+ startEventsWatcher(emitter) {
84
+ const watcher = new EventsWatcher();
85
+ try {
86
+ watcher.start(emitter);
87
+ this.started.push(watcher);
88
+ }
89
+ catch (err) {
90
+ const message = err instanceof Error ? err.message : String(err);
91
+ console.error(`TelescopeWatchersProvider: failed to start events watcher: ${message}`);
92
+ }
93
+ }
94
+ /** Start the redis watcher: it instruments the OPTIONAL `@adonisjs/redis`
95
+ * manager resolved from the container. A missing peer / binding degrades to a
96
+ * no-op (the watcher itself no-ops on a null manager). */
97
+ async startRedisWatcher() {
98
+ let manager = null;
99
+ try {
100
+ manager = await this.app.container.make('redis');
101
+ }
102
+ catch {
103
+ // @adonisjs/redis not installed / not bound — the watcher no-ops on null.
104
+ manager = null;
105
+ }
106
+ const watcher = new RedisWatcher(manager);
107
+ try {
108
+ watcher.start();
109
+ this.started.push(watcher);
110
+ }
111
+ catch (err) {
112
+ const message = err instanceof Error ? err.message : String(err);
113
+ console.error(`TelescopeWatchersProvider: failed to start redis watcher: ${message}`);
114
+ }
57
115
  }
58
116
  /** Start the http-client watcher: it patches the global `fetch`, so it needs
59
117
  * no emitter and no container resolution. */
@@ -1 +1 @@
1
- {"version":3,"file":"telescope_watchers_provider.js","sourceRoot":"","sources":["../../providers/telescope_watchers_provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telescope_watchers_provider.js","sourceRoot":"","sources":["../../providers/telescope_watchers_provider.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { TelescopeExtension } from './extension/types.js';
2
+ import { type SamplingConfig } from './sampling/sampling.js';
2
3
  import type { TelescopeStore } from './store.js';
3
4
  import { type StoreProvider, storage } from './stores/factory.js';
4
5
  /**
@@ -71,6 +72,44 @@ export interface TelescopeConfig {
71
72
  * additional keys.
72
73
  */
73
74
  redact?: RedactConfig;
75
+ /**
76
+ * Tail-sampling applied on the WRITE path: a dropped entry is never persisted.
77
+ * Three forms are accepted:
78
+ *
79
+ * - a **bare number** (0–1) — a uniform keep-rate applied to every entry type
80
+ * via the reserved `default` key (e.g. `sampling: 0.1` keeps 10%);
81
+ * - a **{@link SamplingConfig}** — per-type rates, each either a bare rate or a
82
+ * `{ rate, keepErrors?, keepSlowMs? }` rule (tail-sampling: keep a fraction
83
+ * but always retain errors / slow entries), with a reserved `default` rule;
84
+ * - omitted — record everything (rate 1), so behavior is unchanged when unset.
85
+ */
86
+ sampling?: number | SamplingConfig;
87
+ /**
88
+ * N+1 query-loop detection thresholds (read-only analysis over stored entries).
89
+ * `threshold` is the minimum repetitions of one query template within a trace
90
+ * to flag a loop (default 3). Set `enabled: false` to disable detection.
91
+ */
92
+ nPlusOne?: NPlusOneConfig;
93
+ /**
94
+ * Live SSE streaming of newly-stored entries to the dashboard. When enabled
95
+ * (the default), the write path publishes each persisted entry — already
96
+ * redacted and post-sampling — to an in-process bus the `<path>/api/stream`
97
+ * route streams over Server-Sent Events. Zero overhead while no client is
98
+ * connected. Set `stream: { enabled: false }` to turn it off entirely.
99
+ */
100
+ stream?: StreamConfig;
101
+ }
102
+ /** N+1 detection configuration (see {@link TelescopeConfig.nPlusOne}). */
103
+ export interface NPlusOneConfig {
104
+ /** Master switch for N+1 detection. Default `true`. */
105
+ enabled?: boolean;
106
+ /** Minimum repetitions of one query template within a trace to flag a loop. Default 3. */
107
+ threshold?: number;
108
+ }
109
+ /** Live-stream configuration (see {@link TelescopeConfig.stream}). */
110
+ export interface StreamConfig {
111
+ /** Master switch for the SSE live-stream of entries. Default `true`. */
112
+ enabled?: boolean;
74
113
  }
75
114
  /** The fully-resolved config the provider acts on (no optionals). */
76
115
  export interface ResolvedTelescopeConfig {
@@ -84,6 +123,17 @@ export interface ResolvedTelescopeConfig {
84
123
  enabled: boolean;
85
124
  keys: string[];
86
125
  };
126
+ /** Normalized per-type sampling config; empty `{}` means record everything. */
127
+ sampling: SamplingConfig;
128
+ /** Resolved N+1 detection settings. */
129
+ nPlusOne: {
130
+ enabled: boolean;
131
+ threshold: number;
132
+ };
133
+ /** Resolved live-stream settings. */
134
+ stream: {
135
+ enabled: boolean;
136
+ };
87
137
  }
88
138
  /**
89
139
  * Identity helper giving `config/telescope.ts` full type-checking. Mirrors the
@@ -1 +1 @@
1
- {"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAElE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAEhC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IAEzB;;;OAGG;IACH,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAElC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,qEAAqE;AACrE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAErE;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,MAAM,GAAE,eAAoB,GAAG,uBAAuB,CAcnF;AAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAElE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAEhC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IAEzB;;;OAGG;IACH,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAElC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qEAAqE;AACrE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7C,+EAA+E;IAC/E,QAAQ,EAAE,cAAc,CAAC;IACzB,uCAAuC;IACvC,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,qCAAqC;IACrC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAErE;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,MAAM,GAAE,eAAoB,GAAG,uBAAuB,CAsBnF;AAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,qBAAqB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { resolveSampling } from './sampling/sampling.js';
1
2
  import { storage } from './stores/factory.js';
2
3
  /**
3
4
  * Identity helper giving `config/telescope.ts` full type-checking. Mirrors the
@@ -32,6 +33,14 @@ export function resolveConfig(config = {}) {
32
33
  enabled: config.redact?.enabled ?? true,
33
34
  keys: config.redact?.keys ?? [],
34
35
  },
36
+ sampling: resolveSampling(config.sampling),
37
+ nPlusOne: {
38
+ enabled: config.nPlusOne?.enabled ?? true,
39
+ threshold: config.nPlusOne?.threshold ?? 3,
40
+ },
41
+ stream: {
42
+ enabled: config.stream?.enabled ?? true,
43
+ },
35
44
  };
36
45
  }
37
46
  export { storage };
@@ -1 +1 @@
1
- {"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA6FlE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,SAA0B,EAAE;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC/D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACrC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QACnC,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;YACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE;SAChC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9E,OAAO,EAAsB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA8IlE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,SAA0B,EAAE;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC/D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACrC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QACnC,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;YACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE;SAChC;QACD,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1C,QAAQ,EAAE;YACR,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI;YACzC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC;SAC3C;QACD,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI;SACxC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -23,11 +23,32 @@ export { defineTelescopeExtension } from './extension/types.js';
23
23
  export type { Column, ContainerLike, DashboardSection, DashboardSpec, DataBinding, DataProvider, ExtensionContext, ExtensionEntryType, LinkSpec, Panel, PanelThresholds, TelescopeExtension, } from './extension/types.js';
24
24
  export { ExtensionRegistry } from './extension/registry.js';
25
25
  export { defineConfig, resolveConfig } from './define_config.js';
26
- export type { RedactConfig, ResolvedTelescopeConfig, TelescopeConfig, WatcherName, } from './define_config.js';
26
+ export type { NPlusOneConfig, RedactConfig, ResolvedTelescopeConfig, StreamConfig, TelescopeConfig, WatcherName, } from './define_config.js';
27
+ export { EntryEvents } from './stream/entry_events.js';
28
+ export type { EntrySubscriber, Unsubscribe } from './stream/entry_events.js';
29
+ export { StreamingTelescopeStore } from './stream/streaming_store.js';
30
+ export { DEFAULT_HEARTBEAT_MS, streamEntries } from './stream/stream_handler.js';
31
+ export type { StreamOptions, StreamSession } from './stream/stream_handler.js';
32
+ export { isErrorEntry, passesSampling, resolveSampling, samplingRates, } from './sampling/sampling.js';
33
+ export type { SamplingConfig, SamplingRule } from './sampling/sampling.js';
34
+ export { SamplingTelescopeStore } from './sampling/sampling_store.js';
35
+ export { detectNPlusOne, detectNPlusOnePatterns } from './query/n_plus_one.js';
36
+ export type { NPlusOneInsight, NPlusOnePattern, NPlusOnePatternOptions, } from './query/n_plus_one.js';
37
+ export { MetricsService } from './metrics/metrics_service.js';
38
+ export type { MetricsServiceOptions, StatsQuery, TimeseriesQuery, } from './metrics/metrics_service.js';
39
+ export { estimateLatencyPercentiles, percentile, summarizeStats, } from './metrics/stats.js';
40
+ export type { CacheStats, ExceptionGroupStats, FamilyLatency, LatencyPercentilesOverride, LatencyStats, StatsResult, StatusBreakdown, SummarizeStatsInput, } from './metrics/stats.js';
41
+ export { bucketTimeseries } from './metrics/timeseries.js';
42
+ export type { TimeseriesBucket, TimeseriesReport } from './metrics/timeseries.js';
43
+ export { summarizeTraces } from './metrics/traces.js';
44
+ export type { SummarizeTracesOptions, TraceSummary } from './metrics/traces.js';
45
+ export { buildWaterfall } from './metrics/waterfall.js';
46
+ export type { Waterfall, WaterfallSpan } from './metrics/waterfall.js';
47
+ export { buildHistogram, emptyHistogram, estimatePercentileFromHistogram, HISTOGRAM_BUCKET_COUNT, histogramBucketIndex, incrementHistogram, LATENCY_BOUNDARIES_MS, mergeHistograms, normalizeHistogram, ROLLUP_BUCKET_MS, } from './metrics/rollup.js';
27
48
  export { compileRedactSpec, DEFAULT_MASK, DEFAULT_REDACT_KEYS, redact, redactBounded, redactBoundedWith, } from './redaction/redact.js';
28
49
  export type { CompiledRedactSpec, RedactBoundedResult, RedactOptions, } from './redaction/redact.js';
29
50
  export { RedactingTelescopeStore } from './redaction/redacting_store.js';
30
- export { getTelescopeRuntime, resetTelescopeRuntime, setTelescopeExtensionRegistry, setTelescopeRuntime, } from './registry.js';
51
+ export { getTelescopeRuntime, resetTelescopeRuntime, setTelescopeEntryEvents, setTelescopeExtensionRegistry, setTelescopeRuntime, } from './registry.js';
31
52
  export type { TelescopeRuntime } from './registry.js';
32
53
  export { currentTraceId, getContextAccessor } from './context_accessor.js';
33
54
  export type { ContextAccessor } from './context_accessor.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}