Devformance is a mountable Rails Engine gem that adds a real-time performance monitoring dashboard to any Rails 7.1+ application. It surfaces slow SQL queries, detects N+1 issues, runs test suites with coverage tracking, and shows memory and DB connection metrics — all at a configurable route.
- Live Performance Dashboard at
/devformance— view test results and coverage metrics. - Run Performance Tests — one-click button that scans integration tests performance, runs them via RSpec or Minitest, and shows results with coverage.
- Automatic SQL Instrumentation — every query during a test run is timed with
ActiveSupport::Notifications. - N+1 Detection — integrates with Bullet. Detected N+1 issues are stored in
slow_queriesand shown with fix suggestions. - Memory & Connection Monitoring — reports current process memory and DB connection pool usage.
- Coverage Tracking — integrates with SimpleCov for test coverage analysis.
- Interactive Query Playground at
/devformance/playground— execute arbitrary ActiveRecord code and see performance impact immediately.
- Ruby >= 3.1
- Rails >= 7.1
- PostgreSQL (or any ActiveRecord-compatible DB)
bulletgemsimplecovgemrspec-railsgem (for the test runner feature)factory_bot_railsgem (for test fixtures)
# Gemfile
gem "devformance"Add to spec/spec_helper.rb or spec/rails_helper.rb:
require "simplecov"
SimpleCov.start "rails" do
add_filter "/devformance/"
endbundle install
rails g devformance:install
rails db:migrateThe generator creates:
config/initializers/devformance.rb— optional configuration- Migration files for
performance_runs,slow_queries,devformance_runs, anddevformance_file_resultstables
In config/routes.rb:
mount ::Devformance::Engine, at: "/devformance"bin/devVisit http://localhost:3000/devformance
# config/initializers/devformance.rb
Devformance.setup do |config|
config.preferred_framework = :rspec # :rspec or :minitest (default: :rspec)
config.slow_query_threshold_ms = 100 # Log queries slower than 100ms
config.max_slow_queries = 500 # Keep at most 500 slow query records
config.coverage_enabled = true # Enable SimpleCov coverage tracking
config.coverage_minimum_coverage = 80 # Minimum coverage percentage for warnings
endBy default, Devformance uses RSpec to run tests. You can configure the test framework:
Devformance.setup do |config|
config.preferred_framework = :rspec # Run tests with RSpec
# or
config.preferred_framework = :minitest # Run tests with Minitest
endThe framework will be auto-detected if preferred_framework is not set.
The "Run Performance Tests" button on the dashboard will:
- Scan tests for files that
require 'devformance'(or fall back to all specs if none are tagged). - Run them with SimpleCov enabled.
- Instrument every SQL query and collect N+1 detections.
- Store slow queries, coverage data, and test results in the database.
- Update the stat cards when the run completes.
# spec/requests/posts_spec.rb
require 'devformance'
RSpec.describe "Posts", devformance: true do
it "lists posts efficiently" do
get "/posts"
expect(response).to have_http_status(:success)
end
endAny file containing devformance (the string or require) will be picked up by the runner. Files without the tag are skipped unless no tagged files exist, in which case all specs run.
Devformance provides factories for its models. Add to your spec/rails_helper.rb:
Dir[Rails.root.join("spec/fixtures/devformance/**/*.rb")].each { |f| require f }Or configure Factory Bot to load them automatically:
# spec/support/factory_bot.rb
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
endBrowser opens /devformance
→ loads dashboard with results from previous runs
User clicks "Run Performance Tests"
→ POST /devformance/run_tests
→ MetricsController runs tests synchronously or enqueues a job
Test Runner
→ Open3.popen2e("bundle exec rspec spec/...")
→ SimpleCov collects coverage data
→ ActiveSupport::Notifications subscriber instruments each SQL query
→ On N+1 detection: creates SlowQuery record
→ On completion: stores results in devformance_runs + devformance_file_results
Browser polls or receives updates
→ Dashboard displays test results, coverage, and slow queries
| Path | Description |
|---|---|
GET /devformance |
Main performance dashboard |
POST /devformance/run_tests |
Trigger test runner |
Clone the repo and run the included Rails app:
git clone <repo>
cd devformance
bundle install
rails db:create db:migrate
bin/devOpen http://localhost:3000/devformance.
MIT