Skip to content

Releases: railspulse-org/rails_pulse

v0.3.3

Choose a tag to compare

@railspulse-old railspulse-old released this 23 Jun 09:25

Release v0.3.3

Bug Fixes

  • Dashboard "Throughput & Errors" chart now includes 4xx errors — Client errors (400–499) were previously excluded from the Errors series; they are now counted alongside 5xx errors, giving a more complete picture of request failures.
  • Chart X-axis no longer shows duplicate timestamps — When switching time ranges or zooming, the X-axis could render the same time label more than once; this is now deduplicated.
  • Chart tooltips no longer show null for empty periods — Periods with no recorded data now display 0 in tooltips rather than a blank or null value.
  • Chart tooltips format large numbers with thousands separators — Values such as 1234567 now display as 1,234,567, improving readability for high-traffic apps.
  • PostgreSQL aborted-transaction handling in tracker — When a PostgreSQL connection was left in an error state mid-transaction, the tracker would fail silently. It now detects PQTRANS_INERROR and issues a rollback before attempting to persist tracking data.
  • Time change handling in test environments — The tracker and chart concern now correctly handle cases where Time.current changes mid-request during tests (e.g. when using travel_to), preventing flaky test failures.

Improvements

  • Operation suggestions consolidated — The five separate suggestion service classes (SqlSuggestionsService, ViewSuggestionsService, etc.) have been merged into a single RailsPulse::OperationSuggestions class, reducing complexity without changing the suggestions shown to users.
  • Chart/table concern refactoredChartTableConcern internals reorganised for clarity and to support upcoming chart features; no change to dashboard behaviour.

Breaking Changes

  • None

Upgrade Notes

  • No database migrations in this release. No upgrade generator run is required.

V0.3.3.pre.4

V0.3.3.pre.4 Pre-release
Pre-release

Choose a tag to compare

@railspulse-old railspulse-old released this 01 Jun 04:30

Release v0.3.3.pre.4

New Features

  • None

Improvements

  • Automated changelog enforcement — A new changelog CI job now runs on every pull request and fails if the [Unreleased] section of CHANGELOG.md is empty, ensuring contributors document their changes before merging (#161)
  • Release script changelog gatebin/release now checks the [Unreleased] section before proceeding and prompts the author to open the editor if it is empty, with an option to abort rather than ship an undocumented release

Bug Fixes

  • None

Breaking Changes

  • None

Upgrade Notes

  • Run rails generate rails_pulse:upgrade after updating

v0.3.3.pre.2

v0.3.3.pre.2 Pre-release
Pre-release

Choose a tag to compare

@railspulse-old railspulse-old released this 31 May 02:46

Release v0.3.3.pre.2

New Features

  • Response size on request detail pages — The request show page and index table now display response body size in a human-readable format (e.g. 12.4 KB). Previously this field was captured but not surfaced in the UI.
  • JavaScript test suite — Stimulus controllers now have a full unit test suite powered by Vitest + JSDOM, covering 12 controllers including chart_switcher, collapsible, time_range, custom_range, and more.
  • Migration pathway tests — A new upgrade_migration_test.rb validates that both fresh installs and upgrades from v0.2.7 and v0.3.1 produce a correct, consistent schema, preventing silent migration regressions.

Improvements

  • Index query refactor — Routes, Queries, and Jobs index classes now share a common Tables::Base superclass, eliminating significant duplication in tag filtering, sort handling, and aggregation logic.
  • Data saving reliability — Simplified how Route, Operation, and JobRun records are persisted, reducing unnecessary complexity in the tracker and job run collector paths.
  • Dependency updates — Bumped gem dependencies across Rails 7.2, 8.0, and 8.1 gemfile lockfiles; updated npm packages including ESLint configuration.

Bug Fixes

  • Bulk insert failures — Fixed broken bulk inserts caused by cache_hit being non-nullable on the operations table. Added a migration to make the column nullable (cache hit is unknown for non-cacheable requests, not false).
  • Standalone server crashes — Fixed a NoMethodError when running Rails Pulse as a standalone server against a Rails 8.1 app. Rails 8.1 added session.enabled? to ActionDispatch::Flash, but Rack's SessionHash didn't implement it; a compatibility shim now bridges the gap.
  • Missing upgrade migration — The create_rails_pulse_job_runs incremental migration was absent from db/rails_pulse_migrate/, meaning users running rails generate rails_pulse:upgrade would not get the job runs table. Now included.

Breaking Changes

  • None

Upgrade Notes

  • Run rails generate rails_pulse:upgrade after updating to apply two new incremental migrations:
    • 20260517000001_create_rails_pulse_job_runs — creates the job runs table if it doesn't exist
    • 20260528000001_make_cache_hit_on_operations_nullable — makes cache_hit nullable on rails_pulse_operations (required to fix bulk insert failures)

0.3.3.pre.1

0.3.3.pre.1 Pre-release
Pre-release

Choose a tag to compare

@railspulse-old railspulse-old released this 17 May 13:29

Release v0.3.3.pre.1

Improvements

  • Significant reduction in database round-trips when recording operations. SQL operations are now bulk-inserted via insert_all! rather than one INSERT per operation. SQL normalization is performed once per unique query (not once per execution), and Query records are resolved with a single SELECT plus one insert_all for any missing entries — previously this was N individual create_or_find_by calls. High-traffic requests with many repeated queries (classic N+1 patterns) will see the largest gains.

  • Lower memory usage in summary aggregation. SummaryService now uses pluck to fetch only the columns needed for statistics (route_id, duration, status, etc.) instead of loading full ActiveRecord objects. This significantly reduces memory pressure during hourly/daily summary jobs on large datasets.

  • Fixed SQL normalization of IN clauses containing nested parentheses. The normalize_in_clauses method was rewritten using paren-depth tracking instead of a flat regex. The previous implementation stopped at the first ) it encountered, which broke queries containing subqueries with nested function calls or clauses (e.g., IN (SELECT id FROM ... HAVING COUNT(*) > 1)).

  • Row count now captured for SQL operations. The operation subscriber records row_count from ActiveRecord's notification payload for SQL events, making this data available for future analysis features.

  • async declared as an explicit runtime dependency. The async gem (used for non-blocking request tracking) is now listed in the gemspec rather than relying on it being available transitively.

Bug Fixes

  • None

Breaking Changes

  • None

Upgrade Notes

  • Run rails generate rails_pulse:upgrade after updating (no schema changes in this release, but the generator is safe to run as a no-op).

v0.3.2

Choose a tag to compare

@railspulse-old railspulse-old released this 12 May 10:24

Release v0.3.2

New Features

  • Deployment tracking — Record deployments via POST /rails_pulse/deployments (with token auth) or rake rails_pulse:record_deployment[sha]. Deployments appear as vertical marker lines on performance charts so you can correlate releases with regressions
  • deployment_api_token config option — Secure the deployments endpoint for CI/CD pipelines (set in config/initializers/rails_pulse.rb)

Improvements

  • Native ECharts time axis — All multi-series charts now use [timestamp_ms, value] pairs instead of separate labels arrays, enabling deployment markers and smoother zoom/pan behaviour
  • Timezone-aware x-axis labels — Charts with ≤25 hour ranges show HH:MM format; longer ranges show full dates
  • actual_sql migration — Operations now store the full, unparameterized SQL string in a dedicated actual_sql column (backfilled from label for existing records), improving query normalization and N+1 detection accuracy
  • N+1 detection via query_id — N+1 detection now matches on query_id (normalized SQL) instead of fragile LIKE patterns on the first 3 words of the label
  • SQL analysis fallback chain — Analysis services now prefer actual_sql, then fall back to query.normalized_sql, then label
  • Label truncation — Operation labels are now truncated to 255 characters to prevent MySQL index-size errors
  • Error count accuracy — Summary service now counts 5xx statuses as errors (was 4xx), aligning with standard practice; 4xx client errors are now correctly tracked separately
  • Authentication config clarity — The authentication_enabled warning only fires when the user explicitly sets it to true without configuring a method, not when the production default kicks in

Bug Fixes

  • Missing migration fix — Fixed a deploy-time error where the install generator would fail on fresh setups (PR #144)

Breaking Changes

  • Summary service error counting — The error_count field now counts only 5xx responses (was ≥400). 4xx responses continue to be tracked in status_4xx. If your dashboards or alerts rely on error_count, verify the threshold doesn't need updating
  • Queries::Charts::AverageQueryTimes removed — Superseded by Queries::Charts::DatabaseLoad

Upgrade Notes

  • Run rails generate rails_pulse:upgrade after updating to apply migrations (adds rails_pulse_deployments table and actual_sql column to rails_pulse_operations)

v0.3.1

Choose a tag to compare

@railspulse-old railspulse-old released this 06 May 06:16

Release v0.3.1

New Features

  • None

Improvements

  • Eager loading on request detail page: Operations and their associated queries are now eager-loaded when viewing an individual request, eliminating N+1 queries on the request show page (#121)

Bug Fixes

  • Fixed broken install generator schema template: The rails_pulse_schema.rb generator template was missing several columns added in recent releases. Fresh installs will now correctly create all columns including response_size_bytes on requests, row_count/cache_hit/repeated_query_group/repetition_count on operations, and a database index on the summarizable polymorphic association (#125)
  • Fixed logger initialization crash: RailsPulse.logger now safely falls back to $stdout when Rails.logger is unavailable (e.g. during early boot or in non-Rails contexts), preventing NoMethodError on startup (#126)

Breaking Changes

  • None

Upgrade Notes

  • If you installed Rails Pulse before v0.3.1, run rails generate rails_pulse:upgrade to apply the missing schema columns (response_size_bytes, row_count, cache_hit, repeated_query_group, repetition_count) and add the missing index on the summaries polymorphic association. These columns were present in existing installs but absent from the generator template used for fresh installs.

v0.3.0

Choose a tag to compare

@railspulse-old railspulse-old released this 30 Apr 07:24

Release v0.3.0

New Features

  • New chart types across all sections — Routes, queries, and jobs now have dedicated chart panels with switchable chart types (response time percentiles, request volume, error rate, execution volume, duration, failure rate)
  • Dashboard health summary — New HealthSummary model surfaces an overall health status and highlights routes/queries/jobs that need attention
  • Dashboard "Needs Attention" section — Automatically surfaces slow routes, high error rates, and problematic jobs without manual digging
  • Storage pressure indicator — Tracks and displays database storage growth so you know when to adjust retention settings
  • Flame graph view for requests — Request detail pages now include a flame graph visualisation of operation timing
  • P95 duration tracking for jobs — Job runs now record and display p95 duration alongside average duration
  • Database load metric for queries — New card and chart tracking cumulative database load (execution count × avg duration) over time
  • Diagnostic fields for queries — Query show pages now surface diagnostic information alongside existing analysis
  • Chart series toggle — Show/hide individual series on charts without leaving the page
  • Performance status concern — Shared HasPerformanceStatus concern for models that report a health status
  • Metric strip component — New compact summary strip component for displaying multiple metrics inline
  • Setup banner — Onboarding banner shown to users who haven't completed setup
  • Time range selector — Redesigned time range UI with a custom date range option
  • Suggestions service — Query show pages surface optimisation suggestions (caching, controller, SQL, HTTP, view) via dedicated suggestion services
  • Statistics module — New RailsPulse::Statistics module for shared statistical calculations
  • Cleanup stats reporter — Detailed reporting on what the cleanup job removed each run
  • Cleanup task runner — Extracted cleanup orchestration into CleanupTaskRunner for testability
  • Config and migration installers — Extracted install/upgrade logic into ConfigInstaller and MigrationInstaller classes
  • Schema parser — New SchemaParser for reading and diffing schema state during upgrades
  • Icon helper — Centralised IconHelper for rendering SVG icons
  • Route helper — Centralised RouteHelper for building internal dashboard links
  • CSP helper — Dedicated CspHelper for content security policy nonce management
  • Backfill summaries job — New job to backfill summary records for historical data

Bug Fixes

  • Corrected the migration filename for expanding the normalized query column (#122).

Breaking Changes

  • None

Upgrade Notes

  • Run rails generate rails_pulse:upgrade after updating.

v0.3.0.pre.2

v0.3.0.pre.2 Pre-release
Pre-release

Choose a tag to compare

@railspulse-old railspulse-old released this 23 Apr 10:59

Release v0.3.0.pre.2

New Features

  • Query diagnostic fieldsrails_pulse_operations now tracks row_count, cache_hit, repeated_query_group, and repetition_count to help identify N+1 queries, cache usage, and result set sizes
  • Response size trackingrails_pulse_requests now records response_size_bytes for monitoring payload sizes
  • P95/P99 job duration percentilesrails_pulse_jobs now stores p95_duration and p99_duration columns for tail-latency analysis of background jobs

Improvements

  • Expanded normalized_sql column — The normalized_sql column on rails_pulse_queries is migrated from a 1000-character string to text on PostgreSQL and MySQL, preventing truncation of long queries. SQLite is unaffected (no length limits enforced).
  • Updated browser-actions/setup-chrome from v1 to v2 in CI

Bug Fixes

  • Fixed migration file naming inconsistency for the P95/P99 jobs migration (#116, #117)
  • Fixed install generator to correctly run new gem installations and migrations (#f3db89c)
  • Corrected release script (#1e44b64)

Breaking Changes

  • None

Upgrade Notes

  • Run rails generate rails_pulse:upgrade after updating to apply the new migrations
  • The normalized_sql column expansion (ExpandNormalizedSqlColumn) is safe to run on live databases — it checks the current column type before migrating and is a no-op on SQLite

v0.3.0.pre.1

v0.3.0.pre.1 Pre-release
Pre-release

Choose a tag to compare

@railspulse-old railspulse-old released this 19 Apr 14:13

Release v0.3.0.pre.1

New Features

  • Dashboard enhancements: Health summary, needs attention monitoring, and storage pressure indicators
  • New chart types: Percentile charts (p95, p99), response time percentiles, throughput and errors, execution volume, failure rate, database load, request volume, and error rate charts
  • Time range selector: Global time range picker component with presets and custom range options
  • Global filters: Session-based filtering system for persisting filter preferences across requests
  • Flame graph visualization: Request flame graph display in the requests show page
  • Query analysis suggestions: New suggestions service providing AI-powered recommendations for query optimization (cache, HTTP, SQL, controller, view suggestions)
  • Zoom range functionality: Zoom into specific time ranges on charts
  • Expandable rows: Table rows that expand to show additional details
  • Jobs monitoring: Comprehensive job monitoring with duration metrics, execution volume, and failure rate tracking
  • Cleanup task runner: New task runner for cleanup operations with statistics reporting

Improvements

  • Route diagnostics: Expanded query diagnostics with table data and performance metrics
  • Chart interactions: Chart switching, series toggles, and period selection controls
  • Metric cards: Enhanced metric card framework with base classes for reusability
  • Card components: New base card architecture for consistent metric display
  • Table improvements: Better table sorting and pagination
  • Tag filtering: Improved tag-based filtering service
  • Pagination concerns: Reusable pagination controller concern
  • Response range handling: Better handling of response time ranges
  • CSS components: New dashboard, card, chart, menu, and setup banner styles
  • Icon and helper improvements: New icon helper, breadcrumbs helper, route helper

Bug Fixes

  • Various internal refactoring and fixes included throughout the codebase

Breaking Changes

  • Some model and service refactoring; review configuration if upgrading from v0.2.x

Upgrade Notes

  • Run rails generate rails_pulse:upgrade after updating to apply new migrations

v0.2.7

Choose a tag to compare

@scottharvey scottharvey released this 16 Apr 23:41

Release v0.2.7

New Features

  • None

Improvements

  • None

Bug Fixes

  • Fixed race condition in CleanupService — Queries, routes, and jobs are now deleted using atomic subqueries that exclude records with active associations, preventing foreign key violations or data loss when cleanup runs concurrently with active request/job recording. Previously, a two-step count-then-delete approach could delete parent records that gained child associations between the two operations.

Breaking Changes

  • None

Upgrade Notes

  • No schema changes in this release. A standard bundle update rails_pulse is sufficient — no generator steps required.