rails_error_dashboard 0.8.3 → 0.9.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/README.md +35 -0
- data/app/controllers/rails_error_dashboard/application_controller.rb +156 -0
- data/app/controllers/rails_error_dashboard/errors_controller.rb +95 -73
- data/app/controllers/rails_error_dashboard/locales_controller.rb +87 -0
- data/app/helpers/rails_error_dashboard/application_helper.rb +20 -14
- data/app/helpers/rails_error_dashboard/backtrace_helper.rb +15 -6
- data/app/helpers/rails_error_dashboard/i18n_helper.rb +154 -0
- data/app/helpers/rails_error_dashboard/mailer_i18n_helper.rb +69 -0
- data/app/helpers/rails_error_dashboard/overview_helper.rb +18 -6
- data/app/helpers/rails_error_dashboard/user_agent_helper.rb +25 -11
- data/app/jobs/rails_error_dashboard/application_job.rb +5 -0
- data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +18 -16
- data/app/jobs/rails_error_dashboard/concerns/localized_job.rb +83 -0
- data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +4 -2
- data/app/jobs/rails_error_dashboard/email_error_notification_job.rb +4 -2
- data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +6 -2
- data/app/jobs/rails_error_dashboard/scheduled_digest_job.rb +8 -3
- data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +6 -4
- data/app/jobs/rails_error_dashboard/storm_notification_job.rb +26 -8
- data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +4 -2
- data/app/mailers/rails_error_dashboard/application_mailer.rb +14 -0
- data/app/mailers/rails_error_dashboard/digest_mailer.rb +18 -2
- data/app/mailers/rails_error_dashboard/error_notification_mailer.rb +19 -2
- data/app/views/layouts/rails_error_dashboard.html.erb +255 -92
- data/app/views/rails_error_dashboard/digest_mailer/digest_summary.html.erb +23 -22
- data/app/views/rails_error_dashboard/digest_mailer/digest_summary.text.erb +30 -19
- data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb +18 -16
- data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb +21 -14
- data/app/views/rails_error_dashboard/errors/_ai_help_panel.html.erb +11 -7
- data/app/views/rails_error_dashboard/errors/_breadcrumbs_group.html.erb +45 -38
- data/app/views/rails_error_dashboard/errors/_co_occurring_errors.html.erb +17 -14
- data/app/views/rails_error_dashboard/errors/_discussion.html.erb +27 -9
- data/app/views/rails_error_dashboard/errors/_error_cascades.html.erb +25 -21
- data/app/views/rails_error_dashboard/errors/_error_info.html.erb +25 -22
- data/app/views/rails_error_dashboard/errors/_error_row.html.erb +24 -12
- data/app/views/rails_error_dashboard/errors/_instance_variables.html.erb +12 -11
- data/app/views/rails_error_dashboard/errors/_issue_section.html.erb +19 -13
- data/app/views/rails_error_dashboard/errors/_llm_summary.html.erb +14 -14
- data/app/views/rails_error_dashboard/errors/_local_variables.html.erb +8 -8
- data/app/views/rails_error_dashboard/errors/_modals.html.erb +60 -52
- data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +59 -49
- data/app/views/rails_error_dashboard/errors/_request_context.html.erb +23 -20
- data/app/views/rails_error_dashboard/errors/_show_scripts.html.erb +14 -14
- data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +118 -93
- data/app/views/rails_error_dashboard/errors/_similar_errors.html.erb +18 -12
- data/app/views/rails_error_dashboard/errors/_source_code.html.erb +20 -5
- data/app/views/rails_error_dashboard/errors/_stats.html.erb +5 -5
- data/app/views/rails_error_dashboard/errors/_timeline.html.erb +7 -7
- data/app/views/rails_error_dashboard/errors/_user_errors_table.html.erb +15 -12
- data/app/views/rails_error_dashboard/errors/actioncable_health_summary.html.erb +25 -25
- data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +28 -28
- data/app/views/rails_error_dashboard/errors/analytics.html.erb +82 -82
- data/app/views/rails_error_dashboard/errors/cache_health_summary.html.erb +27 -27
- data/app/views/rails_error_dashboard/errors/correlation.html.erb +61 -57
- data/app/views/rails_error_dashboard/errors/database_health_summary.html.erb +64 -65
- data/app/views/rails_error_dashboard/errors/deprecations.html.erb +23 -23
- data/app/views/rails_error_dashboard/errors/diagnostic_dumps.html.erb +48 -36
- data/app/views/rails_error_dashboard/errors/index.html.erb +121 -70
- data/app/views/rails_error_dashboard/errors/job_health_summary.html.erb +30 -30
- data/app/views/rails_error_dashboard/errors/llm_health_summary.html.erb +38 -39
- data/app/views/rails_error_dashboard/errors/n_plus_one_summary.html.erb +28 -25
- data/app/views/rails_error_dashboard/errors/overview.html.erb +45 -39
- data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +45 -44
- data/app/views/rails_error_dashboard/errors/rack_attack_summary.html.erb +39 -28
- data/app/views/rails_error_dashboard/errors/releases.html.erb +46 -47
- data/app/views/rails_error_dashboard/errors/settings/_value_badge.html.erb +48 -44
- data/app/views/rails_error_dashboard/errors/settings.html.erb +122 -112
- data/app/views/rails_error_dashboard/errors/show.html.erb +44 -37
- data/app/views/rails_error_dashboard/errors/storms.html.erb +30 -24
- data/app/views/rails_error_dashboard/errors/swallowed_exceptions.html.erb +26 -26
- data/app/views/rails_error_dashboard/errors/user_impact.html.erb +31 -30
- data/config/locales/de.yml +2007 -0
- data/config/locales/en.yml +2719 -0
- data/config/locales/es.yml +2079 -0
- data/config/locales/fr.yml +2082 -0
- data/config/locales/it.yml +2060 -0
- data/config/locales/ja.yml +1802 -0
- data/config/locales/pl.yml +2108 -0
- data/config/locales/pt-BR.yml +2064 -0
- data/config/locales/ru.yml +2109 -0
- data/config/locales/uk.yml +2106 -0
- data/config/locales/zh-CN.yml +1791 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20260325000001_fix_swallowed_exceptions_index_for_mysql.rb +9 -3
- data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +3 -1
- data/lib/rails_error_dashboard/commands/batch_mute_errors.rb +4 -2
- data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +4 -2
- data/lib/rails_error_dashboard/commands/batch_unmute_errors.rb +4 -2
- data/lib/rails_error_dashboard/commands/create_issue.rb +5 -3
- data/lib/rails_error_dashboard/commands/link_existing_issue.rb +4 -2
- data/lib/rails_error_dashboard/commands/log_error.rb +1 -1
- data/lib/rails_error_dashboard/configuration.rb +23 -0
- data/lib/rails_error_dashboard/current.rb +56 -0
- data/lib/rails_error_dashboard/i18n_store.rb +293 -0
- data/lib/rails_error_dashboard/private_backend.rb +213 -0
- data/lib/rails_error_dashboard/services/baseline_alert_payload_builder.rb +89 -22
- data/lib/rails_error_dashboard/services/digest_builder.rb +21 -7
- data/lib/rails_error_dashboard/services/discord_payload_builder.rb +27 -15
- data/lib/rails_error_dashboard/services/error_notification_dispatcher.rb +10 -5
- data/lib/rails_error_dashboard/services/localized_time_formatter.rb +117 -0
- data/lib/rails_error_dashboard/services/notification_helpers.rb +87 -4
- data/lib/rails_error_dashboard/services/pagerduty_payload_builder.rb +22 -5
- data/lib/rails_error_dashboard/services/slack_payload_builder.rb +48 -28
- data/lib/rails_error_dashboard/services/storm_protection/gate.rb +2 -1
- data/lib/rails_error_dashboard/services/webhook_payload_builder.rb +15 -1
- data/lib/rails_error_dashboard/translation.rb +39 -0
- data/lib/rails_error_dashboard/version.rb +1 -1
- data/lib/rails_error_dashboard.rb +4 -0
- data/lib/tasks/error_dashboard.rake +5 -1
- metadata +24 -4
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
<% content_for :page_title, "
|
|
1
|
+
<% content_for :page_title, red_t("red.errors.deprecations_page.title") %>
|
|
2
2
|
|
|
3
3
|
<div>
|
|
4
4
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
5
5
|
<h1 style="font-size: 20px; font-weight: 700; margin: 0;">
|
|
6
6
|
<i class="bi bi-exclamation-triangle me-2"></i>
|
|
7
|
-
|
|
7
|
+
<%= red_t("red.errors.deprecations_page.title") %>
|
|
8
8
|
</h1>
|
|
9
9
|
|
|
10
10
|
<div class="btn-group" role="group">
|
|
11
11
|
<%= link_to deprecations_errors_path(days: 7), class: "btn btn-sm #{@days == 7 ? 'btn-primary' : 'btn-outline-primary'}" do %>
|
|
12
|
-
7
|
|
12
|
+
<%= red_t("red.common.days_filter.7") %>
|
|
13
13
|
<% end %>
|
|
14
14
|
<%= link_to deprecations_errors_path(days: 30), class: "btn btn-sm #{@days == 30 ? 'btn-primary' : 'btn-outline-primary'}" do %>
|
|
15
|
-
30
|
|
15
|
+
<%= red_t("red.common.days_filter.30") %>
|
|
16
16
|
<% end %>
|
|
17
17
|
<%= link_to deprecations_errors_path(days: 90), class: "btn btn-sm #{@days == 90 ? 'btn-primary' : 'btn-outline-primary'}" do %>
|
|
18
|
-
90
|
|
18
|
+
<%= red_t("red.common.days_filter.90") %>
|
|
19
19
|
<% end %>
|
|
20
20
|
</div>
|
|
21
21
|
</div>
|
|
@@ -23,17 +23,17 @@
|
|
|
23
23
|
<% if @unique_count == 0 %>
|
|
24
24
|
<div class="red-empty-state">
|
|
25
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"
|
|
26
|
+
<div class="red-empty-state-title"><%= red_t("red.errors.deprecations_page.empty_title") %></div>
|
|
27
27
|
<p class="text-muted">
|
|
28
|
-
|
|
28
|
+
<%= red_t("red.errors.deprecations_page.empty_body", days: @days) %>
|
|
29
29
|
</p>
|
|
30
30
|
<div class="card mx-auto" style="max-width: 500px;">
|
|
31
31
|
<div class="card-body text-start">
|
|
32
|
-
<h6
|
|
32
|
+
<h6><%= red_t("red.errors.deprecations_page.how_title") %></h6>
|
|
33
33
|
<ul class="mb-0">
|
|
34
|
-
<li
|
|
35
|
-
<li
|
|
36
|
-
<li
|
|
34
|
+
<li><%= red_t("red.errors.pages.how_breadcrumbs_html", option: content_tag(:code, "enable_breadcrumbs = true")) %></li>
|
|
35
|
+
<li><%= red_t("red.errors.deprecations_page.how_captured") %></li>
|
|
36
|
+
<li><%= red_t("red.errors.deprecations_page.how_appear") %></li>
|
|
37
37
|
</ul>
|
|
38
38
|
</div>
|
|
39
39
|
</div>
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
<div class="card text-center">
|
|
45
45
|
<div class="card-body">
|
|
46
46
|
<div class="display-6 text-danger"><%= @unique_count %></div>
|
|
47
|
-
<small class="text-muted"
|
|
47
|
+
<small class="text-muted"><%= red_t("red.errors.deprecations_page.unique_warnings") %></small>
|
|
48
48
|
</div>
|
|
49
49
|
</div>
|
|
50
50
|
</div>
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
<div class="card text-center">
|
|
53
53
|
<div class="card-body">
|
|
54
54
|
<div class="display-6 text-warning"><%= @total_count %></div>
|
|
55
|
-
<small class="text-muted"
|
|
55
|
+
<small class="text-muted"><%= red_t("red.errors.pages.total_occurrences") %></small>
|
|
56
56
|
</div>
|
|
57
57
|
</div>
|
|
58
58
|
</div>
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
<div class="card text-center">
|
|
61
61
|
<div class="card-body">
|
|
62
62
|
<div class="display-6 text-info"><%= @affected_count %></div>
|
|
63
|
-
<small class="text-muted"
|
|
63
|
+
<small class="text-muted"><%= red_t("red.errors.pages.affected_errors") %></small>
|
|
64
64
|
</div>
|
|
65
65
|
</div>
|
|
66
66
|
</div>
|
|
@@ -70,7 +70,7 @@
|
|
|
70
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
|
+
<%= red_t("red.errors.deprecations_page.all_title") %>
|
|
74
74
|
<span class="badge bg-danger"><%= @unique_count %></span>
|
|
75
75
|
</h5>
|
|
76
76
|
<small class="text-muted"><%== @pagy.info_tag %></small>
|
|
@@ -80,11 +80,11 @@
|
|
|
80
80
|
<table class="table table-hover mb-0">
|
|
81
81
|
<thead class="table-light">
|
|
82
82
|
<tr>
|
|
83
|
-
<th
|
|
84
|
-
<th width="250"
|
|
85
|
-
<th width="120"
|
|
86
|
-
<th width="250"
|
|
87
|
-
<th width="140"
|
|
83
|
+
<th><%= red_t("red.errors.deprecations_page.column_warning") %></th>
|
|
84
|
+
<th width="250"><%= red_t("red.errors.deprecations_page.column_source") %></th>
|
|
85
|
+
<th width="120"><%= red_t("red.errors.pages.column_occurrences") %></th>
|
|
86
|
+
<th width="250"><%= red_t("red.errors.pages.column_errors") %></th>
|
|
87
|
+
<th width="140"><%= red_t("red.errors.pages.column_last_seen") %></th>
|
|
88
88
|
</tr>
|
|
89
89
|
</thead>
|
|
90
90
|
<tbody>
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
<%= link_to "##{eid}", error_path(eid), class: "text-decoration-none" %><%= "," unless i == shown_ids.size - 1 %>
|
|
100
100
|
<% end %>
|
|
101
101
|
<% if dep[:error_ids].size > 5 %>
|
|
102
|
-
<small class="text-muted"
|
|
102
|
+
<small class="text-muted"><%= red_tp("red.errors.pages.more_errors", count: dep[:error_ids].size - 5) %></small>
|
|
103
103
|
<% end %>
|
|
104
104
|
</td>
|
|
105
105
|
<td><%= local_time_ago(dep[:last_seen]) %></td>
|
|
@@ -112,11 +112,11 @@
|
|
|
112
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
|
-
<i class="bi bi-lightbulb text-warning"></i>
|
|
115
|
+
<i class="bi bi-lightbulb text-warning"></i> <%= red_t("red.errors.deprecations.footer_tip") %>
|
|
116
116
|
</small>
|
|
117
117
|
<small class="ms-3">
|
|
118
118
|
<a href="https://guides.rubyonrails.org/upgrading_ruby_on_rails.html" target="_blank" rel="noopener" class="text-decoration-none">
|
|
119
|
-
<i class="bi bi-book"></i>
|
|
119
|
+
<i class="bi bi-book"></i> <%= red_t("red.errors.deprecations.upgrade_guide") %> <i class="bi bi-box-arrow-up-right" style="font-size: 0.7em;"></i>
|
|
120
120
|
</a>
|
|
121
121
|
</small>
|
|
122
122
|
</div>
|
|
@@ -1,32 +1,36 @@
|
|
|
1
|
-
<% content_for :page_title, "
|
|
1
|
+
<% content_for :page_title, red_t("red.errors.diagnostic_dumps_page.title") %>
|
|
2
2
|
|
|
3
3
|
<div>
|
|
4
4
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
5
5
|
<h1 style="font-size: 20px; font-weight: 700; margin: 0;">
|
|
6
6
|
<i class="bi bi-clipboard-pulse me-2"></i>
|
|
7
|
-
|
|
7
|
+
<%= red_t("red.errors.diagnostic_dumps_page.title") %>
|
|
8
8
|
</h1>
|
|
9
9
|
|
|
10
10
|
<%= button_to create_diagnostic_dump_errors_path, method: :post, class: "btn btn-primary btn-sm" do %>
|
|
11
|
-
<i class="bi bi-camera me-1"></i>
|
|
11
|
+
<i class="bi bi-camera me-1"></i> <%= red_t("red.errors.diagnostic_dumps_page.capture") %>
|
|
12
12
|
<% end %>
|
|
13
13
|
</div>
|
|
14
14
|
|
|
15
15
|
<% if @total_dumps == 0 %>
|
|
16
16
|
<div class="red-empty-state">
|
|
17
17
|
<i class="bi bi-clipboard-pulse display-1 text-muted mb-3"></i>
|
|
18
|
-
<div class="red-empty-state-title"
|
|
18
|
+
<div class="red-empty-state-title"><%= red_t("red.errors.diagnostic_dumps_page.empty_title") %></div>
|
|
19
19
|
<p class="text-muted">
|
|
20
|
-
|
|
20
|
+
<%= red_t("red.errors.diagnostic_dumps_page.empty_body") %>
|
|
21
21
|
</p>
|
|
22
22
|
<div class="card mx-auto" style="max-width: 500px;">
|
|
23
23
|
<div class="card-body text-start">
|
|
24
|
-
<h6
|
|
24
|
+
<h6><%= red_t("red.errors.diagnostic_dumps_page.how_title") %></h6>
|
|
25
25
|
<ul class="mb-0">
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
<li
|
|
29
|
-
|
|
26
|
+
<%# The button label is interpolated rather than written again, so
|
|
27
|
+
the instruction cannot drift from the button it names. %>
|
|
28
|
+
<li><%= red_t("red.errors.diagnostic_dumps_page.how_capture_html",
|
|
29
|
+
button: content_tag(:strong, red_t("red.errors.diagnostic_dumps_page.capture")),
|
|
30
|
+
command: content_tag(:code, "rails error_dashboard:diagnostic_dump")) %></li>
|
|
31
|
+
<li><%= red_t("red.errors.diagnostic_dumps_page.how_captures") %></li>
|
|
32
|
+
<li><%= red_t("red.errors.diagnostic_dumps_page.how_saved") %></li>
|
|
33
|
+
<li><%= red_t("red.errors.diagnostic_dumps_page.how_use") %></li>
|
|
30
34
|
</ul>
|
|
31
35
|
</div>
|
|
32
36
|
</div>
|
|
@@ -37,7 +41,7 @@
|
|
|
37
41
|
<div class="card text-center">
|
|
38
42
|
<div class="card-body">
|
|
39
43
|
<div class="display-6 text-info"><%= @total_dumps %></div>
|
|
40
|
-
<small class="text-muted"
|
|
44
|
+
<small class="text-muted"><%= red_t("red.errors.diagnostic_dumps_page.total_dumps") %></small>
|
|
41
45
|
</div>
|
|
42
46
|
</div>
|
|
43
47
|
</div>
|
|
@@ -49,8 +53,8 @@
|
|
|
49
53
|
latest_data = begin; JSON.parse(latest.dump_data); rescue; {}; end if latest
|
|
50
54
|
thread_count = latest_data&.dig("system_health", "thread_count")
|
|
51
55
|
%>
|
|
52
|
-
<div class="display-6 text-secondary"><%= thread_count || "
|
|
53
|
-
<small class="text-muted"
|
|
56
|
+
<div class="display-6 text-secondary"><%= thread_count || red_t("red.common.not_available") %></div>
|
|
57
|
+
<small class="text-muted"><%= red_t("red.errors.diagnostic_dumps_page.threads_latest") %></small>
|
|
54
58
|
</div>
|
|
55
59
|
</div>
|
|
56
60
|
</div>
|
|
@@ -60,8 +64,8 @@
|
|
|
60
64
|
<%
|
|
61
65
|
memory_mb = latest_data&.dig("system_health", "process_memory_mb")
|
|
62
66
|
%>
|
|
63
|
-
<div class="display-6 text-secondary"><%= memory_mb ? "
|
|
64
|
-
<small class="text-muted"
|
|
67
|
+
<div class="display-6 text-secondary"><%= memory_mb ? red_t("red.errors.diagnostic_dumps_page.memory_mb", value: memory_mb) : red_t("red.common.not_available") %></div>
|
|
68
|
+
<small class="text-muted"><%= red_t("red.errors.diagnostic_dumps_page.memory_latest") %></small>
|
|
65
69
|
</div>
|
|
66
70
|
</div>
|
|
67
71
|
</div>
|
|
@@ -71,7 +75,7 @@
|
|
|
71
75
|
<div class="card-header d-flex justify-content-between align-items-center">
|
|
72
76
|
<h5 class="mb-0">
|
|
73
77
|
<i class="bi bi-clipboard-pulse text-info me-2"></i>
|
|
74
|
-
|
|
78
|
+
<%= red_t("red.errors.diagnostic_dumps_page.history_title") %>
|
|
75
79
|
<span class="badge bg-info"><%= @total_dumps %></span>
|
|
76
80
|
</h5>
|
|
77
81
|
<small class="text-muted"><%== @pagy.info_tag %></small>
|
|
@@ -90,12 +94,12 @@
|
|
|
90
94
|
<div>
|
|
91
95
|
<strong>
|
|
92
96
|
<i class="bi bi-clock me-1"></i>
|
|
93
|
-
<%= dump.captured_at.strftime(
|
|
97
|
+
<%= dump.captured_at.strftime(red_time_format(:datetime)) %>
|
|
94
98
|
</strong>
|
|
95
|
-
<span class="text-muted ms-2"
|
|
99
|
+
<span class="text-muted ms-2"><%= red_t("red.errors.diagnostic_dumps_page.pid", pid: data["pid"]) %></span>
|
|
96
100
|
<% if data["uptime_seconds"] %>
|
|
97
101
|
<span class="text-muted ms-2">
|
|
98
|
-
|
|
102
|
+
<%= red_t("red.errors.diagnostic_dumps_page.uptime", minutes: (data["uptime_seconds"].to_i / 60)) %>
|
|
99
103
|
</span>
|
|
100
104
|
<% end %>
|
|
101
105
|
<% if dump.note.present? %>
|
|
@@ -107,53 +111,59 @@
|
|
|
107
111
|
data-bs-toggle="collapse"
|
|
108
112
|
data-bs-target="#dump-<%= dump.id %>"
|
|
109
113
|
aria-expanded="false">
|
|
110
|
-
<i class="bi bi-chevron-down"></i>
|
|
114
|
+
<i class="bi bi-chevron-down"></i> <%= red_t("red.errors.diagnostic_dumps_page.details") %>
|
|
111
115
|
</button>
|
|
112
116
|
</div>
|
|
113
117
|
|
|
114
118
|
<div class="row">
|
|
115
119
|
<div class="col-md-3">
|
|
116
|
-
<small class="text-muted d-block"
|
|
120
|
+
<small class="text-muted d-block"><%= red_t("red.errors.diagnostic_dumps_page.section_environment") %></small>
|
|
117
121
|
<small>
|
|
118
|
-
|
|
119
|
-
|
|
122
|
+
<%# One phrase rather than two brand names with versions
|
|
123
|
+
trailing after them. The server name is a process name
|
|
124
|
+
(puma, unicorn) — capitalize applied English morphology to
|
|
125
|
+
an identifier, so it is now rendered as written. %>
|
|
126
|
+
<%= red_t("red.errors.diagnostic_dumps_page.env_versions",
|
|
127
|
+
ruby: env["ruby_version"] || red_t("red.errors.diagnostic_dumps_page.unknown_short"),
|
|
128
|
+
rails: env["rails_version"] || red_t("red.errors.diagnostic_dumps_page.unknown_short")) %>
|
|
120
129
|
<% if env["server"] && env["server"] != "unknown" %>
|
|
121
|
-
/ <%= env["server"]
|
|
130
|
+
/ <%= env["server"] %>
|
|
122
131
|
<% end %>
|
|
123
132
|
</small>
|
|
124
133
|
</div>
|
|
125
134
|
<div class="col-md-3">
|
|
126
|
-
<small class="text-muted d-block"
|
|
135
|
+
<small class="text-muted d-block"><%= red_t("red.errors.diagnostic_dumps_page.section_system_health") %></small>
|
|
127
136
|
<small>
|
|
128
137
|
<% mem = health["process_memory_mb"] %>
|
|
129
138
|
<% tc = health["thread_count"] %>
|
|
130
139
|
<% pool = health["connection_pool"] %>
|
|
131
|
-
<%= mem ? "
|
|
132
|
-
<%= tc
|
|
140
|
+
<%= mem ? red_t("red.errors.diagnostic_dumps_page.memory_mb", value: mem) : red_t("red.common.not_available") %> /
|
|
141
|
+
<%= tc ? red_tp("red.errors.diagnostic_dumps_page.threads", count: tc) : red_t("red.errors.diagnostic_dumps_page.unknown_short") %>
|
|
133
142
|
<% if pool %>
|
|
134
|
-
/
|
|
143
|
+
/ <%= red_t("red.errors.diagnostic_dumps_page.pool", busy: pool["busy"], size: pool["size"]) %>
|
|
135
144
|
<% end %>
|
|
136
145
|
</small>
|
|
137
146
|
</div>
|
|
138
147
|
<div class="col-md-3">
|
|
139
|
-
<small class="text-muted d-block"
|
|
148
|
+
<small class="text-muted d-block"><%= red_t("red.errors.diagnostic_dumps_page.section_gc") %></small>
|
|
140
149
|
<small>
|
|
141
150
|
<% gc_health = health["gc"] || {} %>
|
|
142
|
-
|
|
143
|
-
|
|
151
|
+
<%= red_t("red.errors.diagnostic_dumps_page.gc_stats",
|
|
152
|
+
live: gc_health["heap_live_slots"] ? number_with_delimiter(gc_health["heap_live_slots"]) : red_t("red.errors.diagnostic_dumps_page.unknown_short"),
|
|
153
|
+
major: gc_health["major_gc_count"] || red_t("red.errors.diagnostic_dumps_page.unknown_short")) %>
|
|
144
154
|
</small>
|
|
145
155
|
</div>
|
|
146
156
|
<div class="col-md-3">
|
|
147
|
-
<small class="text-muted d-block"
|
|
157
|
+
<small class="text-muted d-block"><%= red_t("red.errors.diagnostic_dumps_page.section_job_queue") %></small>
|
|
148
158
|
<small>
|
|
149
159
|
<% jq = health["job_queue"] %>
|
|
150
160
|
<% if jq %>
|
|
151
161
|
<%= jq["adapter"] %>
|
|
152
162
|
<% if jq["failed"] || jq["errored"] %>
|
|
153
|
-
—
|
|
163
|
+
— <%= red_t("red.errors.diagnostic_dumps_page.jobs_failed", count: jq["failed"] || jq["errored"]) %>
|
|
154
164
|
<% end %>
|
|
155
165
|
<% else %>
|
|
156
|
-
|
|
166
|
+
<%= red_t("red.common.not_available") %>
|
|
157
167
|
<% end %>
|
|
158
168
|
</small>
|
|
159
169
|
</div>
|
|
@@ -169,8 +179,10 @@
|
|
|
169
179
|
<div>
|
|
170
180
|
<small class="text-muted">
|
|
171
181
|
<i class="bi bi-lightbulb text-warning"></i>
|
|
172
|
-
|
|
173
|
-
|
|
182
|
+
<%= red_t("red.errors.diagnostic_dumps_page.footer_tip_html",
|
|
183
|
+
command: content_tag(:code, "rails error_dashboard:diagnostic_dump")) %>
|
|
184
|
+
<span class="ms-2"><%= red_t("red.errors.diagnostic_dumps_page.footer_note_html",
|
|
185
|
+
command: content_tag(:code, 'NOTE="deploy check" rails error_dashboard:diagnostic_dump')) %></span>
|
|
174
186
|
</small>
|
|
175
187
|
</div>
|
|
176
188
|
<div>
|