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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -0
  3. data/app/controllers/rails_error_dashboard/application_controller.rb +156 -0
  4. data/app/controllers/rails_error_dashboard/errors_controller.rb +95 -73
  5. data/app/controllers/rails_error_dashboard/locales_controller.rb +87 -0
  6. data/app/helpers/rails_error_dashboard/application_helper.rb +20 -14
  7. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +15 -6
  8. data/app/helpers/rails_error_dashboard/i18n_helper.rb +154 -0
  9. data/app/helpers/rails_error_dashboard/mailer_i18n_helper.rb +69 -0
  10. data/app/helpers/rails_error_dashboard/overview_helper.rb +18 -6
  11. data/app/helpers/rails_error_dashboard/user_agent_helper.rb +25 -11
  12. data/app/jobs/rails_error_dashboard/application_job.rb +5 -0
  13. data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +18 -16
  14. data/app/jobs/rails_error_dashboard/concerns/localized_job.rb +83 -0
  15. data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +4 -2
  16. data/app/jobs/rails_error_dashboard/email_error_notification_job.rb +4 -2
  17. data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +6 -2
  18. data/app/jobs/rails_error_dashboard/scheduled_digest_job.rb +8 -3
  19. data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +6 -4
  20. data/app/jobs/rails_error_dashboard/storm_notification_job.rb +26 -8
  21. data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +4 -2
  22. data/app/mailers/rails_error_dashboard/application_mailer.rb +14 -0
  23. data/app/mailers/rails_error_dashboard/digest_mailer.rb +18 -2
  24. data/app/mailers/rails_error_dashboard/error_notification_mailer.rb +19 -2
  25. data/app/views/layouts/rails_error_dashboard.html.erb +255 -92
  26. data/app/views/rails_error_dashboard/digest_mailer/digest_summary.html.erb +23 -22
  27. data/app/views/rails_error_dashboard/digest_mailer/digest_summary.text.erb +30 -19
  28. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb +18 -16
  29. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb +21 -14
  30. data/app/views/rails_error_dashboard/errors/_ai_help_panel.html.erb +11 -7
  31. data/app/views/rails_error_dashboard/errors/_breadcrumbs_group.html.erb +45 -38
  32. data/app/views/rails_error_dashboard/errors/_co_occurring_errors.html.erb +17 -14
  33. data/app/views/rails_error_dashboard/errors/_discussion.html.erb +27 -9
  34. data/app/views/rails_error_dashboard/errors/_error_cascades.html.erb +25 -21
  35. data/app/views/rails_error_dashboard/errors/_error_info.html.erb +25 -22
  36. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +24 -12
  37. data/app/views/rails_error_dashboard/errors/_instance_variables.html.erb +12 -11
  38. data/app/views/rails_error_dashboard/errors/_issue_section.html.erb +19 -13
  39. data/app/views/rails_error_dashboard/errors/_llm_summary.html.erb +14 -14
  40. data/app/views/rails_error_dashboard/errors/_local_variables.html.erb +8 -8
  41. data/app/views/rails_error_dashboard/errors/_modals.html.erb +60 -52
  42. data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +59 -49
  43. data/app/views/rails_error_dashboard/errors/_request_context.html.erb +23 -20
  44. data/app/views/rails_error_dashboard/errors/_show_scripts.html.erb +14 -14
  45. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +118 -93
  46. data/app/views/rails_error_dashboard/errors/_similar_errors.html.erb +18 -12
  47. data/app/views/rails_error_dashboard/errors/_source_code.html.erb +20 -5
  48. data/app/views/rails_error_dashboard/errors/_stats.html.erb +5 -5
  49. data/app/views/rails_error_dashboard/errors/_timeline.html.erb +7 -7
  50. data/app/views/rails_error_dashboard/errors/_user_errors_table.html.erb +15 -12
  51. data/app/views/rails_error_dashboard/errors/actioncable_health_summary.html.erb +25 -25
  52. data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +28 -28
  53. data/app/views/rails_error_dashboard/errors/analytics.html.erb +82 -82
  54. data/app/views/rails_error_dashboard/errors/cache_health_summary.html.erb +27 -27
  55. data/app/views/rails_error_dashboard/errors/correlation.html.erb +61 -57
  56. data/app/views/rails_error_dashboard/errors/database_health_summary.html.erb +64 -65
  57. data/app/views/rails_error_dashboard/errors/deprecations.html.erb +23 -23
  58. data/app/views/rails_error_dashboard/errors/diagnostic_dumps.html.erb +48 -36
  59. data/app/views/rails_error_dashboard/errors/index.html.erb +121 -70
  60. data/app/views/rails_error_dashboard/errors/job_health_summary.html.erb +30 -30
  61. data/app/views/rails_error_dashboard/errors/llm_health_summary.html.erb +38 -39
  62. data/app/views/rails_error_dashboard/errors/n_plus_one_summary.html.erb +28 -25
  63. data/app/views/rails_error_dashboard/errors/overview.html.erb +45 -39
  64. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +45 -44
  65. data/app/views/rails_error_dashboard/errors/rack_attack_summary.html.erb +39 -28
  66. data/app/views/rails_error_dashboard/errors/releases.html.erb +46 -47
  67. data/app/views/rails_error_dashboard/errors/settings/_value_badge.html.erb +48 -44
  68. data/app/views/rails_error_dashboard/errors/settings.html.erb +122 -112
  69. data/app/views/rails_error_dashboard/errors/show.html.erb +44 -37
  70. data/app/views/rails_error_dashboard/errors/storms.html.erb +30 -24
  71. data/app/views/rails_error_dashboard/errors/swallowed_exceptions.html.erb +26 -26
  72. data/app/views/rails_error_dashboard/errors/user_impact.html.erb +31 -30
  73. data/config/locales/de.yml +2007 -0
  74. data/config/locales/en.yml +2719 -0
  75. data/config/locales/es.yml +2079 -0
  76. data/config/locales/fr.yml +2082 -0
  77. data/config/locales/it.yml +2060 -0
  78. data/config/locales/ja.yml +1802 -0
  79. data/config/locales/pl.yml +2108 -0
  80. data/config/locales/pt-BR.yml +2064 -0
  81. data/config/locales/ru.yml +2109 -0
  82. data/config/locales/uk.yml +2106 -0
  83. data/config/locales/zh-CN.yml +1791 -0
  84. data/config/routes.rb +5 -0
  85. data/db/migrate/20260325000001_fix_swallowed_exceptions_index_for_mysql.rb +9 -3
  86. data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +3 -1
  87. data/lib/rails_error_dashboard/commands/batch_mute_errors.rb +4 -2
  88. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +4 -2
  89. data/lib/rails_error_dashboard/commands/batch_unmute_errors.rb +4 -2
  90. data/lib/rails_error_dashboard/commands/create_issue.rb +5 -3
  91. data/lib/rails_error_dashboard/commands/link_existing_issue.rb +4 -2
  92. data/lib/rails_error_dashboard/commands/log_error.rb +1 -1
  93. data/lib/rails_error_dashboard/configuration.rb +23 -0
  94. data/lib/rails_error_dashboard/current.rb +56 -0
  95. data/lib/rails_error_dashboard/i18n_store.rb +293 -0
  96. data/lib/rails_error_dashboard/private_backend.rb +213 -0
  97. data/lib/rails_error_dashboard/services/baseline_alert_payload_builder.rb +89 -22
  98. data/lib/rails_error_dashboard/services/digest_builder.rb +21 -7
  99. data/lib/rails_error_dashboard/services/discord_payload_builder.rb +27 -15
  100. data/lib/rails_error_dashboard/services/error_notification_dispatcher.rb +10 -5
  101. data/lib/rails_error_dashboard/services/localized_time_formatter.rb +117 -0
  102. data/lib/rails_error_dashboard/services/notification_helpers.rb +87 -4
  103. data/lib/rails_error_dashboard/services/pagerduty_payload_builder.rb +22 -5
  104. data/lib/rails_error_dashboard/services/slack_payload_builder.rb +48 -28
  105. data/lib/rails_error_dashboard/services/storm_protection/gate.rb +2 -1
  106. data/lib/rails_error_dashboard/services/webhook_payload_builder.rb +15 -1
  107. data/lib/rails_error_dashboard/translation.rb +39 -0
  108. data/lib/rails_error_dashboard/version.rb +1 -1
  109. data/lib/rails_error_dashboard.rb +4 -0
  110. data/lib/tasks/error_dashboard.rake +5 -1
  111. metadata +24 -4
@@ -1,21 +1,21 @@
1
- <% content_for :page_title, "Deprecation Warnings" %>
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
- Deprecation Warnings
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 Days
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 Days
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 Days
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">No Deprecation Warnings Found</div>
26
+ <div class="red-empty-state-title"><%= red_t("red.errors.deprecations_page.empty_title") %></div>
27
27
  <p class="text-muted">
28
- No deprecation warnings were detected in error breadcrumbs over the last <%= @days %> days.
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>How deprecations are captured:</h6>
32
+ <h6><%= red_t("red.errors.deprecations_page.how_title") %></h6>
33
33
  <ul class="mb-0">
34
- <li>Breadcrumbs must be enabled (<code>enable_breadcrumbs = true</code>)</li>
35
- <li>Rails deprecation warnings are automatically captured as breadcrumbs</li>
36
- <li>Deprecations appear here when an error occurs during a request with deprecation warnings</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">Unique Warnings</small>
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">Total Occurrences</small>
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">Affected Errors</small>
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
- All Deprecation Warnings
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>Warning</th>
84
- <th width="250">Source</th>
85
- <th width="120">Occurrences</th>
86
- <th width="250">Errors</th>
87
- <th width="140">Last Seen</th>
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">+<%= dep[:error_ids].size - 5 %> more</small>
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> Fix deprecations before upgrading Rails to avoid breaking changes.
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> Rails Upgrade Guide <i class="bi bi-box-arrow-up-right" style="font-size: 0.7em;"></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, "Diagnostic Dumps" %>
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
- Diagnostic Dumps
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> Capture Dump
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">No Diagnostic Dumps Yet</div>
18
+ <div class="red-empty-state-title"><%= red_t("red.errors.diagnostic_dumps_page.empty_title") %></div>
19
19
  <p class="text-muted">
20
- Capture an on-demand snapshot of your system state for debugging.
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>How diagnostic dumps work:</h6>
24
+ <h6><%= red_t("red.errors.diagnostic_dumps_page.how_title") %></h6>
25
25
  <ul class="mb-0">
26
- <li>Click <strong>Capture Dump</strong> above or run <code>rails error_dashboard:diagnostic_dump</code></li>
27
- <li>Captures: environment, GC stats, threads, connection pool, memory, job queue</li>
28
- <li>Each dump is saved to the database for historical comparison</li>
29
- <li>Use dumps to investigate production issues or verify system health</li>
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">Total Dumps</small>
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 || "N/A" %></div>
53
- <small class="text-muted">Threads (Latest)</small>
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 ? "#{memory_mb} MB" : "N/A" %></div>
64
- <small class="text-muted">Memory (Latest)</small>
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
- Dump History
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("%Y-%m-%d %H:%M:%S %Z") %>
97
+ <%= dump.captured_at.strftime(red_time_format(:datetime)) %>
94
98
  </strong>
95
- <span class="text-muted ms-2">PID: <%= data["pid"] %></span>
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
- Uptime: <%= (data["uptime_seconds"].to_i / 60) %>m
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> Details
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">Environment</small>
120
+ <small class="text-muted d-block"><%= red_t("red.errors.diagnostic_dumps_page.section_environment") %></small>
117
121
  <small>
118
- Ruby <%= env["ruby_version"] || "?" %> /
119
- Rails <%= env["rails_version"] || "?" %>
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"].capitalize %>
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">System Health</small>
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 ? "#{mem} MB" : "N/A" %> /
132
- <%= tc || "?" %> threads
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
- / Pool: <%= pool["busy"] %>/<%= pool["size"] %>
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">GC</small>
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
- Live: <%= gc_health["heap_live_slots"] ? number_with_delimiter(gc_health["heap_live_slots"]) : "?" %> /
143
- Major GC: <%= gc_health["major_gc_count"] || "?" %>
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">Job Queue</small>
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
- failed: <%= jq["failed"] || jq["errored"] %>
163
+ <%= red_t("red.errors.diagnostic_dumps_page.jobs_failed", count: jq["failed"] || jq["errored"]) %>
154
164
  <% end %>
155
165
  <% else %>
156
- N/A
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
- You can also capture dumps via: <code>rails error_dashboard:diagnostic_dump</code>
173
- <span class="ms-2">Add a note: <code>NOTE="deploy check" rails error_dashboard:diagnostic_dump</code></span>
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>