Skip to content

Releases: DavideCarvalho/nestjs-telescope

@dudousxd/nestjs-telescope@1.12.0

20 Jun 12:28
51dee17

Choose a tag to compare

Minor Changes

  • 0d1f7ae - Add observability export seams used by @dudousxd/nestjs-telescope-otel. The Recorder gains a best-effort onRecorded(input) hook fired at the top of record() — before pause/sampling — so a metrics consumer gets complete counts even under overload. The TelescopeExtension SPI gains optional observeRecord(input) / observeFlush(entries) hooks, and ExtensionRegistry fans every record and every stored flush out to them (notifyRecord / notifyFlush), each isolated so a misbehaving observer can never break capture or the flush. Existing behavior is unchanged when no extension uses the hooks.

@dudousxd/nestjs-telescope-otel@1.13.0

20 Jun 19:24
98e459d

Choose a tag to compare

Minor Changes

  • 5fd5b30 - Capture MikroORM flush/transaction lifecycle and export duration histograms.

    • @dudousxd/nestjs-telescope-mikro-orm-watcher: the model watcher now also records flush ({ kind: 'flush' }) and transaction ({ kind: 'transaction', outcome }) entries with a measured durationMs, in addition to entity create/update/delete (now tagged { kind: 'entity' }). Timing is keyed per-EntityManager via a WeakMap, so concurrent flushes from different forked EMs never share a start slot.
    • @dudousxd/nestjs-telescope-otel: mapInput now emits telescope_mikroorm_flush_total + telescope_mikroorm_flush_duration_ms, telescope_mikroorm_transaction_total{outcome} + telescope_mikroorm_transaction_duration_ms, and — when a diagnostic entry carries a durationMs — a telescope_diagnostic_duration_ms{lib,event} histogram alongside the existing telescope_diagnostic_total counter. This lets MikroORM flush/transaction timing and duration-bearing diagnostics events become Grafana-queryable histogram_quantile metrics.

@dudousxd/nestjs-telescope-otel@1.12.0

20 Jun 12:28
51dee17

Choose a tag to compare

Minor Changes

  • 0d1f7ae - Export everything Telescope records to OpenTelemetry/Grafana. TelescopeOtelExporter (a TelescopeExtension) pushes complete metrics (counted pre-sampling) into the OTel Meter for OTLP and a dependency-free Prometheus /metrics scrape (TelescopeOtelMetricsModule.forExporter), and sampled spans into the OTel Tracer. Durations export as real Prometheus histograms (_bucket{le} + _sum/_count) with boundaries aligned to the OTel Meter, so histogram_quantile works in Grafana. Metric cardinality is bounded per metric (maxSeriesPerMetric, default 2000) with a visible telescope_metrics_dropped_series_total{metric} instead of unbounded growth. @nestjs/common and @nestjs/core are optional peers (only the /metrics module needs them; the exporter itself is NestJS-free).

@dudousxd/nestjs-telescope-mikro-orm-watcher@1.12.0

20 Jun 19:24
98e459d

Choose a tag to compare

Minor Changes

  • 5fd5b30 - Capture MikroORM flush/transaction lifecycle and export duration histograms.

    • @dudousxd/nestjs-telescope-mikro-orm-watcher: the model watcher now also records flush ({ kind: 'flush' }) and transaction ({ kind: 'transaction', outcome }) entries with a measured durationMs, in addition to entity create/update/delete (now tagged { kind: 'entity' }). Timing is keyed per-EntityManager via a WeakMap, so concurrent flushes from different forked EMs never share a start slot.
    • @dudousxd/nestjs-telescope-otel: mapInput now emits telescope_mikroorm_flush_total + telescope_mikroorm_flush_duration_ms, telescope_mikroorm_transaction_total{outcome} + telescope_mikroorm_transaction_duration_ms, and — when a diagnostic entry carries a durationMs — a telescope_diagnostic_duration_ms{lib,event} histogram alongside the existing telescope_diagnostic_total counter. This lets MikroORM flush/transaction timing and duration-bearing diagnostics events become Grafana-queryable histogram_quantile metrics.

@dudousxd/nestjs-telescope@1.11.2

19 Jun 19:46
1a8c7ce

Choose a tag to compare

Patch Changes

  • ba64ffb - Fix (redis): make rollup merges atomic via a per-bucket Lua script (HINCRBY count/sum/histogram cells + max CAS + ZADD), removing the read-modify-write race that could drop concurrent rollup writes; readHistogram still merges any legacy JSON blob.

    Fix (mikro-orm): honor empty-string entry-query filters (switched truthy checks to !== undefined for type/familyHash/batchId/tag), matching the in-memory/sqlite/redis providers.

    Internal refactors (behavior-preserving): drive jobAction off an ACTION_METHOD dispatch map, extract a module-level parseWindowMs (deduping 5 identical parsers), and move the request-replay subsystem out of the controller into nest/request-replay.ts.

@dudousxd/nestjs-telescope-ui@1.12.0

19 Jun 23:34
ef357dc

Choose a tag to compare

Minor Changes

  • 74a6563 - Surface the Inertia v3 render metadata in the entry detail UI: new Prepend and Rescued prop rows, a Once cache section (cache key → prop, with expiry), a Scroll section showing the infinite-scroll cursor (prev ← current → next, reset), and except-once chips on the partial-reload panel. All fields are read defensively, so older diagnostic payloads still render.

@dudousxd/nestjs-telescope-redis@1.11.1

19 Jun 19:46
1a8c7ce

Choose a tag to compare

Patch Changes

  • ba64ffb - Fix (redis): make rollup merges atomic via a per-bucket Lua script (HINCRBY count/sum/histogram cells + max CAS + ZADD), removing the read-modify-write race that could drop concurrent rollup writes; readHistogram still merges any legacy JSON blob.

    Fix (mikro-orm): honor empty-string entry-query filters (switched truthy checks to !== undefined for type/familyHash/batchId/tag), matching the in-memory/sqlite/redis providers.

    Internal refactors (behavior-preserving): drive jobAction off an ACTION_METHOD dispatch map, extract a module-level parseWindowMs (deduping 5 identical parsers), and move the request-replay subsystem out of the controller into nest/request-replay.ts.

@dudousxd/nestjs-telescope-mikro-orm@1.11.1

19 Jun 19:46
1a8c7ce

Choose a tag to compare

Patch Changes

  • ba64ffb - Fix (redis): make rollup merges atomic via a per-bucket Lua script (HINCRBY count/sum/histogram cells + max CAS + ZADD), removing the read-modify-write race that could drop concurrent rollup writes; readHistogram still merges any legacy JSON blob.

    Fix (mikro-orm): honor empty-string entry-query filters (switched truthy checks to !== undefined for type/familyHash/batchId/tag), matching the in-memory/sqlite/redis providers.

    Internal refactors (behavior-preserving): drive jobAction off an ACTION_METHOD dispatch map, extract a module-level parseWindowMs (deduping 5 identical parsers), and move the request-replay subsystem out of the controller into nest/request-replay.ts.

@dudousxd/nestjs-telescope@1.11.1

18 Jun 18:12
5289a93

Choose a tag to compare

Patch Changes

  • 82280c8 - perf: runTaggers fast-paths the no-taggers case (the common high-volume path), skipping the Set + result array + closure allocation while preserving the existing tag de-dup semantics.

@dudousxd/nestjs-telescope@1.11.0

18 Jun 15:40
e77a12f

Choose a tag to compare

Minor Changes

  • #17 76228a3 Thanks @DavideCarvalho! - On-demand CPU flamegraph profiling. A new strictly-opt-in profiling option
    (OFF by default) captures V8 CPU profiles around sampled or manually-triggered
    requests via Node's inspector, aggregates them into a self/total frame tree,
    and persists them as cpu_profile entries correlated to their request batch.
    The dashboard gains a Profiles tab with a dependency-light flamegraph renderer,
    a hot-functions table, and an "arm next N requests" trigger. New headless API
    routes: GET /profiles, GET /profiles/:id, GET /profiles/status, and
    POST /profiles/arm (gated by the default-deny mutation guard). When profiling
    is disabled there is ZERO inspector usage and no request-path cost beyond a
    single boolean check.

  • #17 76228a3 Thanks @DavideCarvalho! - Ecosystem improvements across the telescope packages.

    • Nested trace / batch waterfall view. Traces and batches now render as a
      nested waterfall, showing child spans nested under their parents with relative
      offsets and durations so the critical path of a request is visible at a glance.
    • Pulse-style outlier & rollup cards. New overview cards surface the slowest
      endpoints, slowest queries, slowest jobs, and slowest outbound calls, plus
      load-by-user and CPU/memory history, in the spirit of Laravel Pulse rollups.
    • Metric-threshold alert rules. Alerts can now fire on metric thresholds
      (p95 / p99 latency, cache-hit ratio) in addition to existing rules, with
      shared-storage exception deduplication so the same exception is not alerted
      multiple times across replicas.
    • Improved N+1 detection. Detection now recognizes the 1+N loop pattern and
      is duration-weighted, reducing false positives and prioritizing the queries
      that actually cost time.
    • On-demand CPU flamegraph profiling. A strictly-opt-in profiling option
      (OFF by default) captures V8 CPU profiles via Node's inspector, aggregates
      them into a self/total frame tree, and persists them as cpu_profile entries
      correlated to their request batch. The dashboard gains a Profiles tab with a
      dependency-light flamegraph renderer, a hot-functions table, and an
      "arm next N requests" trigger. When profiling is disabled there is zero
      inspector usage and no request-path cost beyond a single boolean check.
    • TelescopeUiModule.forRootAsync. The UI module now mirrors
      TelescopeModule.forRootAsync, resolving dashboard options via DI.
    • Realtime dashboards / SSE live-tail. Dashboards update in realtime over an
      @Sse invalidation stream (falling back to polling) with a LIVE indicator.
    • Packaging hygiene. sideEffects is now declared on each publishable
      package to enable safe tree-shaking for downstream bundlers.
    • Independent versioning. The changeset fixed group was removed so packages
      version independently going forward.
  • #15 ba7790b Thanks @DavideCarvalho! - Rich extension dashboards: the panel IR gains delta/sparkline/threshold on stat
    and new distribution, gauge, and breakdown panel kinds, plus a sections
    layout. Dashboards update in realtime over a new @Sse invalidation stream
    (falling back to polling), with a LIVE indicator. Fully backward compatible —
    existing extensions and flat stat panels render unchanged.