rails_error_dashboard 0.5.15 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/rails_error_dashboard/errors_controller.rb +31 -26
  3. data/app/helpers/rails_error_dashboard/application_helper.rb +12 -5
  4. data/app/views/layouts/rails_error_dashboard.html.erb +1217 -1935
  5. data/app/views/rails_error_dashboard/errors/_breadcrumbs_group.html.erb +4 -4
  6. data/app/views/rails_error_dashboard/errors/_co_occurring_errors.html.erb +1 -1
  7. data/app/views/rails_error_dashboard/errors/_discussion.html.erb +3 -3
  8. data/app/views/rails_error_dashboard/errors/_error_cascades.html.erb +1 -1
  9. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +69 -79
  10. data/app/views/rails_error_dashboard/errors/_instance_variables.html.erb +1 -1
  11. data/app/views/rails_error_dashboard/errors/_issue_section.html.erb +1 -1
  12. data/app/views/rails_error_dashboard/errors/_local_variables.html.erb +1 -1
  13. data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +2 -2
  14. data/app/views/rails_error_dashboard/errors/_request_context.html.erb +1 -1
  15. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +1 -1
  16. data/app/views/rails_error_dashboard/errors/_similar_errors.html.erb +1 -1
  17. data/app/views/rails_error_dashboard/errors/_timeline.html.erb +1 -1
  18. data/app/views/rails_error_dashboard/errors/actioncable_health_summary.html.erb +6 -6
  19. data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +6 -6
  20. data/app/views/rails_error_dashboard/errors/analytics.html.erb +34 -50
  21. data/app/views/rails_error_dashboard/errors/cache_health_summary.html.erb +7 -7
  22. data/app/views/rails_error_dashboard/errors/correlation.html.erb +11 -11
  23. data/app/views/rails_error_dashboard/errors/database_health_summary.html.erb +114 -172
  24. data/app/views/rails_error_dashboard/errors/deprecations.html.erb +7 -7
  25. data/app/views/rails_error_dashboard/errors/diagnostic_dumps.html.erb +6 -6
  26. data/app/views/rails_error_dashboard/errors/index.html.erb +292 -620
  27. data/app/views/rails_error_dashboard/errors/job_health_summary.html.erb +7 -7
  28. data/app/views/rails_error_dashboard/errors/n_plus_one_summary.html.erb +7 -7
  29. data/app/views/rails_error_dashboard/errors/overview.html.erb +192 -363
  30. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +11 -11
  31. data/app/views/rails_error_dashboard/errors/rack_attack_summary.html.erb +6 -6
  32. data/app/views/rails_error_dashboard/errors/releases.html.erb +6 -6
  33. data/app/views/rails_error_dashboard/errors/settings.html.erb +32 -52
  34. data/app/views/rails_error_dashboard/errors/show.html.erb +200 -203
  35. data/app/views/rails_error_dashboard/errors/swallowed_exceptions.html.erb +7 -7
  36. data/app/views/rails_error_dashboard/errors/user_impact.html.erb +6 -6
  37. data/lib/rails_error_dashboard/configuration.rb +6 -0
  38. data/lib/rails_error_dashboard/version.rb +1 -1
  39. metadata +2 -2
@@ -1,8 +1,8 @@
1
1
  <% content_for :page_title, "Cache Health" %>
2
2
 
3
- <div class="container-fluid py-4">
3
+ <div>
4
4
  <div class="d-flex justify-content-between align-items-center mb-4">
5
- <h1 class="h3 mb-0">
5
+ <h1 style="font-size: 20px; font-weight: 700; margin: 0;">
6
6
  <i class="bi bi-lightning-charge me-2"></i>
7
7
  Cache Health
8
8
  </h1>
@@ -21,9 +21,9 @@
21
21
  </div>
22
22
 
23
23
  <% if @errors_with_cache == 0 %>
24
- <div class="text-center py-5">
25
- <i class="bi bi-check-circle display-1 text-success mb-3"></i>
26
- <h4 class="text-muted">No Cache Activity Found</h4>
24
+ <div class="red-empty-state">
25
+ <div class="red-empty-state-icon" style="background: var(--status-success-bg); color: var(--status-success);"><i class="bi bi-check-lg"></i></div>
26
+ <div class="red-empty-state-title">No Cache Activity Found</div>
27
27
  <p class="text-muted">
28
28
  No cache operations were detected in error breadcrumbs over the last <%= @days %> days.
29
29
  </p>
@@ -73,7 +73,7 @@
73
73
  </div>
74
74
 
75
75
  <div class="card mb-4">
76
- <div class="card-header bg-white d-flex justify-content-between align-items-center">
76
+ <div class="card-header d-flex justify-content-between align-items-center">
77
77
  <h5 class="mb-0">
78
78
  <i class="bi bi-lightning-charge text-info me-2"></i>
79
79
  Cache Performance by Error
@@ -123,7 +123,7 @@
123
123
  </table>
124
124
  </div>
125
125
  </div>
126
- <div class="card-footer bg-white border-top d-flex justify-content-between align-items-center">
126
+ <div class="card-footer border-top d-flex justify-content-between align-items-center">
127
127
  <div>
128
128
  <small class="text-muted">
129
129
  <i class="bi bi-lightbulb text-warning"></i> Low hit rates may indicate cache keys that expire too quickly or aren't being set properly.
@@ -1,8 +1,8 @@
1
1
  <% content_for :page_title, "Error Correlation" %>
2
2
 
3
- <div class="container-fluid py-4">
3
+ <div>
4
4
  <div class="d-flex justify-content-between align-items-center mb-4">
5
- <h1 class="h3 mb-0">
5
+ <h1 style="font-size: 20px; font-weight: 700; margin: 0;">
6
6
  <i class="bi bi-diagram-3 me-2"></i>
7
7
  Error Correlation Analysis
8
8
  </h1>
@@ -23,7 +23,7 @@
23
23
  <!-- Period Comparison -->
24
24
  <% if @period_comparison.present? %>
25
25
  <div class="card mb-4">
26
- <div class="card-header bg-white">
26
+ <div class="card-header">
27
27
  <h5 class="mb-0">
28
28
  <i class="bi bi-graph-up-arrow me-2"></i>
29
29
  Trend Analysis
@@ -69,7 +69,7 @@
69
69
  <h5 class="mb-0">
70
70
  <i class="bi bi-exclamation-triangle-fill me-2"></i>
71
71
  Problematic Releases
72
- <span class="badge bg-white text-danger"><%= @problematic_releases.count %></span>
72
+ <span class="badge text-danger"><%= @problematic_releases.count %></span>
73
73
  </h5>
74
74
  <small>Versions with more than 2x the average error rate</small>
75
75
  </div>
@@ -121,7 +121,7 @@
121
121
  <% if @errors_by_version.present? && @errors_by_version.any? %>
122
122
  <div class="col-lg-6 mb-4">
123
123
  <div class="card h-100">
124
- <div class="card-header bg-white">
124
+ <div class="card-header">
125
125
  <h5 class="mb-0">
126
126
  <i class="bi bi-tag me-2"></i>
127
127
  Errors by App Version
@@ -165,7 +165,7 @@
165
165
  <% if @errors_by_git_sha.present? && @errors_by_git_sha.any? %>
166
166
  <div class="col-lg-6 mb-4">
167
167
  <div class="card h-100">
168
- <div class="card-header bg-white">
168
+ <div class="card-header">
169
169
  <h5 class="mb-0">
170
170
  <i class="bi bi-git me-2"></i>
171
171
  Errors by Git SHA
@@ -207,7 +207,7 @@
207
207
  <!-- Multi-Error Users -->
208
208
  <% if @multi_error_users.present? && @multi_error_users.any? %>
209
209
  <div class="card mb-4">
210
- <div class="card-header bg-white">
210
+ <div class="card-header">
211
211
  <h5 class="mb-0">
212
212
  <i class="bi bi-people-fill me-2"></i>
213
213
  Users Affected by Multiple Error Types
@@ -239,7 +239,7 @@
239
239
  <!-- Time-Correlated Errors -->
240
240
  <% if @time_correlated_errors.present? && @time_correlated_errors.any? %>
241
241
  <div class="card mb-4">
242
- <div class="card-header bg-white">
242
+ <div class="card-header">
243
243
  <h5 class="mb-0">
244
244
  <i class="bi bi-clock-history me-2"></i>
245
245
  Time-Correlated Errors
@@ -300,7 +300,7 @@
300
300
  <!-- Platform-Specific Errors -->
301
301
  <% if @platform_specific_errors.present? && @platform_specific_errors.any? %>
302
302
  <div class="card mb-4">
303
- <div class="card-header bg-white">
303
+ <div class="card-header">
304
304
  <h5 class="mb-0">
305
305
  <i class="bi bi-phone me-2"></i>
306
306
  Platform-Specific vs Cross-Platform Errors
@@ -344,9 +344,9 @@
344
344
 
345
345
  <!-- Empty State -->
346
346
  <% if @errors_by_version.blank? && @multi_error_users.blank? && @time_correlated_errors.blank? %>
347
- <div class="text-center py-5">
347
+ <div class="red-empty-state">
348
348
  <i class="bi bi-diagram-3 display-1 text-muted mb-3"></i>
349
- <h4 class="text-muted">Not Enough Data for Correlation Analysis</h4>
349
+ <div class="red-empty-state-title">Not Enough Data for Correlation Analysis</div>
350
350
  <p class="text-muted">
351
351
  Correlation analysis requires more error data to identify patterns.
352
352
  </p>
@@ -1,130 +1,120 @@
1
1
  <% content_for :page_title, "DB Health" %>
2
2
 
3
- <div class="container-fluid py-4">
3
+ <div>
4
4
  <div class="d-flex justify-content-between align-items-center mb-4">
5
- <h1 class="h3 mb-0">
5
+ <h1 style="font-size: 20px; font-weight: 700; margin: 0;">
6
6
  <i class="bi bi-database me-2"></i>
7
7
  Database Health
8
8
  </h1>
9
9
 
10
- <div class="btn-group" role="group">
11
- <%= link_to database_health_summary_errors_path(days: 7), class: "btn btn-sm #{@days == 7 ? 'btn-primary' : 'btn-outline-primary'}" do %>
12
- 7 Days
13
- <% end %>
14
- <%= link_to database_health_summary_errors_path(days: 30), class: "btn btn-sm #{@days == 30 ? 'btn-primary' : 'btn-outline-primary'}" do %>
15
- 30 Days
16
- <% end %>
17
- <%= link_to database_health_summary_errors_path(days: 90), class: "btn btn-sm #{@days == 90 ? 'btn-primary' : 'btn-outline-primary'}" do %>
18
- 90 Days
19
- <% end %>
10
+ <div style="display: flex; gap: 4px;">
11
+ <%= link_to database_health_summary_errors_path(days: 7), class: "btn btn-sm #{@days == 7 ? 'btn-primary' : 'btn-outline-primary'}", style: "text-decoration: none;" do %>7 Days<% end %>
12
+ <%= link_to database_health_summary_errors_path(days: 30), class: "btn btn-sm #{@days == 30 ? 'btn-primary' : 'btn-outline-primary'}", style: "text-decoration: none;" do %>30 Days<% end %>
13
+ <%= link_to database_health_summary_errors_path(days: 90), class: "btn btn-sm #{@days == 90 ? 'btn-primary' : 'btn-outline-primary'}", style: "text-decoration: none;" do %>90 Days<% end %>
20
14
  </div>
21
15
  </div>
22
16
 
23
- <%# ===== SECTION A: Live Database Health ===== %>
24
-
25
- <h4 class="mb-3"><i class="bi bi-activity text-primary me-2"></i>Live Database Health</h4>
17
+ <%# ===== SECTION A: Summary Stats ===== %>
18
+ <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-6);">
19
+ <div class="card stat-card" style="border-left: 3px solid var(--accent); padding: var(--space-4) var(--space-5); text-align: center;">
20
+ <div class="stat-label" style="margin-bottom: 4px;">Errors with Pool Data</div>
21
+ <div class="stat-value"><%= @errors_with_pool %></div>
22
+ </div>
23
+ <% if @live_health[:connection_pool] %>
24
+ <% pool = @live_health[:connection_pool] %>
25
+ <div class="card stat-card" style="padding: var(--space-4) var(--space-5); text-align: center;">
26
+ <div class="stat-label" style="margin-bottom: 4px;">Peak Utilization</div>
27
+ <% util_color = @max_utilization >= 80 ? 'var(--status-critical)' : (@max_utilization >= 60 ? 'var(--status-caution)' : 'var(--status-success)') %>
28
+ <div class="stat-value" style="color: <%= util_color %>;"><%= @max_utilization %>%</div>
29
+ </div>
30
+ <div class="card stat-card" style="padding: var(--space-4) var(--space-5); text-align: center;">
31
+ <div class="stat-label" style="margin-bottom: 4px;">Total Dead</div>
32
+ <% dead_color = @total_dead > 0 ? 'var(--status-critical)' : 'var(--status-success)' %>
33
+ <div class="stat-value" style="color: <%= dead_color %>;"><%= @total_dead %></div>
34
+ </div>
35
+ <div class="card stat-card" style="padding: var(--space-4) var(--space-5); text-align: center;">
36
+ <div class="stat-label" style="margin-bottom: 4px;">Total Waiting</div>
37
+ <% waiting_color = @total_waiting > 0 ? 'var(--status-caution)' : 'var(--status-success)' %>
38
+ <div class="stat-value" style="color: <%= waiting_color %>;"><%= @total_waiting %></div>
39
+ </div>
40
+ <% end %>
41
+ </div>
26
42
 
27
- <% unless @live_health[:postgresql] %>
28
- <div class="alert alert-info mb-3">
29
- <i class="bi bi-info-circle me-2"></i>
30
- <strong>Non-PostgreSQL adapter detected (<%= @live_health[:adapter] || "unknown" %>).</strong>
31
- Live table, index, and activity stats require PostgreSQL. Connection pool and historical data are still available below.
43
+ <%# ===== SECTION B: Live Database Health ===== %>
44
+ <div class="card" style="margin-bottom: var(--space-4);">
45
+ <div style="display: flex; justify-content: space-between; align-items: center; padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border-primary);">
46
+ <span style="font-size: 13px; font-weight: 600;">
47
+ <i class="bi bi-activity me-2"></i>Live Database Health
48
+ </span>
32
49
  </div>
33
- <% end %>
34
50
 
35
- <%# Connection Pool (always works — all adapters) %>
36
- <% if @live_health[:connection_pool] %>
37
- <% pool = @live_health[:connection_pool] %>
38
- <div class="row mb-4">
39
- <div class="col-md-2">
40
- <div class="card text-center">
41
- <div class="card-body py-2">
42
- <div class="h4 mb-0 text-primary"><%= pool[:size] %></div>
43
- <small class="text-muted">Pool Size</small>
44
- </div>
45
- </div>
51
+ <% unless @live_health[:postgresql] %>
52
+ <div class="alert alert-info" style="margin: var(--space-3) var(--space-5); padding: var(--space-3) var(--space-4); font-size: 12px;">
53
+ <i class="bi bi-info-circle me-1"></i>
54
+ <strong>Non-PostgreSQL adapter detected (<%= @live_health[:adapter] || "unknown" %>).</strong>
55
+ Live table, index, and activity stats require PostgreSQL. Connection pool and historical data are still available below.
46
56
  </div>
47
- <div class="col-md-2">
48
- <div class="card text-center">
49
- <div class="card-body py-2">
50
- <% busy_color = pool[:size] > 0 && (pool[:busy].to_f / pool[:size]) >= 0.8 ? "danger" : "info" %>
51
- <div class="h4 mb-0 text-<%= busy_color %>"><%= pool[:busy] %></div>
52
- <small class="text-muted">Busy</small>
57
+ <% end %>
58
+
59
+ <% if @live_health[:connection_pool] %>
60
+ <% pool = @live_health[:connection_pool] %>
61
+ <div style="padding: var(--space-4) var(--space-5);">
62
+ <div style="display: grid; grid-template-columns: repeat(5, 1fr); gap: var(--space-3); margin-bottom: var(--space-4);">
63
+ <div style="text-align: center; padding: var(--space-3); background: var(--surface-base); border-radius: var(--radius-md);">
64
+ <div style="font-size: 24px; font-weight: 700; color: var(--accent);"><%= pool[:size] %></div>
65
+ <small style="color: var(--text-tertiary);">Pool Size</small>
53
66
  </div>
54
- </div>
55
- </div>
56
- <div class="col-md-2">
57
- <div class="card text-center">
58
- <div class="card-body py-2">
59
- <div class="h4 mb-0 text-success"><%= pool[:idle] %></div>
60
- <small class="text-muted">Idle</small>
67
+ <div style="text-align: center; padding: var(--space-3); background: var(--surface-base); border-radius: var(--radius-md);">
68
+ <% busy_color = pool[:size] > 0 && (pool[:busy].to_f / pool[:size]) >= 0.8 ? 'var(--status-critical)' : 'var(--status-info)' %>
69
+ <div style="font-size: 24px; font-weight: 700; color: <%= busy_color %>;"><%= pool[:busy] %></div>
70
+ <small style="color: var(--text-tertiary);">Busy</small>
61
71
  </div>
62
- </div>
63
- </div>
64
- <div class="col-md-2">
65
- <div class="card text-center">
66
- <div class="card-body py-2">
67
- <% dead_color = pool[:dead] > 0 ? "danger" : "success" %>
68
- <div class="h4 mb-0 text-<%= dead_color %>"><%= pool[:dead] %></div>
69
- <small class="text-muted">Dead</small>
72
+ <div style="text-align: center; padding: var(--space-3); background: var(--surface-base); border-radius: var(--radius-md);">
73
+ <div style="font-size: 24px; font-weight: 700; color: var(--status-success);"><%= pool[:idle] %></div>
74
+ <small style="color: var(--text-tertiary);">Idle</small>
70
75
  </div>
71
- </div>
72
- </div>
73
- <div class="col-md-2">
74
- <div class="card text-center">
75
- <div class="card-body py-2">
76
- <% waiting_color = pool[:waiting] > 0 ? "warning" : "success" %>
77
- <div class="h4 mb-0 text-<%= waiting_color %>"><%= pool[:waiting] %></div>
78
- <small class="text-muted">Waiting</small>
76
+ <div style="text-align: center; padding: var(--space-3); background: var(--surface-base); border-radius: var(--radius-md);">
77
+ <% dead_color = pool[:dead] > 0 ? 'var(--status-critical)' : 'var(--status-success)' %>
78
+ <div style="font-size: 24px; font-weight: 700; color: <%= dead_color %>;"><%= pool[:dead] %></div>
79
+ <small style="color: var(--text-tertiary);">Dead</small>
80
+ </div>
81
+ <div style="text-align: center; padding: var(--space-3); background: var(--surface-base); border-radius: var(--radius-md);">
82
+ <% waiting_color = pool[:waiting] > 0 ? 'var(--status-caution)' : 'var(--status-success)' %>
83
+ <div style="font-size: 24px; font-weight: 700; color: <%= waiting_color %>;"><%= pool[:waiting] %></div>
84
+ <small style="color: var(--text-tertiary);">Waiting</small>
79
85
  </div>
80
86
  </div>
81
87
  </div>
82
- </div>
83
- <% end %>
88
+ <% end %>
89
+ </div>
84
90
 
85
91
  <% if @live_health[:postgresql] %>
86
92
  <%# Summary cards for PostgreSQL %>
87
93
  <% total_db_size = (@host_tables + @gem_tables).sum { |t| t[:total_bytes] } %>
88
- <div class="row mb-4">
89
- <div class="col-md-3">
90
- <div class="card text-center">
91
- <div class="card-body py-2">
92
- <div class="h4 mb-0 text-primary"><%= number_to_human_size(total_db_size) %></div>
93
- <small class="text-muted">Total DB Size</small>
94
- </div>
95
- </div>
94
+ <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-4); margin-bottom: var(--space-4);">
95
+ <div class="card stat-card" style="padding: var(--space-4) var(--space-5); text-align: center;">
96
+ <div class="stat-label" style="margin-bottom: 4px;">Total DB Size</div>
97
+ <div class="stat-value"><%= number_to_human_size(total_db_size) %></div>
96
98
  </div>
97
- <div class="col-md-3">
98
- <div class="card text-center">
99
- <div class="card-body py-2">
100
- <div class="h4 mb-0 text-info"><%= @host_tables.size + @gem_tables.size %></div>
101
- <small class="text-muted">Tables</small>
102
- </div>
103
- </div>
99
+ <div class="card stat-card" style="padding: var(--space-4) var(--space-5); text-align: center;">
100
+ <div class="stat-label" style="margin-bottom: 4px;">Tables</div>
101
+ <div class="stat-value"><%= @host_tables.size + @gem_tables.size %></div>
104
102
  </div>
105
- <div class="col-md-3">
106
- <div class="card text-center">
107
- <div class="card-body py-2">
108
- <% unused_color = @live_health[:unused_indexes]&.any? ? "warning" : "success" %>
109
- <div class="h4 mb-0 text-<%= unused_color %>"><%= @live_health[:unused_indexes]&.size || 0 %></div>
110
- <small class="text-muted">Unused Indexes</small>
111
- </div>
112
- </div>
103
+ <div class="card stat-card" style="padding: var(--space-4) var(--space-5); text-align: center;">
104
+ <div class="stat-label" style="margin-bottom: 4px;">Unused Indexes</div>
105
+ <% unused_color = @live_health[:unused_indexes]&.any? ? 'var(--status-caution)' : 'var(--status-success)' %>
106
+ <div class="stat-value" style="color: <%= unused_color %>;"><%= @live_health[:unused_indexes]&.size || 0 %></div>
113
107
  </div>
114
- <div class="col-md-3">
115
- <div class="card text-center">
116
- <div class="card-body py-2">
117
- <div class="h4 mb-0 text-secondary"><%= @live_health[:activity] ? @live_health[:activity][:total] : "N/A" %></div>
118
- <small class="text-muted">Active Connections</small>
119
- </div>
120
- </div>
108
+ <div class="card stat-card" style="padding: var(--space-4) var(--space-5); text-align: center;">
109
+ <div class="stat-label" style="margin-bottom: 4px;">Active Connections</div>
110
+ <div class="stat-value"><%= @live_health[:activity] ? @live_health[:activity][:total] : "N/A" %></div>
121
111
  </div>
122
112
  </div>
123
113
 
124
114
  <%# Host App Tables %>
125
115
  <% if @host_tables.any? %>
126
116
  <div class="card mb-4">
127
- <div class="card-header bg-white">
117
+ <div class="card-header">
128
118
  <h5 class="mb-0">
129
119
  <i class="bi bi-table text-primary me-2"></i>
130
120
  Host App Tables
@@ -173,7 +163,7 @@
173
163
  <%# Gem Tables (collapsible) %>
174
164
  <% if @gem_tables.any? %>
175
165
  <div class="card mb-4">
176
- <div class="card-header bg-white">
166
+ <div class="card-header">
177
167
  <a class="text-decoration-none" data-bs-toggle="collapse" href="#gemTablesCollapse" role="button" aria-expanded="false" aria-controls="gemTablesCollapse">
178
168
  <h5 class="mb-0">
179
169
  <i class="bi bi-table text-secondary me-2"></i>
@@ -227,7 +217,7 @@
227
217
  <%# Unused Indexes %>
228
218
  <% if @live_health[:unused_indexes]&.any? %>
229
219
  <div class="card mb-4">
230
- <div class="card-header bg-white">
220
+ <div class="card-header">
231
221
  <h5 class="mb-0">
232
222
  <i class="bi bi-exclamation-triangle text-warning me-2"></i>
233
223
  Unused Indexes
@@ -262,7 +252,7 @@
262
252
  <%# Activity by State %>
263
253
  <% if @live_health[:activity] %>
264
254
  <div class="card mb-4">
265
- <div class="card-header bg-white">
255
+ <div class="card-header">
266
256
  <h5 class="mb-0">
267
257
  <i class="bi bi-people text-info me-2"></i>
268
258
  Connection Activity
@@ -304,78 +294,30 @@
304
294
  <% end %>
305
295
  <% end %>
306
296
 
307
- <%# ===== SECTION B: Historical Connection Pool at Error Time ===== %>
308
-
309
- <hr class="my-4">
310
- <h4 class="mb-3"><i class="bi bi-clock-history text-secondary me-2"></i>Historical Connection Pool at Error Time</h4>
311
-
312
- <% if @errors_with_pool == 0 %>
313
- <div class="text-center py-5">
314
- <i class="bi bi-check-circle display-1 text-success mb-3"></i>
315
- <h4 class="text-muted">No Connection Pool Data Found</h4>
316
- <p class="text-muted">
317
- No connection pool stats were detected in system health snapshots over the last <%= @days %> days.
318
- </p>
319
- <div class="card mx-auto" style="max-width: 500px;">
320
- <div class="card-body text-start">
321
- <h6>How connection pool tracking works:</h6>
322
- <ul class="mb-0">
323
- <li>System health must be enabled (<code>enable_system_health = true</code>)</li>
324
- <li>Connection pool stats are captured automatically at error time</li>
325
- <li>Stats include pool size, busy, idle, dead, and waiting connections</li>
326
- <li>This section shows pool health per-error, sorted by stress score</li>
327
- </ul>
328
- </div>
329
- </div>
330
- </div>
331
- <% else %>
332
- <div class="row mb-4">
333
- <div class="col-md-3">
334
- <div class="card text-center">
335
- <div class="card-body">
336
- <div class="display-6 text-info"><%= @errors_with_pool %></div>
337
- <small class="text-muted">Errors with Pool Data</small>
338
- </div>
339
- </div>
340
- </div>
341
- <div class="col-md-3">
342
- <div class="card text-center">
343
- <div class="card-body">
344
- <% util_color = @max_utilization >= 80 ? "danger" : (@max_utilization >= 60 ? "warning" : "success") %>
345
- <div class="display-6 text-<%= util_color %>"><%= @max_utilization %>%</div>
346
- <small class="text-muted">Peak Utilization</small>
347
- </div>
348
- </div>
349
- </div>
350
- <div class="col-md-3">
351
- <div class="card text-center">
352
- <div class="card-body">
353
- <% dead_color = @total_dead > 0 ? "danger" : "success" %>
354
- <div class="display-6 text-<%= dead_color %>"><%= @total_dead %></div>
355
- <small class="text-muted">Total Dead</small>
356
- </div>
357
- </div>
358
- </div>
359
- <div class="col-md-3">
360
- <div class="card text-center">
361
- <div class="card-body">
362
- <% waiting_color = @total_waiting > 0 ? "warning" : "success" %>
363
- <div class="display-6 text-<%= waiting_color %>"><%= @total_waiting %></div>
364
- <small class="text-muted">Total Waiting</small>
365
- </div>
366
- </div>
367
- </div>
297
+ <%# ===== SECTION C: Historical Connection Pool at Error Time ===== %>
298
+ <div class="card" style="margin-bottom: var(--space-4);">
299
+ <div style="display: flex; justify-content: space-between; align-items: center; padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border-primary);">
300
+ <span style="font-size: 13px; font-weight: 600;">
301
+ <i class="bi bi-clock-history me-2"></i>Connection Pool by Error
302
+ <% if @errors_with_pool > 0 %>
303
+ <span class="badge bg-info"><%= @errors_with_pool %></span>
304
+ <% end %>
305
+ </span>
306
+ <% if @errors_with_pool > 0 %>
307
+ <small style="color: var(--text-tertiary);"><%== @pagy.info_tag %></small>
308
+ <% end %>
368
309
  </div>
369
310
 
370
- <div class="card mb-4">
371
- <div class="card-header bg-white d-flex justify-content-between align-items-center">
372
- <h5 class="mb-0">
373
- <i class="bi bi-database text-info me-2"></i>
374
- Connection Pool by Error
375
- <span class="badge bg-info"><%= @errors_with_pool %></span>
376
- </h5>
377
- <small class="text-muted"><%== @pagy.info_tag %></small>
311
+ <% if @errors_with_pool == 0 %>
312
+ <div class="red-empty-state" style="padding: var(--space-6);">
313
+ <div class="red-empty-state-icon" style="background: var(--status-success-bg); color: var(--status-success);"><i class="bi bi-check-lg"></i></div>
314
+ <div class="red-empty-state-title">No Connection Pool Data Found</div>
315
+ <p style="color: var(--text-tertiary); font-size: 13px; max-width: 400px; margin: 0 auto;">
316
+ No connection pool stats were detected in system health snapshots over the last <%= @days %> days.
317
+ Enable <code>enable_system_health = true</code> to capture pool stats at error time.
318
+ </p>
378
319
  </div>
320
+ <% else %>
379
321
  <div class="card-body p-0">
380
322
  <div class="table-responsive">
381
323
  <table class="table table-hover mb-0">
@@ -430,13 +372,13 @@
430
372
  </table>
431
373
  </div>
432
374
  </div>
433
- <div class="card-footer bg-white border-top d-flex justify-content-between align-items-center">
375
+ <div style="display: flex; justify-content: space-between; align-items: center; padding: var(--space-3) var(--space-5); border-top: 1px solid var(--border-primary); font-size: 12px;">
434
376
  <div>
435
- <small class="text-muted">
436
- <i class="bi bi-lightbulb text-warning"></i> High utilization during errors may indicate connection pool exhaustion or long-running queries.
377
+ <small style="color: var(--text-tertiary);">
378
+ <i class="bi bi-lightbulb" style="color: var(--status-caution);"></i> High utilization during errors may indicate connection pool exhaustion or long-running queries.
437
379
  </small>
438
380
  <small class="ms-3">
439
- <a href="https://guides.rubyonrails.org/configuring.html#configuring-a-database" target="_blank" rel="noopener" class="text-decoration-none">
381
+ <a href="https://guides.rubyonrails.org/configuring.html#configuring-a-database" target="_blank" rel="noopener" style="color: var(--accent); text-decoration: none;">
440
382
  <i class="bi bi-book"></i> Database Guide <i class="bi bi-box-arrow-up-right" style="font-size: 0.7em;"></i>
441
383
  </a>
442
384
  </small>
@@ -445,6 +387,6 @@
445
387
  <%== @pagy.series_nav(:bootstrap) if @pagy.pages > 1 %>
446
388
  </div>
447
389
  </div>
448
- </div>
449
- <% end %>
390
+ <% end %>
391
+ </div>
450
392
  </div>
@@ -1,8 +1,8 @@
1
1
  <% content_for :page_title, "Deprecation Warnings" %>
2
2
 
3
- <div class="container-fluid py-4">
3
+ <div>
4
4
  <div class="d-flex justify-content-between align-items-center mb-4">
5
- <h1 class="h3 mb-0">
5
+ <h1 style="font-size: 20px; font-weight: 700; margin: 0;">
6
6
  <i class="bi bi-exclamation-triangle me-2"></i>
7
7
  Deprecation Warnings
8
8
  </h1>
@@ -21,9 +21,9 @@
21
21
  </div>
22
22
 
23
23
  <% if @unique_count == 0 %>
24
- <div class="text-center py-5">
25
- <i class="bi bi-check-circle display-1 text-success mb-3"></i>
26
- <h4 class="text-muted">No Deprecation Warnings Found</h4>
24
+ <div class="red-empty-state">
25
+ <div class="red-empty-state-icon" style="background: var(--status-success-bg); color: var(--status-success);"><i class="bi bi-check-lg"></i></div>
26
+ <div class="red-empty-state-title">No Deprecation Warnings Found</div>
27
27
  <p class="text-muted">
28
28
  No deprecation warnings were detected in error breadcrumbs over the last <%= @days %> days.
29
29
  </p>
@@ -67,7 +67,7 @@
67
67
  </div>
68
68
 
69
69
  <div class="card mb-4">
70
- <div class="card-header bg-white d-flex justify-content-between align-items-center">
70
+ <div class="card-header d-flex justify-content-between align-items-center">
71
71
  <h5 class="mb-0">
72
72
  <i class="bi bi-exclamation-triangle text-danger me-2"></i>
73
73
  All Deprecation Warnings
@@ -109,7 +109,7 @@
109
109
  </table>
110
110
  </div>
111
111
  </div>
112
- <div class="card-footer bg-white border-top d-flex justify-content-between align-items-center">
112
+ <div class="card-footer border-top d-flex justify-content-between align-items-center">
113
113
  <div>
114
114
  <small class="text-muted">
115
115
  <i class="bi bi-lightbulb text-warning"></i> Fix deprecations before upgrading Rails to avoid breaking changes.
@@ -1,8 +1,8 @@
1
1
  <% content_for :page_title, "Diagnostic Dumps" %>
2
2
 
3
- <div class="container-fluid py-4">
3
+ <div>
4
4
  <div class="d-flex justify-content-between align-items-center mb-4">
5
- <h1 class="h3 mb-0">
5
+ <h1 style="font-size: 20px; font-weight: 700; margin: 0;">
6
6
  <i class="bi bi-clipboard-pulse me-2"></i>
7
7
  Diagnostic Dumps
8
8
  </h1>
@@ -13,9 +13,9 @@
13
13
  </div>
14
14
 
15
15
  <% if @total_dumps == 0 %>
16
- <div class="text-center py-5">
16
+ <div class="red-empty-state">
17
17
  <i class="bi bi-clipboard-pulse display-1 text-muted mb-3"></i>
18
- <h4 class="text-muted">No Diagnostic Dumps Yet</h4>
18
+ <div class="red-empty-state-title">No Diagnostic Dumps Yet</div>
19
19
  <p class="text-muted">
20
20
  Capture an on-demand snapshot of your system state for debugging.
21
21
  </p>
@@ -68,7 +68,7 @@
68
68
  </div>
69
69
 
70
70
  <div class="card mb-4">
71
- <div class="card-header bg-white d-flex justify-content-between align-items-center">
71
+ <div class="card-header d-flex justify-content-between align-items-center">
72
72
  <h5 class="mb-0">
73
73
  <i class="bi bi-clipboard-pulse text-info me-2"></i>
74
74
  Dump History
@@ -165,7 +165,7 @@
165
165
  </div>
166
166
  <% end %>
167
167
  </div>
168
- <div class="card-footer bg-white border-top d-flex justify-content-between align-items-center">
168
+ <div class="card-footer border-top d-flex justify-content-between align-items-center">
169
169
  <div>
170
170
  <small class="text-muted">
171
171
  <i class="bi bi-lightbulb text-warning"></i>