rails_error_dashboard 0.1.3 → 0.1.5
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/README.md +26 -0
- data/app/assets/stylesheets/rails_error_dashboard/application.css +15 -926
- data/app/controllers/rails_error_dashboard/errors_controller.rb +46 -1
- data/app/helpers/rails_error_dashboard/application_helper.rb +38 -0
- data/app/models/rails_error_dashboard/error_log.rb +14 -0
- data/app/views/layouts/rails_error_dashboard/application.html.erb +39 -1
- data/app/views/layouts/rails_error_dashboard.html.erb +20 -2
- data/app/views/rails_error_dashboard/errors/analytics.html.erb +317 -0
- data/app/views/rails_error_dashboard/errors/correlation.html.erb +8 -0
- data/app/views/rails_error_dashboard/errors/index.html.erb +44 -7
- data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +3 -0
- data/app/views/rails_error_dashboard/errors/settings.html.erb +575 -0
- data/config/routes.rb +7 -1
- data/lib/generators/rails_error_dashboard/uninstall/uninstall_generator.rb +317 -0
- data/lib/rails_error_dashboard/queries/errors_list.rb +77 -5
- data/lib/rails_error_dashboard/queries/mttr_stats.rb +111 -0
- data/lib/rails_error_dashboard/queries/recurring_issues.rb +97 -0
- data/lib/rails_error_dashboard/version.rb +1 -1
- data/lib/rails_error_dashboard.rb +3 -0
- data/lib/tasks/rails_error_dashboard_tasks.rake +85 -0
- metadata +21 -2
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
<!-- Subscribe to Turbo Stream updates -->
|
|
2
|
-
|
|
1
|
+
<!-- Subscribe to Turbo Stream updates (only if ActionCable is available) -->
|
|
2
|
+
<% if defined?(ActionCable) %>
|
|
3
|
+
<%= turbo_stream_from "error_list" %>
|
|
4
|
+
<% end %>
|
|
3
5
|
|
|
4
6
|
<div class="py-4">
|
|
5
7
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
@@ -124,6 +126,16 @@
|
|
|
124
126
|
<h5 class="mb-0">Filters & Search</h5>
|
|
125
127
|
</div>
|
|
126
128
|
<div class="card-body">
|
|
129
|
+
<!-- Quick Filter Buttons -->
|
|
130
|
+
<div class="d-flex gap-2 mb-3">
|
|
131
|
+
<%= link_to "All Errors", errors_path,
|
|
132
|
+
class: "btn btn-sm #{params[:assigned_to].blank? ? 'btn-primary' : 'btn-outline-primary'}" %>
|
|
133
|
+
<%= link_to "Unassigned", errors_path(assigned_to: '__unassigned__'),
|
|
134
|
+
class: "btn btn-sm #{params[:assigned_to] == '__unassigned__' ? 'btn-primary' : 'btn-outline-primary'}" %>
|
|
135
|
+
<%= link_to "My Errors", errors_path(assigned_to: current_user_name),
|
|
136
|
+
class: "btn btn-sm #{params[:assigned_to] == current_user_name ? 'btn-primary' : 'btn-outline-primary'}" %>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
127
139
|
<%= form_with url: errors_path, method: :get, class: "row g-3", data: { turbo: false } do %>
|
|
128
140
|
<div class="col-md-4">
|
|
129
141
|
<%= text_field_tag :search, params[:search], placeholder: "Search errors...", class: "form-control" %>
|
|
@@ -149,6 +161,31 @@
|
|
|
149
161
|
], params[:severity]), class: "form-select" %>
|
|
150
162
|
</div>
|
|
151
163
|
|
|
164
|
+
<!-- Time Range Filter -->
|
|
165
|
+
<div class="col-md-2">
|
|
166
|
+
<%= select_tag :timeframe, options_for_select([
|
|
167
|
+
['All Time', ''],
|
|
168
|
+
['Last Hour', 'last_hour'],
|
|
169
|
+
['Today', 'today'],
|
|
170
|
+
['Yesterday', 'yesterday'],
|
|
171
|
+
['Last 7 Days', 'last_7_days'],
|
|
172
|
+
['Last 30 Days', 'last_30_days'],
|
|
173
|
+
['Last 90 Days', 'last_90_days']
|
|
174
|
+
], params[:timeframe]), class: "form-select" %>
|
|
175
|
+
</div>
|
|
176
|
+
|
|
177
|
+
<!-- Frequency Filter -->
|
|
178
|
+
<div class="col-md-2">
|
|
179
|
+
<%= select_tag :frequency, options_for_select([
|
|
180
|
+
['All Frequencies', ''],
|
|
181
|
+
['Once', 'once'],
|
|
182
|
+
['2-9 Times', 'few'],
|
|
183
|
+
['10-99 Times', 'frequent'],
|
|
184
|
+
['100+ Times', 'very_frequent'],
|
|
185
|
+
['Recurring (Active)', 'recurring']
|
|
186
|
+
], params[:frequency]), class: "form-select" %>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
152
189
|
<!-- Phase 3: Workflow Filters -->
|
|
153
190
|
<div class="col-md-2">
|
|
154
191
|
<%= select_tag :status, options_for_select([
|
|
@@ -253,13 +290,13 @@
|
|
|
253
290
|
<th style="width: 40px;">
|
|
254
291
|
<input type="checkbox" id="select-all" class="form-check-input">
|
|
255
292
|
</th>
|
|
256
|
-
<th
|
|
257
|
-
<th
|
|
293
|
+
<th><%= sortable_header("Severity", "severity") %></th>
|
|
294
|
+
<th><%= sortable_header("Error Type", "error_type") %></th>
|
|
258
295
|
<th>Message</th>
|
|
259
|
-
<th
|
|
260
|
-
<th
|
|
296
|
+
<th><%= sortable_header("Occurrences", "occurrence_count") %></th>
|
|
297
|
+
<th><%= sortable_header("First / Last Seen", "last_seen_at") %></th>
|
|
261
298
|
<% if @platforms.size > 1 %>
|
|
262
|
-
<th
|
|
299
|
+
<th><%= sortable_header("Platform", "platform") %></th>
|
|
263
300
|
<% end %>
|
|
264
301
|
<th>Status</th>
|
|
265
302
|
<th></th>
|
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
<div class="container-fluid py-4">
|
|
2
|
+
<!-- Page Header -->
|
|
3
|
+
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
4
|
+
<h1 class="h3 mb-0">
|
|
5
|
+
<i class="bi bi-gear me-2"></i>
|
|
6
|
+
Configuration Settings
|
|
7
|
+
</h1>
|
|
8
|
+
<div>
|
|
9
|
+
<%= link_to root_path, class: "btn btn-outline-secondary btn-sm" do %>
|
|
10
|
+
<i class="bi bi-arrow-left"></i> Back to Dashboard
|
|
11
|
+
<% end %>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="alert alert-info mb-4">
|
|
16
|
+
<i class="bi bi-info-circle me-2"></i>
|
|
17
|
+
<strong>Read-only view</strong> - These settings are configured in your initializer file:
|
|
18
|
+
<code>config/initializers/rails_error_dashboard.rb</code>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<!-- Core Features -->
|
|
22
|
+
<div class="card mb-4">
|
|
23
|
+
<div class="card-header bg-primary text-white">
|
|
24
|
+
<h5 class="mb-0">
|
|
25
|
+
<i class="bi bi-shield-check"></i> Core Features
|
|
26
|
+
</h5>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="card-body">
|
|
29
|
+
<div class="row">
|
|
30
|
+
<div class="col-md-6 mb-3">
|
|
31
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
32
|
+
<div>
|
|
33
|
+
<strong>Error Middleware</strong>
|
|
34
|
+
<br><small class="text-muted">Catches unhandled exceptions</small>
|
|
35
|
+
</div>
|
|
36
|
+
<% if @config.enable_middleware %>
|
|
37
|
+
<span class="badge bg-success fs-6">
|
|
38
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
39
|
+
</span>
|
|
40
|
+
<% else %>
|
|
41
|
+
<span class="badge bg-secondary fs-6">
|
|
42
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
43
|
+
</span>
|
|
44
|
+
<% end %>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<div class="col-md-6 mb-3">
|
|
49
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
50
|
+
<div>
|
|
51
|
+
<strong>Rails.error Subscriber</strong>
|
|
52
|
+
<br><small class="text-muted">Subscribes to Rails error events</small>
|
|
53
|
+
</div>
|
|
54
|
+
<% if @config.enable_error_subscriber %>
|
|
55
|
+
<span class="badge bg-success fs-6">
|
|
56
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
57
|
+
</span>
|
|
58
|
+
<% else %>
|
|
59
|
+
<span class="badge bg-secondary fs-6">
|
|
60
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
61
|
+
</span>
|
|
62
|
+
<% end %>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div class="col-md-6 mb-3">
|
|
67
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
68
|
+
<div>
|
|
69
|
+
<strong>Authentication</strong>
|
|
70
|
+
<br><small class="text-muted">HTTP Basic Auth protection</small>
|
|
71
|
+
</div>
|
|
72
|
+
<% if @config.require_authentication %>
|
|
73
|
+
<span class="badge bg-success fs-6">
|
|
74
|
+
<i class="bi bi-lock"></i> Required
|
|
75
|
+
</span>
|
|
76
|
+
<% else %>
|
|
77
|
+
<span class="badge bg-warning text-dark fs-6">
|
|
78
|
+
<i class="bi bi-unlock"></i> Disabled
|
|
79
|
+
</span>
|
|
80
|
+
<% end %>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div class="col-md-6 mb-3">
|
|
85
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
86
|
+
<div>
|
|
87
|
+
<strong>Data Retention</strong>
|
|
88
|
+
<br><small class="text-muted">How long errors are kept</small>
|
|
89
|
+
</div>
|
|
90
|
+
<span class="badge bg-info fs-6">
|
|
91
|
+
<%= @config.retention_days %> days
|
|
92
|
+
</span>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div class="col-md-6 mb-3">
|
|
97
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
98
|
+
<div>
|
|
99
|
+
<strong>Max Backtrace Lines</strong>
|
|
100
|
+
<br><small class="text-muted">Stack trace depth limit</small>
|
|
101
|
+
</div>
|
|
102
|
+
<span class="badge bg-info fs-6">
|
|
103
|
+
<%= @config.max_backtrace_lines %> lines
|
|
104
|
+
</span>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<div class="col-md-6 mb-3">
|
|
109
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
110
|
+
<div>
|
|
111
|
+
<strong>Sampling Rate</strong>
|
|
112
|
+
<br><small class="text-muted">Percentage of errors captured</small>
|
|
113
|
+
</div>
|
|
114
|
+
<span class="badge bg-info fs-6">
|
|
115
|
+
<%= (@config.sampling_rate * 100).to_i %>%
|
|
116
|
+
</span>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
<!-- Performance Settings -->
|
|
124
|
+
<div class="card mb-4">
|
|
125
|
+
<div class="card-header bg-warning text-dark">
|
|
126
|
+
<h5 class="mb-0">
|
|
127
|
+
<i class="bi bi-lightning-charge"></i> Performance Settings
|
|
128
|
+
</h5>
|
|
129
|
+
</div>
|
|
130
|
+
<div class="card-body">
|
|
131
|
+
<div class="row">
|
|
132
|
+
<div class="col-md-6 mb-3">
|
|
133
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
134
|
+
<div>
|
|
135
|
+
<strong>Async Logging</strong>
|
|
136
|
+
<br><small class="text-muted">Background job processing</small>
|
|
137
|
+
</div>
|
|
138
|
+
<% if @config.async_logging %>
|
|
139
|
+
<span class="badge bg-success fs-6">
|
|
140
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
141
|
+
<% if @config.async_adapter %>
|
|
142
|
+
(<%= @config.async_adapter %>)
|
|
143
|
+
<% end %>
|
|
144
|
+
</span>
|
|
145
|
+
<% else %>
|
|
146
|
+
<span class="badge bg-secondary fs-6">
|
|
147
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
148
|
+
</span>
|
|
149
|
+
<% end %>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<div class="col-md-6 mb-3">
|
|
154
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
155
|
+
<div>
|
|
156
|
+
<strong>Separate Database</strong>
|
|
157
|
+
<br><small class="text-muted">Dedicated DB for error logs</small>
|
|
158
|
+
</div>
|
|
159
|
+
<% if @config.use_separate_database %>
|
|
160
|
+
<span class="badge bg-success fs-6">
|
|
161
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
162
|
+
</span>
|
|
163
|
+
<% else %>
|
|
164
|
+
<span class="badge bg-secondary fs-6">
|
|
165
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
166
|
+
</span>
|
|
167
|
+
<% end %>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<!-- Notification Channels -->
|
|
175
|
+
<div class="card mb-4">
|
|
176
|
+
<div class="card-header bg-info text-white">
|
|
177
|
+
<h5 class="mb-0">
|
|
178
|
+
<i class="bi bi-bell"></i> Notification Channels
|
|
179
|
+
</h5>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="card-body">
|
|
182
|
+
<div class="row">
|
|
183
|
+
<div class="col-md-6 mb-3">
|
|
184
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
185
|
+
<div>
|
|
186
|
+
<strong>Slack</strong>
|
|
187
|
+
<br><small class="text-muted">Real-time notifications</small>
|
|
188
|
+
</div>
|
|
189
|
+
<% if @config.enable_slack_notifications %>
|
|
190
|
+
<span class="badge bg-success fs-6">
|
|
191
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
192
|
+
</span>
|
|
193
|
+
<% else %>
|
|
194
|
+
<span class="badge bg-secondary fs-6">
|
|
195
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
196
|
+
</span>
|
|
197
|
+
<% end %>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<div class="col-md-6 mb-3">
|
|
202
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
203
|
+
<div>
|
|
204
|
+
<strong>Email</strong>
|
|
205
|
+
<br><small class="text-muted">Email alerts</small>
|
|
206
|
+
</div>
|
|
207
|
+
<% if @config.enable_email_notifications %>
|
|
208
|
+
<span class="badge bg-success fs-6">
|
|
209
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
210
|
+
<% if @config.notification_email_recipients&.any? %>
|
|
211
|
+
(<%= @config.notification_email_recipients.count %> recipient<%= @config.notification_email_recipients.count != 1 ? 's' : '' %>)
|
|
212
|
+
<% end %>
|
|
213
|
+
</span>
|
|
214
|
+
<% else %>
|
|
215
|
+
<span class="badge bg-secondary fs-6">
|
|
216
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
217
|
+
</span>
|
|
218
|
+
<% end %>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
<div class="col-md-6 mb-3">
|
|
223
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
224
|
+
<div>
|
|
225
|
+
<strong>Discord</strong>
|
|
226
|
+
<br><small class="text-muted">Discord webhook notifications</small>
|
|
227
|
+
</div>
|
|
228
|
+
<% if @config.enable_discord_notifications %>
|
|
229
|
+
<span class="badge bg-success fs-6">
|
|
230
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
231
|
+
</span>
|
|
232
|
+
<% else %>
|
|
233
|
+
<span class="badge bg-secondary fs-6">
|
|
234
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
235
|
+
</span>
|
|
236
|
+
<% end %>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<div class="col-md-6 mb-3">
|
|
241
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
242
|
+
<div>
|
|
243
|
+
<strong>PagerDuty</strong>
|
|
244
|
+
<br><small class="text-muted">Critical error escalation</small>
|
|
245
|
+
</div>
|
|
246
|
+
<% if @config.enable_pagerduty_notifications %>
|
|
247
|
+
<span class="badge bg-success fs-6">
|
|
248
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
249
|
+
</span>
|
|
250
|
+
<% else %>
|
|
251
|
+
<span class="badge bg-secondary fs-6">
|
|
252
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
253
|
+
</span>
|
|
254
|
+
<% end %>
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<div class="col-md-6 mb-3">
|
|
259
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
260
|
+
<div>
|
|
261
|
+
<strong>Custom Webhooks</strong>
|
|
262
|
+
<br><small class="text-muted">Generic webhook endpoints</small>
|
|
263
|
+
</div>
|
|
264
|
+
<% if @config.enable_webhook_notifications %>
|
|
265
|
+
<span class="badge bg-success fs-6">
|
|
266
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
267
|
+
<% if @config.webhook_urls&.any? %>
|
|
268
|
+
(<%= @config.webhook_urls.count %> URL<%= @config.webhook_urls.count != 1 ? 's' : '' %>)
|
|
269
|
+
<% end %>
|
|
270
|
+
</span>
|
|
271
|
+
<% else %>
|
|
272
|
+
<span class="badge bg-secondary fs-6">
|
|
273
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
274
|
+
</span>
|
|
275
|
+
<% end %>
|
|
276
|
+
</div>
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
|
|
282
|
+
<!-- Advanced Analytics Features -->
|
|
283
|
+
<div class="card mb-4">
|
|
284
|
+
<div class="card-header bg-success text-white">
|
|
285
|
+
<h5 class="mb-0">
|
|
286
|
+
<i class="bi bi-graph-up"></i> Advanced Analytics Features
|
|
287
|
+
</h5>
|
|
288
|
+
</div>
|
|
289
|
+
<div class="card-body">
|
|
290
|
+
<div class="row">
|
|
291
|
+
<div class="col-md-6 mb-3">
|
|
292
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
293
|
+
<div>
|
|
294
|
+
<strong>Similar Errors (Fuzzy Matching)</strong>
|
|
295
|
+
<br><small class="text-muted">Find related errors by similarity</small>
|
|
296
|
+
</div>
|
|
297
|
+
<% if @config.enable_similar_errors %>
|
|
298
|
+
<span class="badge bg-success fs-6">
|
|
299
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
300
|
+
</span>
|
|
301
|
+
<% else %>
|
|
302
|
+
<span class="badge bg-secondary fs-6">
|
|
303
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
304
|
+
</span>
|
|
305
|
+
<% end %>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
|
|
309
|
+
<div class="col-md-6 mb-3">
|
|
310
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
311
|
+
<div>
|
|
312
|
+
<strong>Co-occurring Errors</strong>
|
|
313
|
+
<br><small class="text-muted">Errors happening together</small>
|
|
314
|
+
</div>
|
|
315
|
+
<% if @config.enable_co_occurring_errors %>
|
|
316
|
+
<span class="badge bg-success fs-6">
|
|
317
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
318
|
+
</span>
|
|
319
|
+
<% else %>
|
|
320
|
+
<span class="badge bg-secondary fs-6">
|
|
321
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
322
|
+
</span>
|
|
323
|
+
<% end %>
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
|
+
|
|
327
|
+
<div class="col-md-6 mb-3">
|
|
328
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
329
|
+
<div>
|
|
330
|
+
<strong>Error Cascades</strong>
|
|
331
|
+
<br><small class="text-muted">Parent→child error chains</small>
|
|
332
|
+
</div>
|
|
333
|
+
<% if @config.enable_error_cascades %>
|
|
334
|
+
<span class="badge bg-success fs-6">
|
|
335
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
336
|
+
</span>
|
|
337
|
+
<% else %>
|
|
338
|
+
<span class="badge bg-secondary fs-6">
|
|
339
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
340
|
+
</span>
|
|
341
|
+
<% end %>
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
|
|
345
|
+
<div class="col-md-6 mb-3">
|
|
346
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
347
|
+
<div>
|
|
348
|
+
<strong>Error Correlation</strong>
|
|
349
|
+
<br><small class="text-muted">Version/user/time analysis</small>
|
|
350
|
+
</div>
|
|
351
|
+
<% if @config.enable_error_correlation %>
|
|
352
|
+
<span class="badge bg-success fs-6">
|
|
353
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
354
|
+
</span>
|
|
355
|
+
<% else %>
|
|
356
|
+
<span class="badge bg-secondary fs-6">
|
|
357
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
358
|
+
</span>
|
|
359
|
+
<% end %>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
|
|
363
|
+
<div class="col-md-6 mb-3">
|
|
364
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
365
|
+
<div>
|
|
366
|
+
<strong>Platform Comparison</strong>
|
|
367
|
+
<br><small class="text-muted">iOS vs Android analytics</small>
|
|
368
|
+
</div>
|
|
369
|
+
<% if @config.enable_platform_comparison %>
|
|
370
|
+
<span class="badge bg-success fs-6">
|
|
371
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
372
|
+
</span>
|
|
373
|
+
<% else %>
|
|
374
|
+
<span class="badge bg-secondary fs-6">
|
|
375
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
376
|
+
</span>
|
|
377
|
+
<% end %>
|
|
378
|
+
</div>
|
|
379
|
+
</div>
|
|
380
|
+
|
|
381
|
+
<div class="col-md-6 mb-3">
|
|
382
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
383
|
+
<div>
|
|
384
|
+
<strong>Occurrence Patterns</strong>
|
|
385
|
+
<br><small class="text-muted">Cyclical/burst detection</small>
|
|
386
|
+
</div>
|
|
387
|
+
<% if @config.enable_occurrence_patterns %>
|
|
388
|
+
<span class="badge bg-success fs-6">
|
|
389
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
390
|
+
</span>
|
|
391
|
+
<% else %>
|
|
392
|
+
<span class="badge bg-secondary fs-6">
|
|
393
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
394
|
+
</span>
|
|
395
|
+
<% end %>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
|
|
399
|
+
<div class="col-md-6 mb-3">
|
|
400
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
401
|
+
<div>
|
|
402
|
+
<strong>Baseline Alerts</strong>
|
|
403
|
+
<br><small class="text-muted">Anomaly detection</small>
|
|
404
|
+
</div>
|
|
405
|
+
<% if @config.enable_baseline_alerts %>
|
|
406
|
+
<span class="badge bg-success fs-6">
|
|
407
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
408
|
+
(± <%= @config.baseline_alert_threshold_std_devs %>σ)
|
|
409
|
+
</span>
|
|
410
|
+
<% else %>
|
|
411
|
+
<span class="badge bg-secondary fs-6">
|
|
412
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
413
|
+
</span>
|
|
414
|
+
<% end %>
|
|
415
|
+
</div>
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
</div>
|
|
419
|
+
</div>
|
|
420
|
+
|
|
421
|
+
<!-- Active Plugins -->
|
|
422
|
+
<div class="card mb-4">
|
|
423
|
+
<div class="card-header bg-dark text-white">
|
|
424
|
+
<h5 class="mb-0">
|
|
425
|
+
<i class="bi bi-puzzle"></i> Active Plugins
|
|
426
|
+
</h5>
|
|
427
|
+
</div>
|
|
428
|
+
<div class="card-body">
|
|
429
|
+
<% if RailsErrorDashboard::PluginRegistry.any? %>
|
|
430
|
+
<div class="table-responsive">
|
|
431
|
+
<table class="table table-hover">
|
|
432
|
+
<thead>
|
|
433
|
+
<tr>
|
|
434
|
+
<th>Plugin Name</th>
|
|
435
|
+
<th>Version</th>
|
|
436
|
+
<th>Description</th>
|
|
437
|
+
<th>Status</th>
|
|
438
|
+
</tr>
|
|
439
|
+
</thead>
|
|
440
|
+
<tbody>
|
|
441
|
+
<% RailsErrorDashboard::PluginRegistry.info.each do |plugin| %>
|
|
442
|
+
<tr>
|
|
443
|
+
<td><strong><%= plugin[:name] %></strong></td>
|
|
444
|
+
<td><code><%= plugin[:version] %></code></td>
|
|
445
|
+
<td><%= plugin[:description] %></td>
|
|
446
|
+
<td>
|
|
447
|
+
<% if plugin[:enabled] %>
|
|
448
|
+
<span class="badge bg-success">
|
|
449
|
+
<i class="bi bi-check-circle"></i> Active
|
|
450
|
+
</span>
|
|
451
|
+
<% else %>
|
|
452
|
+
<span class="badge bg-secondary">
|
|
453
|
+
<i class="bi bi-pause-circle"></i> Inactive
|
|
454
|
+
</span>
|
|
455
|
+
<% end %>
|
|
456
|
+
</td>
|
|
457
|
+
</tr>
|
|
458
|
+
<% end %>
|
|
459
|
+
</tbody>
|
|
460
|
+
</table>
|
|
461
|
+
</div>
|
|
462
|
+
<% else %>
|
|
463
|
+
<div class="alert alert-secondary mb-0">
|
|
464
|
+
<i class="bi bi-info-circle me-2"></i>
|
|
465
|
+
No plugins are currently registered. You can create custom plugins to extend functionality.
|
|
466
|
+
</div>
|
|
467
|
+
<% end %>
|
|
468
|
+
</div>
|
|
469
|
+
</div>
|
|
470
|
+
|
|
471
|
+
<!-- Enhanced Metrics -->
|
|
472
|
+
<% if @config.app_version || @config.git_sha || @config.total_users_for_impact %>
|
|
473
|
+
<div class="card mb-4">
|
|
474
|
+
<div class="card-header bg-secondary text-white">
|
|
475
|
+
<h5 class="mb-0">
|
|
476
|
+
<i class="bi bi-speedometer"></i> Enhanced Metrics
|
|
477
|
+
</h5>
|
|
478
|
+
</div>
|
|
479
|
+
<div class="card-body">
|
|
480
|
+
<div class="row">
|
|
481
|
+
<% if @config.app_version %>
|
|
482
|
+
<div class="col-md-4 mb-3">
|
|
483
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
484
|
+
<div>
|
|
485
|
+
<strong>App Version</strong>
|
|
486
|
+
<br><small class="text-muted">Current application version</small>
|
|
487
|
+
</div>
|
|
488
|
+
<code class="fs-6"><%= @config.app_version %></code>
|
|
489
|
+
</div>
|
|
490
|
+
</div>
|
|
491
|
+
<% end %>
|
|
492
|
+
|
|
493
|
+
<% if @config.git_sha %>
|
|
494
|
+
<div class="col-md-4 mb-3">
|
|
495
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
496
|
+
<div>
|
|
497
|
+
<strong>Git SHA</strong>
|
|
498
|
+
<br><small class="text-muted">Deployed commit</small>
|
|
499
|
+
</div>
|
|
500
|
+
<code class="fs-6"><%= @config.git_sha[0..7] %></code>
|
|
501
|
+
</div>
|
|
502
|
+
</div>
|
|
503
|
+
<% end %>
|
|
504
|
+
|
|
505
|
+
<% if @config.total_users_for_impact %>
|
|
506
|
+
<div class="col-md-4 mb-3">
|
|
507
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
508
|
+
<div>
|
|
509
|
+
<strong>Total Users</strong>
|
|
510
|
+
<br><small class="text-muted">For impact % calculation</small>
|
|
511
|
+
</div>
|
|
512
|
+
<span class="badge bg-info fs-6"><%= @config.total_users_for_impact %></span>
|
|
513
|
+
</div>
|
|
514
|
+
</div>
|
|
515
|
+
<% end %>
|
|
516
|
+
</div>
|
|
517
|
+
</div>
|
|
518
|
+
</div>
|
|
519
|
+
<% end %>
|
|
520
|
+
|
|
521
|
+
<!-- Internal Logging -->
|
|
522
|
+
<div class="card mb-4">
|
|
523
|
+
<div class="card-header bg-light">
|
|
524
|
+
<h5 class="mb-0">
|
|
525
|
+
<i class="bi bi-terminal"></i> Internal Logging
|
|
526
|
+
</h5>
|
|
527
|
+
</div>
|
|
528
|
+
<div class="card-body">
|
|
529
|
+
<div class="row">
|
|
530
|
+
<div class="col-md-6 mb-3">
|
|
531
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
532
|
+
<div>
|
|
533
|
+
<strong>Internal Logging</strong>
|
|
534
|
+
<br><small class="text-muted">Gem debugging output</small>
|
|
535
|
+
</div>
|
|
536
|
+
<% if @config.enable_internal_logging %>
|
|
537
|
+
<span class="badge bg-warning text-dark fs-6">
|
|
538
|
+
<i class="bi bi-check-circle"></i> Enabled
|
|
539
|
+
</span>
|
|
540
|
+
<% else %>
|
|
541
|
+
<span class="badge bg-secondary fs-6">
|
|
542
|
+
<i class="bi bi-x-circle"></i> Disabled
|
|
543
|
+
</span>
|
|
544
|
+
<% end %>
|
|
545
|
+
</div>
|
|
546
|
+
</div>
|
|
547
|
+
|
|
548
|
+
<div class="col-md-6 mb-3">
|
|
549
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
550
|
+
<div>
|
|
551
|
+
<strong>Log Level</strong>
|
|
552
|
+
<br><small class="text-muted">Verbosity level</small>
|
|
553
|
+
</div>
|
|
554
|
+
<span class="badge bg-info fs-6">
|
|
555
|
+
<%= @config.log_level.to_s.upcase %>
|
|
556
|
+
</span>
|
|
557
|
+
</div>
|
|
558
|
+
</div>
|
|
559
|
+
</div>
|
|
560
|
+
</div>
|
|
561
|
+
</div>
|
|
562
|
+
|
|
563
|
+
<!-- Help Text -->
|
|
564
|
+
<div class="alert alert-light border">
|
|
565
|
+
<h6 class="alert-heading">
|
|
566
|
+
<i class="bi bi-question-circle me-2"></i>
|
|
567
|
+
Need to change these settings?
|
|
568
|
+
</h6>
|
|
569
|
+
<p class="mb-0">
|
|
570
|
+
Edit your configuration in <code>config/initializers/rails_error_dashboard.rb</code> and restart your application.
|
|
571
|
+
<br>
|
|
572
|
+
See the <a href="https://github.com/AnjanJ/rails_error_dashboard" target="_blank" class="alert-link">documentation</a> for more information.
|
|
573
|
+
</p>
|
|
574
|
+
</div>
|
|
575
|
+
</div>
|
data/config/routes.rb
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
RailsErrorDashboard::Engine.routes.draw do
|
|
2
|
-
root to: "errors#
|
|
2
|
+
root to: "errors#overview"
|
|
3
|
+
|
|
4
|
+
# Dashboard overview
|
|
5
|
+
get "overview", to: "errors#overview", as: :overview
|
|
6
|
+
|
|
7
|
+
# Settings page
|
|
8
|
+
get "settings", to: "errors#settings", as: :settings
|
|
3
9
|
|
|
4
10
|
resources :errors, only: [ :index, :show ] do
|
|
5
11
|
member do
|