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.
- checksums.yaml +4 -4
- data/app/controllers/rails_error_dashboard/application_controller.rb +37 -12
- data/app/controllers/rails_error_dashboard/errors_controller.rb +48 -26
- data/app/helpers/rails_error_dashboard/application_helper.rb +12 -5
- data/app/views/layouts/rails_error_dashboard.html.erb +1219 -1927
- 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 +4 -4
- 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 +311 -613
- 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 +53 -51
- data/app/views/rails_error_dashboard/errors/show.html.erb +200 -203
- data/app/views/rails_error_dashboard/errors/swallowed_exceptions.html.erb +19 -19
- data/app/views/rails_error_dashboard/errors/user_impact.html.erb +6 -6
- data/config/routes.rb +1 -0
- data/lib/rails_error_dashboard/configuration.rb +6 -0
- data/lib/rails_error_dashboard/services/error_broadcaster.rb +1 -1
- data/lib/rails_error_dashboard/services/system_health_snapshot.rb +1 -1
- data/lib/rails_error_dashboard/test_error.rb +7 -0
- data/lib/rails_error_dashboard/version.rb +1 -1
- data/lib/rails_error_dashboard.rb +1 -0
- metadata +3 -2
|
@@ -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>
|