You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* perf: derive overview stats from execution tables, not jobs table
Replace COUNT(*) queries on solid_queue_jobs with counts from
ready_executions, scheduled_executions, claimed_executions, and
failed_executions. Replaces "Total Jobs" and "Completed" dashboard
stats with "Active Jobs" (sum of ready + scheduled + in-progress + failed).
Resolves gateway timeouts on overview page with millions of rows.
Fixes#27
* perf: replace unbounded pluck with subqueries and fix N+1 queue stats
- Change .pluck(:job_id) to .select(:job_id) in all filter methods to
keep filtering as DB subqueries instead of loading IDs into memory
- Pre-aggregate queue stats with 3 GROUP BY queries, eliminating
per-queue COUNT queries in QueuesPresenter
- Add spec to prevent unbounded pluck regression
* perf: use SQL GROUP BY bucketing for chart data
Replace in-memory timestamp bucketing (pluck all timestamps, iterate
in Ruby) with SQL GROUP BY using computed bucket index. Works on both
PostgreSQL and SQLite with adapter-aware expressions.
* feat: add config.show_chart toggle to disable chart queries
When show_chart is false, ChartDataService is not instantiated and
the chart section is not rendered, eliminating chart queries entirely
for users who don't need the visualization.
* docs: document performance optimizations and show_chart config
- Add "Performance at Scale" section to README
- Add [Unreleased] section to CHANGELOG with breaking change note
- Add Large Dataset Performance to ROADMAP as done
- Include implementation plan in docs/plans/
* release: v1.2.0 — Performance at Scale
Bump version to 1.2.0, set CHANGELOG release date, update README
gem version reference.
* fix: resolve rubocop and CI lint offenses
- Fix RSpec/MessageSpies: use have_received instead of receive
- Fix Layout/HashAlignment, Layout/ArgumentAlignment auto-corrections
- Fix Style/ConditionalAssignment in base_controller
- Disable false-positive Style/HashTransformKeys (pluck returns Array)
- Disable RSpec/DescribeClass for source-scanning spec
- Update Gemfile.lock with version 1.2.0
Copy file name to clipboardExpand all lines: CHANGELOG.md
+17Lines changed: 17 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,22 @@
1
1
# Changelog
2
2
3
+
## [1.2.0] - 2026-03-07
4
+
5
+
### Changed
6
+
7
+
-**BREAKING**: Dashboard "Total Jobs" and "Completed" stats replaced with "Active Jobs" (sum of ready + scheduled + in-progress + failed). This avoids expensive `COUNT(*)` on the jobs table at scale.
8
+
9
+
### Fixed
10
+
11
+
-**Performance**: Overview page no longer queries `solid_queue_jobs` for stats — all counts derived from execution tables (resolves gateway timeouts with millions of rows) ([#27](https://github.com/vishaltps/solid_queue_monitor/issues/27))
12
+
-**Performance**: Chart data service uses SQL `GROUP BY` bucketing instead of loading all timestamps into Ruby memory
13
+
-**Performance**: All filter methods use `.select(:job_id)` subqueries instead of unbounded `.pluck(:job_id)`
Copy file name to clipboardExpand all lines: README.md
+19-1Lines changed: 19 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -72,7 +72,7 @@ A lightweight, zero-dependency web interface for monitoring Solid Queue backgrou
72
72
Add this line to your application's Gemfile:
73
73
74
74
```ruby
75
-
gem 'solid_queue_monitor', '~> 1.1'
75
+
gem 'solid_queue_monitor', '~> 1.2'
76
76
```
77
77
78
78
Then execute:
@@ -118,9 +118,27 @@ SolidQueueMonitor.setup do |config|
118
118
119
119
# Auto-refresh interval in seconds (default: 30)
120
120
config.auto_refresh_interval =30
121
+
122
+
# Disable the chart on the overview page to skip chart queries entirely
123
+
# config.show_chart = true
121
124
end
122
125
```
123
126
127
+
### Performance at Scale
128
+
129
+
SolidQueueMonitor is optimized for large datasets (millions of rows in `solid_queue_jobs`):
130
+
131
+
-**Overview stats** are derived entirely from execution tables (`ready_executions`, `scheduled_executions`, `claimed_executions`, `failed_executions`), avoiding expensive `COUNT(*)` queries on the jobs table.
132
+
-**Chart data** uses SQL `GROUP BY` bucketing instead of loading timestamps into Ruby memory.
133
+
-**Filters** use subqueries (`.select(:job_id)`) instead of loading ID arrays into memory.
134
+
-**Queue stats** are pre-aggregated with `GROUP BY` to avoid N+1 queries.
135
+
136
+
If you don't need the job activity chart, disable it to skip chart queries entirely:
137
+
138
+
```ruby
139
+
config.show_chart =false
140
+
```
141
+
124
142
### Authentication
125
143
126
144
By default, Solid Queue Monitor does not require authentication to access the dashboard. This makes it easy to get started in development environments.
0 commit comments