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.
- checksums.yaml +4 -4
- data/app/controllers/rails_error_dashboard/errors_controller.rb +31 -26
- data/app/helpers/rails_error_dashboard/application_helper.rb +12 -5
- data/app/views/layouts/rails_error_dashboard.html.erb +1217 -1935
- data/app/views/rails_error_dashboard/errors/_breadcrumbs_group.html.erb +4 -4
- data/app/views/rails_error_dashboard/errors/_co_occurring_errors.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_discussion.html.erb +3 -3
- data/app/views/rails_error_dashboard/errors/_error_cascades.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_error_row.html.erb +69 -79
- data/app/views/rails_error_dashboard/errors/_instance_variables.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_issue_section.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_local_variables.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +2 -2
- data/app/views/rails_error_dashboard/errors/_request_context.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_similar_errors.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/_timeline.html.erb +1 -1
- data/app/views/rails_error_dashboard/errors/actioncable_health_summary.html.erb +6 -6
- data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +6 -6
- data/app/views/rails_error_dashboard/errors/analytics.html.erb +34 -50
- data/app/views/rails_error_dashboard/errors/cache_health_summary.html.erb +7 -7
- data/app/views/rails_error_dashboard/errors/correlation.html.erb +11 -11
- data/app/views/rails_error_dashboard/errors/database_health_summary.html.erb +114 -172
- data/app/views/rails_error_dashboard/errors/deprecations.html.erb +7 -7
- data/app/views/rails_error_dashboard/errors/diagnostic_dumps.html.erb +6 -6
- data/app/views/rails_error_dashboard/errors/index.html.erb +292 -620
- data/app/views/rails_error_dashboard/errors/job_health_summary.html.erb +7 -7
- data/app/views/rails_error_dashboard/errors/n_plus_one_summary.html.erb +7 -7
- data/app/views/rails_error_dashboard/errors/overview.html.erb +192 -363
- data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +11 -11
- data/app/views/rails_error_dashboard/errors/rack_attack_summary.html.erb +6 -6
- data/app/views/rails_error_dashboard/errors/releases.html.erb +6 -6
- data/app/views/rails_error_dashboard/errors/settings.html.erb +32 -52
- data/app/views/rails_error_dashboard/errors/show.html.erb +200 -203
- data/app/views/rails_error_dashboard/errors/swallowed_exceptions.html.erb +7 -7
- data/app/views/rails_error_dashboard/errors/user_impact.html.erb +6 -6
- data/lib/rails_error_dashboard/configuration.rb +6 -0
- data/lib/rails_error_dashboard/version.rb +1 -1
- metadata +2 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<% content_for :page_title, "Cache Health" %>
|
|
2
2
|
|
|
3
|
-
<div
|
|
3
|
+
<div>
|
|
4
4
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
5
|
-
<h1
|
|
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="
|
|
25
|
-
<
|
|
26
|
-
<
|
|
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
|
|
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
|
|
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
|
|
3
|
+
<div>
|
|
4
4
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
5
|
-
<h1
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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="
|
|
347
|
+
<div class="red-empty-state">
|
|
348
348
|
<i class="bi bi-diagram-3 display-1 text-muted mb-3"></i>
|
|
349
|
-
<
|
|
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
|
|
3
|
+
<div>
|
|
4
4
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
5
|
-
<h1
|
|
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
|
|
11
|
-
<%= link_to database_health_summary_errors_path(days: 7), class: "btn btn-sm #{@days == 7 ? 'btn-primary' : 'btn-outline-primary'}" do %>
|
|
12
|
-
|
|
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:
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<
|
|
31
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
<
|
|
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
|
-
|
|
83
|
-
|
|
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
|
|
89
|
-
<div class="
|
|
90
|
-
<div class="
|
|
91
|
-
|
|
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="
|
|
98
|
-
<div class="
|
|
99
|
-
|
|
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="
|
|
106
|
-
<div class="
|
|
107
|
-
|
|
108
|
-
|
|
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="
|
|
115
|
-
<div class="
|
|
116
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
371
|
-
<div class="
|
|
372
|
-
<
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
|
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
|
|
436
|
-
<i class="bi bi-lightbulb
|
|
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"
|
|
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
|
-
|
|
449
|
-
|
|
390
|
+
<% end %>
|
|
391
|
+
</div>
|
|
450
392
|
</div>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<% content_for :page_title, "Deprecation Warnings" %>
|
|
2
2
|
|
|
3
|
-
<div
|
|
3
|
+
<div>
|
|
4
4
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
5
|
-
<h1
|
|
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="
|
|
25
|
-
<
|
|
26
|
-
<
|
|
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
|
|
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
|
|
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
|
|
3
|
+
<div>
|
|
4
4
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
5
|
-
<h1
|
|
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="
|
|
16
|
+
<div class="red-empty-state">
|
|
17
17
|
<i class="bi bi-clipboard-pulse display-1 text-muted mb-3"></i>
|
|
18
|
-
<
|
|
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
|
|
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
|
|
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>
|