rails_error_dashboard 0.5.15 → 0.6.1

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/rails_error_dashboard/application_controller.rb +37 -12
  3. data/app/controllers/rails_error_dashboard/errors_controller.rb +48 -26
  4. data/app/helpers/rails_error_dashboard/application_helper.rb +12 -5
  5. data/app/views/layouts/rails_error_dashboard.html.erb +1219 -1927
  6. data/app/views/rails_error_dashboard/errors/_breadcrumbs_group.html.erb +4 -4
  7. data/app/views/rails_error_dashboard/errors/_co_occurring_errors.html.erb +1 -1
  8. data/app/views/rails_error_dashboard/errors/_discussion.html.erb +3 -3
  9. data/app/views/rails_error_dashboard/errors/_error_cascades.html.erb +1 -1
  10. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +69 -79
  11. data/app/views/rails_error_dashboard/errors/_instance_variables.html.erb +1 -1
  12. data/app/views/rails_error_dashboard/errors/_issue_section.html.erb +1 -1
  13. data/app/views/rails_error_dashboard/errors/_local_variables.html.erb +1 -1
  14. data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +2 -2
  15. data/app/views/rails_error_dashboard/errors/_request_context.html.erb +1 -1
  16. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +1 -1
  17. data/app/views/rails_error_dashboard/errors/_similar_errors.html.erb +1 -1
  18. data/app/views/rails_error_dashboard/errors/_timeline.html.erb +4 -4
  19. data/app/views/rails_error_dashboard/errors/actioncable_health_summary.html.erb +6 -6
  20. data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +6 -6
  21. data/app/views/rails_error_dashboard/errors/analytics.html.erb +34 -50
  22. data/app/views/rails_error_dashboard/errors/cache_health_summary.html.erb +7 -7
  23. data/app/views/rails_error_dashboard/errors/correlation.html.erb +11 -11
  24. data/app/views/rails_error_dashboard/errors/database_health_summary.html.erb +114 -172
  25. data/app/views/rails_error_dashboard/errors/deprecations.html.erb +7 -7
  26. data/app/views/rails_error_dashboard/errors/diagnostic_dumps.html.erb +6 -6
  27. data/app/views/rails_error_dashboard/errors/index.html.erb +311 -613
  28. data/app/views/rails_error_dashboard/errors/job_health_summary.html.erb +7 -7
  29. data/app/views/rails_error_dashboard/errors/n_plus_one_summary.html.erb +7 -7
  30. data/app/views/rails_error_dashboard/errors/overview.html.erb +192 -363
  31. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +11 -11
  32. data/app/views/rails_error_dashboard/errors/rack_attack_summary.html.erb +6 -6
  33. data/app/views/rails_error_dashboard/errors/releases.html.erb +6 -6
  34. data/app/views/rails_error_dashboard/errors/settings.html.erb +53 -51
  35. data/app/views/rails_error_dashboard/errors/show.html.erb +200 -203
  36. data/app/views/rails_error_dashboard/errors/swallowed_exceptions.html.erb +19 -19
  37. data/app/views/rails_error_dashboard/errors/user_impact.html.erb +6 -6
  38. data/config/routes.rb +1 -0
  39. data/lib/rails_error_dashboard/configuration.rb +6 -0
  40. data/lib/rails_error_dashboard/services/error_broadcaster.rb +1 -1
  41. data/lib/rails_error_dashboard/services/system_health_snapshot.rb +1 -1
  42. data/lib/rails_error_dashboard/test_error.rb +7 -0
  43. data/lib/rails_error_dashboard/version.rb +1 -1
  44. data/lib/rails_error_dashboard.rb +1 -0
  45. metadata +3 -2
@@ -3,7 +3,7 @@
3
3
  <script>
4
4
  // Dynamic chart colors based on theme
5
5
  window.getChartColors = function() {
6
- const isDark = document.body.classList.contains('dark-mode');
6
+ const isDark = document.documentElement.getAttribute('data-theme') === 'dark';
7
7
  return {
8
8
  textColor: isDark ? '#cdd6f4' : '#1f2937',
9
9
  gridColor: isDark ? 'rgba(88, 91, 112, 0.2)' : 'rgba(0, 0, 0, 0.1)'
@@ -32,53 +32,37 @@
32
32
  };
33
33
  </script>
34
34
 
35
- <div class="py-4">
36
- <div class="d-flex justify-content-between align-items-center mb-4">
37
- <h2 class="mb-0"><i class="bi bi-graph-up text-primary"></i> Error Analytics</h2>
38
- <div>
39
- <%= form_with url: analytics_errors_path, method: :get, class: "d-flex gap-2" do %>
40
- <%= select_tag :days, options_for_select([
41
- ['Last 7 Days', 7],
42
- ['Last 14 Days', 14],
43
- ['Last 30 Days', 30],
44
- ['Last 60 Days', 60],
45
- ['Last 90 Days', 90]
46
- ], @days), class: "form-select", onchange: "this.form.submit()" %>
47
- <% end %>
48
- </div>
35
+ <div>
36
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-4);">
37
+ <h1 style="font-size: 20px; font-weight: 700; margin: 0;">Analytics</h1>
38
+ </div>
39
+
40
+ <!-- Time range pills -->
41
+ <div style="display: flex; gap: 6px; margin-bottom: var(--space-6);">
42
+ <% [['7d', 7], ['14d', 14], ['30d', 30], ['60d', 60], ['90d', 90]].each do |label, days| %>
43
+ <%= link_to analytics_errors_path(days: days), class: "filter-pill #{@days == days ? 'active' : ''}", style: "text-decoration: none;" do %><%= label %><% end %>
44
+ <% end %>
49
45
  </div>
50
46
 
51
47
  <!-- Summary Stats -->
52
- <div class="row g-4 mb-4">
53
- <div class="col-md-4">
54
- <div class="card stat-card border-primary">
55
- <div class="card-body">
56
- <div class="stat-label mb-2 text-primary">Total Errors</div>
57
- <div class="stat-value text-primary"><%= @error_stats[:total] %></div>
58
- </div>
59
- </div>
48
+ <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-4); margin-bottom: var(--space-6);">
49
+ <div class="card stat-card" style="border-left: 3px solid var(--accent); padding: var(--space-5) var(--space-6);">
50
+ <div class="stat-label" style="margin-bottom: 4px;">Total Errors</div>
51
+ <span class="stat-value"><%= @error_stats[:total] %></span>
60
52
  </div>
61
- <div class="col-md-4">
62
- <div class="card stat-card border-danger">
63
- <div class="card-body">
64
- <div class="stat-label mb-2 text-danger">Unresolved</div>
65
- <div class="stat-value text-danger"><%= @error_stats[:unresolved] %></div>
66
- </div>
67
- </div>
53
+ <div class="card stat-card" style="border-left: 3px solid var(--status-critical); padding: var(--space-5) var(--space-6);">
54
+ <div class="stat-label" style="margin-bottom: 4px;">Unresolved</div>
55
+ <span class="stat-value" style="color: var(--status-critical);"><%= @error_stats[:unresolved] %></span>
68
56
  </div>
69
- <div class="col-md-4">
70
- <div class="card stat-card border-success">
71
- <div class="card-body">
72
- <div class="stat-label mb-2 text-success">Resolution Rate</div>
73
- <div class="stat-value text-success"><%= @resolution_rate %>%</div>
74
- </div>
75
- </div>
57
+ <div class="card stat-card" style="border-left: 3px solid var(--status-success); padding: var(--space-5) var(--space-6);">
58
+ <div class="stat-label" style="margin-bottom: 4px;">Resolution Rate</div>
59
+ <span class="stat-value" style="color: var(--status-success);"><%= @resolution_rate %>%</span>
76
60
  </div>
77
61
  </div>
78
62
 
79
63
  <!-- Error Trend Chart -->
80
64
  <div class="card mb-4">
81
- <div class="card-header bg-white">
65
+ <div class="card-header">
82
66
  <h5 class="mb-0"><i class="bi bi-graph-up"></i> Error Trend (Last <%= @days %> Days)</h5>
83
67
  </div>
84
68
  <div class="card-body">
@@ -87,7 +71,7 @@
87
71
  document.addEventListener('DOMContentLoaded', function() {
88
72
  const colors = window.getChartColors();
89
73
  new Chartkick.LineChart("errors-over-time-chart", <%= raw @errors_over_time.to_json %>, {
90
- color: "#8B5CF6",
74
+ color: "#DC2626",
91
75
  curve: false,
92
76
  points: true,
93
77
  height: "300px",
@@ -123,7 +107,7 @@
123
107
  <div class="row g-4 mb-4">
124
108
  <div class="col-md-12">
125
109
  <div class="card">
126
- <div class="card-header bg-white">
110
+ <div class="card-header">
127
111
  <h5 class="mb-0"><i class="bi bi-phone"></i> Errors by Platform</h5>
128
112
  </div>
129
113
  <div class="card-body">
@@ -160,7 +144,7 @@
160
144
  });
161
145
  </script>
162
146
  </div>
163
- <div class="card-footer bg-white border-top-0">
147
+ <div class="card-footer border-top-0">
164
148
  <div class="d-flex gap-2 flex-wrap">
165
149
  <small class="text-muted me-2">Quick Links:</small>
166
150
  <% @errors_by_platform.keys.each do |platform| %>
@@ -177,7 +161,7 @@
177
161
  <div class="row g-4 mb-4">
178
162
  <div class="col-md-12">
179
163
  <div class="card">
180
- <div class="card-header bg-white">
164
+ <div class="card-header">
181
165
  <h5 class="mb-0"><i class="bi bi-bug"></i> Top 10 Error Types</h5>
182
166
  </div>
183
167
  <div class="card-body">
@@ -219,7 +203,7 @@
219
203
  <div class="row g-4 mb-4">
220
204
  <div class="col-md-12">
221
205
  <div class="card">
222
- <div class="card-header bg-white">
206
+ <div class="card-header">
223
207
  <h5 class="mb-0"><i class="bi bi-clock"></i> Errors by Hour of Day</h5>
224
208
  </div>
225
209
  <div class="card-body">
@@ -228,7 +212,7 @@
228
212
  document.addEventListener('DOMContentLoaded', function() {
229
213
  const colors = window.getChartColors();
230
214
  new Chartkick.ColumnChart("errors-by-hour-chart", <%= raw @errors_by_hour.to_json %>, {
231
- color: "#8B5CF6",
215
+ color: "#DC2626",
232
216
  height: "300px",
233
217
  xtitle: "Hour",
234
218
  ytitle: "Number of Errors",
@@ -262,7 +246,7 @@
262
246
  <div class="row g-4 mb-4">
263
247
  <div class="col-md-12">
264
248
  <div class="card">
265
- <div class="card-header bg-white">
249
+ <div class="card-header">
266
250
  <h5 class="mb-0"><i class="bi bi-people"></i> Top 10 Affected Users</h5>
267
251
  </div>
268
252
  <div class="card-body p-0">
@@ -285,7 +269,7 @@
285
269
  <div class="row g-4">
286
270
  <div class="col-md-12">
287
271
  <div class="card">
288
- <div class="card-header bg-white d-flex justify-content-between align-items-center">
272
+ <div class="card-header d-flex justify-content-between align-items-center">
289
273
  <h5 class="mb-0"><i class="bi bi-list-check"></i> Error Type Breakdown</h5>
290
274
  <small class="text-muted">Last <%= @days %> days</small>
291
275
  </div>
@@ -334,7 +318,7 @@
334
318
 
335
319
  <!-- Recurring Issues Analysis -->
336
320
  <div class="card mb-4">
337
- <div class="card-header bg-white">
321
+ <div class="card-header">
338
322
  <h5 class="mb-0"><i class="bi bi-arrow-repeat"></i> Recurring Issues</h5>
339
323
  </div>
340
324
  <div class="card-body">
@@ -421,7 +405,7 @@
421
405
  <!-- Errors by Version Chart -->
422
406
  <div class="col-md-8">
423
407
  <div class="card">
424
- <div class="card-header bg-white">
408
+ <div class="card-header">
425
409
  <h5 class="mb-0"><i class="bi bi-git"></i> Errors by Release Version</h5>
426
410
  </div>
427
411
  <div class="card-body">
@@ -447,7 +431,7 @@
447
431
  <!-- Release Comparison Card -->
448
432
  <div class="col-md-4">
449
433
  <div class="card">
450
- <div class="card-header bg-white">
434
+ <div class="card-header">
451
435
  <h5 class="mb-0">Latest vs Previous</h5>
452
436
  </div>
453
437
  <div class="card-body">
@@ -510,7 +494,7 @@
510
494
  <!-- MTTR (Mean Time to Resolution) -->
511
495
  <% if @mttr_stats[:total_resolved] > 0 %>
512
496
  <div class="card mb-4">
513
- <div class="card-header bg-white">
497
+ <div class="card-header">
514
498
  <h5 class="mb-0"><i class="bi bi-clock-history"></i> Resolution Performance (MTTR)</h5>
515
499
  </div>
516
500
  <div class="card-body">
@@ -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>