railspulse-org/rails_pulse

Rails Pulse is a comprehensive performance monitoring and debugging gem that provides insights into your Rails application's health.

506

stars

226

commits

Ruby

primary language

Sep 9, 2026

updated

README

Rails Pulse

Rails Pulse

Self-hosted performance monitoring for Rails apps

Gem Version Rails Version License Ruby Version

Rails Pulse is a Rails engine that monitors your app's performance from the inside. It tracks slow requests, N+1 queries, SQL performance, background jobs, and unhandled exceptions. All data stays in your own database, no third-party cloud, no SaaS subscription, no data leaving your servers.

DashboardRequest detail
Query detailRoute detail

Installation

Add to your Gemfile:

gem 'rails_pulse'

Run the installer:

bundle install
rails generate rails_pulse:install
rails db:migrate

Mount the dashboard in config/routes.rb:

Rails.application.routes.draw do
  mount RailsPulse::Engine => "/rails_pulse"
end

Schedule the background jobs:

RailsPulse::SummaryJob.perform_later  # cron: 5 * * * *
RailsPulse::CleanupJob.perform_later  # cron: 0 1 * * *

Your dashboard is now at http://localhost:3000/rails_pulse.

Upgrading

From 0.3.3:

bundle update rails_pulse
rails generate rails_pulse:upgrade
rails db:migrate                  # or: rails db:migrate:rails_pulse
rails rails_pulse:migrate_routes  # required — fills Action and merges same-action paths

Restart all processes after migrate. This release changes how routes are stored (method moves off the route onto each request), so mixed old/new processes are not supported.

The upgrade generator appends new settings to config/initializers/rails_pulse.rb without rewriting what you already set. Review with git diff and keep or discard hunks.

Exception tracking is off for existing installs. The generator inserts config.track_exceptions = false; set it to true after migrating to opt in:

config.track_exceptions = true
config.capture_exception_params = true  # params are filtered via Rails' filter_parameters

Separate-database hosts: set schema_dump: false on the rails_pulse entry in config/database.yml and delete db/rails_pulse_structure.sql if that file exists.

If you previously added rails-pulse.js / rails-pulse.css to config.assets.precompile, remove those entries — the gem no longer registers dashboard assets with Sprockets (that re-minify OOMs small hosts). Production deploys that use config.asset_host or a CDN-only CSP should run assets:precompile so rails_pulse:install_assets copies digested files into public/assets.

Full install guide: railspulse.com/documentation/installation

Separate database setup: railspulse.com/documentation/database

Configuration

Rails Pulse works out of the box with sensible defaults. To customise, edit config/initializers/rails_pulse.rb:

RailsPulse.configure do |config|
  config.enabled = true

  config.request_thresholds = {
    slow: 700,
    very_slow: 2000,
    critical: 4000
  }

  config.track_jobs = true
  config.capture_job_arguments = false  # keep false to protect sensitive data

  config.track_exceptions = true
  config.capture_exception_params = true  # params are filtered via Rails' filter_parameters

  config.full_retention_period = 30.days
end

Full configuration reference: railspulse.com/documentation/advanced

Authentication

Rails Pulse has no built-in authentication, you protect the dashboard using your app's existing auth. Add an authentication_method to the initializer:

RailsPulse.configure do |config|
  config.authentication_enabled = true
  config.authentication_redirect_path = "/login"

  config.authentication_method = proc {
    unless user_signed_in? && current_user.admin?
      redirect_to main_app.root_path, alert: "Access denied"
    end
  }
end

Authentication guide: railspulse.com/documentation/authentication

Features

  • Request monitoring — every request is timed and stored with its route, status, SQL count, and duration. Slow requests are flagged automatically based on thresholds you control.
  • Query analysis — captures the queries behind each request, detects N+1 patterns, and tracks normalized SQL across requests so you can see which queries are hurting you in production, not just in development.
  • Job tracking — monitors background job duration, queue wait time, and failure rates. Works with any Active Job adapter.
  • Exception tracking — captures unhandled exceptions from web requests and background jobs, groups them by class and location, and shows full backtraces with filtered request params. See recurring errors in production without a separate error monitoring service.
  • System health bar — at-a-glance dashboard summary showing healthy, slow, and critical counts across your routes, queries, jobs, and storage. Lets you see the overall state of your app before drilling into specifics.
  • No data leaves your app — everything is stored in your own database. No third-party cloud, no SaaS subscription, no outbound connections.
  • Low overhead — tracking is async and uses a thread-local flag to skip recording Rails Pulse's own internal requests.

Contributing

Bug reports and pull requests are welcome on GitHub.

License

Available as open source under the MIT License.

Contributors

railspulse-old

142 commits

scottharvey

57 commits

dependabot[bot]

20 commits

GolfyMcG

2 commits

railspulse-org/rails_pulse

Rails Pulse is a comprehensive performance monitoring and debugging gem that provides insights into your Rails application's health.

506

stars

226

commits

Ruby

primary language

Sep 9, 2026

updated

README

Rails Pulse

Rails Pulse

Self-hosted performance monitoring for Rails apps

Gem Version Rails Version License Ruby Version

Rails Pulse is a Rails engine that monitors your app's performance from the inside. It tracks slow requests, N+1 queries, SQL performance, background jobs, and unhandled exceptions. All data stays in your own database, no third-party cloud, no SaaS subscription, no data leaving your servers.

DashboardRequest detail
Query detailRoute detail

Installation

Add to your Gemfile:

gem 'rails_pulse'

Run the installer:

bundle install
rails generate rails_pulse:install
rails db:migrate

Mount the dashboard in config/routes.rb:

Rails.application.routes.draw do
  mount RailsPulse::Engine => "/rails_pulse"
end

Schedule the background jobs:

RailsPulse::SummaryJob.perform_later  # cron: 5 * * * *
RailsPulse::CleanupJob.perform_later  # cron: 0 1 * * *

Your dashboard is now at http://localhost:3000/rails_pulse.

Upgrading

From 0.3.3:

bundle update rails_pulse
rails generate rails_pulse:upgrade
rails db:migrate                  # or: rails db:migrate:rails_pulse
rails rails_pulse:migrate_routes  # required — fills Action and merges same-action paths

Restart all processes after migrate. This release changes how routes are stored (method moves off the route onto each request), so mixed old/new processes are not supported.

The upgrade generator appends new settings to config/initializers/rails_pulse.rb without rewriting what you already set. Review with git diff and keep or discard hunks.

Exception tracking is off for existing installs. The generator inserts config.track_exceptions = false; set it to true after migrating to opt in:

config.track_exceptions = true
config.capture_exception_params = true  # params are filtered via Rails' filter_parameters

Separate-database hosts: set schema_dump: false on the rails_pulse entry in config/database.yml and delete db/rails_pulse_structure.sql if that file exists.

If you previously added rails-pulse.js / rails-pulse.css to config.assets.precompile, remove those entries — the gem no longer registers dashboard assets with Sprockets (that re-minify OOMs small hosts). Production deploys that use config.asset_host or a CDN-only CSP should run assets:precompile so rails_pulse:install_assets copies digested files into public/assets.

Full install guide: railspulse.com/documentation/installation

Separate database setup: railspulse.com/documentation/database

Configuration

Rails Pulse works out of the box with sensible defaults. To customise, edit config/initializers/rails_pulse.rb:

RailsPulse.configure do |config|
  config.enabled = true

  config.request_thresholds = {
    slow: 700,
    very_slow: 2000,
    critical: 4000
  }

  config.track_jobs = true
  config.capture_job_arguments = false  # keep false to protect sensitive data

  config.track_exceptions = true
  config.capture_exception_params = true  # params are filtered via Rails' filter_parameters

  config.full_retention_period = 30.days
end

Full configuration reference: railspulse.com/documentation/advanced

Authentication

Rails Pulse has no built-in authentication, you protect the dashboard using your app's existing auth. Add an authentication_method to the initializer:

RailsPulse.configure do |config|
  config.authentication_enabled = true
  config.authentication_redirect_path = "/login"

  config.authentication_method = proc {
    unless user_signed_in? && current_user.admin?
      redirect_to main_app.root_path, alert: "Access denied"
    end
  }
end

Authentication guide: railspulse.com/documentation/authentication

Features

  • Request monitoring — every request is timed and stored with its route, status, SQL count, and duration. Slow requests are flagged automatically based on thresholds you control.
  • Query analysis — captures the queries behind each request, detects N+1 patterns, and tracks normalized SQL across requests so you can see which queries are hurting you in production, not just in development.
  • Job tracking — monitors background job duration, queue wait time, and failure rates. Works with any Active Job adapter.
  • Exception tracking — captures unhandled exceptions from web requests and background jobs, groups them by class and location, and shows full backtraces with filtered request params. See recurring errors in production without a separate error monitoring service.
  • System health bar — at-a-glance dashboard summary showing healthy, slow, and critical counts across your routes, queries, jobs, and storage. Lets you see the overall state of your app before drilling into specifics.
  • No data leaves your app — everything is stored in your own database. No third-party cloud, no SaaS subscription, no outbound connections.
  • Low overhead — tracking is async and uses a thread-local flag to skip recording Rails Pulse's own internal requests.

Contributing

Bug reports and pull requests are welcome on GitHub.

License

Available as open source under the MIT License.

Contributors

railspulse-old

142 commits

scottharvey

57 commits

dependabot[bot]

20 commits

GolfyMcG

2 commits

Languages

Ruby

80.7%

HTML

8.2%

JavaScript

7.2%

CSS

2.3%

Shell

1.4%