rails_error_dashboard 0.14.4 → 0.15.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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -5
  3. data/app/controllers/rails_error_dashboard/application_controller.rb +28 -4
  4. data/app/controllers/rails_error_dashboard/errors_controller.rb +68 -2
  5. data/app/controllers/rails_error_dashboard/health_controller.rb +38 -0
  6. data/app/helpers/rails_error_dashboard/application_helper.rb +2 -2
  7. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +56 -2
  8. data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +20 -2
  9. data/app/jobs/rails_error_dashboard/cascade_detection_job.rb +30 -0
  10. data/app/jobs/rails_error_dashboard/concerns/plain_channel_message.rb +33 -6
  11. data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +1 -1
  12. data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +1 -1
  13. data/app/jobs/rails_error_dashboard/retention_cleanup_job.rb +26 -0
  14. data/app/jobs/rails_error_dashboard/scheduled_digest_job.rb +6 -1
  15. data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +1 -1
  16. data/app/jobs/rails_error_dashboard/telegram_error_notification_job.rb +25 -0
  17. data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +2 -18
  18. data/app/models/rails_error_dashboard/error_log.rb +43 -12
  19. data/app/models/rails_error_dashboard/missing_translation.rb +43 -0
  20. data/app/views/layouts/rails_error_dashboard.html.erb +11 -1
  21. data/app/views/rails_error_dashboard/errors/_error_info.html.erb +3 -1
  22. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +3 -1
  23. data/app/views/rails_error_dashboard/errors/_source_code.html.erb +3 -9
  24. data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +28 -0
  25. data/app/views/rails_error_dashboard/errors/boot_errors.html.erb +130 -0
  26. data/app/views/rails_error_dashboard/errors/index.html.erb +1 -1
  27. data/app/views/rails_error_dashboard/errors/missing_translations.html.erb +143 -0
  28. data/app/views/rails_error_dashboard/errors/settings/_value_badge.html.erb +7 -4
  29. data/app/views/rails_error_dashboard/errors/settings.html.erb +19 -5
  30. data/config/locales/de.yml +68 -5
  31. data/config/locales/en.yml +78 -4
  32. data/config/locales/es.yml +68 -5
  33. data/config/locales/fr.yml +68 -5
  34. data/config/locales/it.yml +68 -5
  35. data/config/locales/ja.yml +68 -4
  36. data/config/locales/pl.yml +68 -5
  37. data/config/locales/pt-BR.yml +68 -5
  38. data/config/locales/ru.yml +68 -5
  39. data/config/locales/uk.yml +68 -5
  40. data/config/locales/zh-CN.yml +68 -4
  41. data/config/routes.rb +6 -0
  42. data/db/migrate/20251223000000_create_rails_error_dashboard_complete_schema.rb +10 -2
  43. data/db/migrate/20261010000001_create_missing_translations.rb +50 -0
  44. data/lib/generators/rails_error_dashboard/install/install_generator.rb +9 -4
  45. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +27 -0
  46. data/lib/rails_error_dashboard/commands/assign_error.rb +24 -1
  47. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +9 -1
  48. data/lib/rails_error_dashboard/commands/flush_missing_translations.rb +103 -0
  49. data/lib/rails_error_dashboard/commands/log_error.rb +1 -1
  50. data/lib/rails_error_dashboard/commands/resolve_error.rb +2 -15
  51. data/lib/rails_error_dashboard/commands/update_error_status.rb +7 -0
  52. data/lib/rails_error_dashboard/configuration.rb +42 -1
  53. data/lib/rails_error_dashboard/engine.rb +42 -1
  54. data/lib/rails_error_dashboard/middleware/rate_limiter.rb +7 -1
  55. data/lib/rails_error_dashboard/plugin.rb +19 -3
  56. data/lib/rails_error_dashboard/plugin_registry.rb +61 -12
  57. data/lib/rails_error_dashboard/queries/boot_errors.rb +76 -0
  58. data/lib/rails_error_dashboard/queries/dashboard_stats.rb +3 -11
  59. data/lib/rails_error_dashboard/queries/errors_list.rb +8 -16
  60. data/lib/rails_error_dashboard/queries/health_status.rb +191 -0
  61. data/lib/rails_error_dashboard/queries/missing_translation_summary.rb +82 -0
  62. data/lib/rails_error_dashboard/services/active_storage_probe.rb +91 -0
  63. data/lib/rails_error_dashboard/services/backtrace_parser.rb +13 -7
  64. data/lib/rails_error_dashboard/services/backtrace_processor.rb +15 -0
  65. data/lib/rails_error_dashboard/services/baseline_alert_payload_builder.rb +30 -0
  66. data/lib/rails_error_dashboard/services/crash_capture.rb +85 -2
  67. data/lib/rails_error_dashboard/services/digest_builder.rb +9 -6
  68. data/lib/rails_error_dashboard/services/error_notification_dispatcher.rb +6 -0
  69. data/lib/rails_error_dashboard/services/github_link_generator.rb +25 -9
  70. data/lib/rails_error_dashboard/services/missing_translation_handler.rb +152 -0
  71. data/lib/rails_error_dashboard/services/missing_translation_tracker.rb +316 -0
  72. data/lib/rails_error_dashboard/services/resolution_callbacks.rb +44 -0
  73. data/lib/rails_error_dashboard/services/severity_classifier.rb +52 -0
  74. data/lib/rails_error_dashboard/services/source_code_reader.rb +23 -3
  75. data/lib/rails_error_dashboard/services/telegram_delivery.rb +134 -0
  76. data/lib/rails_error_dashboard/services/telegram_payload_builder.rb +105 -0
  77. data/lib/rails_error_dashboard/services/webhook_delivery.rb +63 -0
  78. data/lib/rails_error_dashboard/services/webhook_signer.rb +80 -0
  79. data/lib/rails_error_dashboard/version.rb +1 -1
  80. data/lib/rails_error_dashboard.rb +12 -0
  81. metadata +21 -2
@@ -60,6 +60,8 @@ de:
60
60
  llm: LLM
61
61
  n_plus_one: N+1-Abfragen
62
62
  deprecations: Deprecations
63
+ missing_translations: "Übersetzungen"
64
+ boot_errors: "Startfehler"
63
65
  swallowed: Verschluckt
64
66
  diagnostic_dumps: Diagnose
65
67
  storms: Fehlerstürme
@@ -828,6 +830,53 @@ de:
828
830
  gelangt sind
829
831
  footer_tip: Verschluckte Exceptions werden ausgelöst und dann still abgefangen.
830
832
  Sie können echte Fehler verbergen.
833
+ missing_translations_page:
834
+ title: "Fehlende Übersetzungen"
835
+ empty_title: "Keine fehlenden Übersetzungen erfasst"
836
+ empty_body: "In den letzten %{days} Tagen wurden keine fehlenden Übersetzungsschlüssel erfasst."
837
+ how_title: "So werden fehlende Übersetzungen erfasst:"
838
+ how_enabled_html: "Die Erfassung muss aktiviert sein (%{option})"
839
+ how_hooked: "RED umhüllt I18n.exception_handler und reicht an den Handler weiter, den Ihre App bereits hatte; sonst ändert sich nichts an Ihrer I18n-Konfiguration"
840
+ how_recorded: "Jede Abfrage, die beim Handler landet – über I18n.t ebenso wie über den View-Helper t() – wird nach Locale und Schlüssel gezählt, zusammen mit der zuerst gesehenen Aufrufstelle"
841
+ how_not_seen: "Eine Abfrage mit :default schlägt nie fehl, und eine mit raise_on_missing_translations löst eine Ausnahme aus, bevor ein Handler läuft; beide werden hier nicht gezählt"
842
+ how_buffered: "Fehlschläge werden im Speicher gezählt und am Ende der Anfrage oder des Jobs geschrieben; rechnen Sie mit einer kurzen Verzögerung, bis sie erscheinen"
843
+ missing_keys: "Fehlende Schlüssel"
844
+ total_misses: "Fehlschläge gesamt"
845
+ locales_affected: "Betroffene Locales"
846
+ all_title: "Fehlende Übersetzungsschlüssel"
847
+ column_key: "Schlüssel"
848
+ column_locale: "Locale"
849
+ column_source: "Zuerst gesehen in"
850
+ column_misses: "Fehlschläge"
851
+ column_first_seen: "Zuerst gesehen"
852
+ overflow_notice: "%{count} Fehlschläge konnten keinem Schlüssel zugeordnet werden, weil der Puffer des Trackers (%{limit} Schlüssel pro Thread) voll war."
853
+ footer_tip: "Fügen Sie den Schlüssel der Locale-Datei hinzu oder übergeben Sie ein :default. Schlüssel, auf die Nutzer tatsächlich gestoßen sind, stehen zuerst."
854
+ docs: "Rails-i18n-Leitfaden"
855
+
856
+ boot_errors_page:
857
+ title: "Startfehler"
858
+ empty_title: "Keine Startfehler erfasst"
859
+ empty_body: "In den letzten %{days} Tagen ist kein Prozess beim Starten abgestürzt."
860
+ how_title: "So werden Startfehler erfasst:"
861
+ how_enabled_html: "Die Absturzerfassung muss aktiviert sein (%{option})"
862
+ how_hooked: "RED registriert seinen at_exit-Hook direkt nach Ihren Initializern und vor dem Eager Loading von Rails, sodass ein Absturz beim Start erfasst wird, obwohl die App nie fertig gestartet ist"
863
+ how_captured_html: "%{zeitwerk} aus einer Datei, die die falsche Konstante definiert, ein %{syntax} in einem Model, ein Initializer, der eine Ausnahme auslöst: alles, was den Prozess beendet, bevor er eine Anfrage bedient"
864
+ how_imported: "Der Absturz wird auf die Festplatte geschrieben, weil es noch keine Datenbank gibt, und beim nächsten erfolgreichen Start importiert"
865
+ how_never: "Ein per SIGKILL beendeter oder abgestürzter (Segfault) Prozess wird von at_exit nie gesehen, in keinem Werkzeug"
866
+ unresolved: "Ungelöst"
867
+ boot_crashes: "Startabstürze"
868
+ failed_boots: "Fehlgeschlagene Starts"
869
+ all_title: "Startabstürze nach Fehler"
870
+ column_error: "Fehler"
871
+ column_file: "Datei"
872
+ column_constant: "Konstante"
873
+ column_boots: "Starts"
874
+ column_first_seen: "Zuerst gesehen"
875
+ column_status: "Status"
876
+ status_open: "Offen"
877
+ status_resolved: "Gelöst"
878
+ footer_tip: "Ein Startabsturz bedeutet, dass der Prozess nie eine Anfrage bedient hat. Beheben Sie ihn vor dem nächsten Deploy; die Zeile wird wie jeder andere Fehler gelöst."
879
+
831
880
  rack_attack_page:
832
881
  title: Rate-Limit-Ereignisse
833
882
  missing_title: Rack Attack ist nicht installiert
@@ -1087,7 +1136,7 @@ de:
1087
1136
  unable_to_detect: Erkennung nicht möglich
1088
1137
  no_user_model: Kein User-Modell erkannt
1089
1138
  unable_to_query_count: Anzahl konnte nicht abgefragt werden
1090
- manual_cleanup_required: Manuelle Bereinigung erforderlich
1139
+ retention_enforced_by_job: "Wird vom RetentionCleanupJob gelöscht, sobald Ihr Scheduler ihn ausführt"
1091
1140
  keep_forever: Dauerhaft behalten
1092
1141
  no_automatic_deletion: Keine automatische Löschung
1093
1142
  run_command: 'Ausführen:'
@@ -1095,8 +1144,7 @@ de:
1095
1144
  options:
1096
1145
  enable_middleware: Fängt unbehandelte Exceptions ab
1097
1146
  enable_error_subscriber: Abonniert Rails-Fehlerereignisse
1098
- retention_days: 'Nur manuelle Bereinigung (ausführen: rails error_dashboard:cleanup_resolved
1099
- DAYS=90)'
1147
+ retention_days: "Fehler löschen, die so viele Tage nicht mehr aufgetreten sind. Durchgesetzt vom RetentionCleanupJob, den das Gem selbst nicht einplant"
1100
1148
  max_backtrace_lines: Maximale Backtrace-Tiefe
1101
1149
  sampling_rate: Anteil der erfassten Fehler
1102
1150
  application_name: Name dieser Anwendung (wird automatisch erkannt, wenn nicht
@@ -1115,7 +1163,7 @@ de:
1115
1163
  erkannt, wenn nicht gesetzt)
1116
1164
  async_logging: Verarbeitung über Hintergrund-Jobs
1117
1165
  async_adapter: Adapter für die Job-Warteschlange
1118
- enable_rate_limiting: API-Anfragen drosseln
1166
+ enable_rate_limiting: "Dashboard-Anfragen pro IP und Pfad drosseln"
1119
1167
  rate_limit_per_minute: Anfragen pro Minute und IP
1120
1168
  enable_slack_notifications: Echtzeit-Benachrichtigungen
1121
1169
  slack_webhook_url: Slack-Webhook-Endpunkt
@@ -1124,10 +1172,15 @@ de:
1124
1172
  notification_email_from: Absenderadresse
1125
1173
  enable_discord_notifications: Discord-Webhook-Benachrichtigungen
1126
1174
  discord_webhook_url: Discord-Webhook-Endpunkt
1175
+ enable_telegram_notifications: "Telegram-Benachrichtigungen über die Bot-API"
1176
+ telegram_bot_token: "Bot-Token von @BotFather (Umgebungsvariable TELEGRAM_BOT_TOKEN setzen)"
1177
+ telegram_chat_id: "Chat, Gruppe oder Kanal, in den der Bot schreibt"
1178
+ telegram_api_base_url: "Bot-API-Server (nur für einen Proxy oder selbst gehosteten Server ändern)"
1127
1179
  enable_pagerduty_notifications: Eskalation bei kritischen Fehlern
1128
1180
  pagerduty_integration_key: PagerDuty-API-Schlüssel
1129
1181
  enable_webhook_notifications: Allgemeine Webhook-Endpunkte
1130
1182
  webhook_urls: Eigene Webhook-Endpunkte
1183
+ webhook_signing_secret: Signiert ausgehende Webhooks mit HMAC-SHA256 (Umgebungsvariable WEBHOOK_SIGNING_SECRET setzen)
1131
1184
  enable_scheduled_digests: Tägliche/wöchentliche Zusammenfassungs-E-Mails.
1132
1185
  Planung über SolidQueue, Sidekiq oder cron
1133
1186
  digest_frequency: Wie oft Zusammenfassungs-E-Mails gesendet werden
@@ -1148,7 +1201,7 @@ de:
1148
1201
  source_code_context_lines: Zeilen vor und nach der Zielzeile
1149
1202
  enable_git_blame: git-blame-Informationen anzeigen
1150
1203
  source_code_cache_ttl: Cache-Dauer für den Quellcode
1151
- only_show_app_code_source: Gems und stdlib aus Sicherheitsgründen ausblenden
1204
+ only_show_app_code_source: "Gem- und Vendor-Code im Quelltext-Viewer ausblenden"
1152
1205
  git_branch_strategy: Strategie zur Branch-Auflösung
1153
1206
  enable_breadcrumbs: Aktivitätsverlauf der Anfrage erfassen
1154
1207
  breadcrumb_buffer_size: Maximale Anzahl Breadcrumbs pro Anfrage
@@ -1180,6 +1233,7 @@ de:
1180
1233
  enable_crash_capture: at_exit-Hook für unbehandelte Abstürze
1181
1234
  enable_coverage_tracking: Diagnosemodus — über das Dashboard aktivieren, um
1182
1235
  ausgeführte Zeilen in der Quellcodeansicht zu sehen (Ruby 3.2+)
1236
+ enable_missing_translation_tracking: "Zählt die I18n-Fehlschläge der App nach Locale und Schlüssel (umhüllt I18n.exception_handler)"
1183
1237
  enable_rack_attack_tracking: Throttle- und Blocklist-Ereignisse in einer eigenen
1184
1238
  Tabelle erfassen
1185
1239
  enable_actioncable_tracking: WebSocket-Kanalereignisse als Breadcrumbs erfassen
@@ -1235,6 +1289,8 @@ de:
1235
1289
  breadcrumbs: Breadcrumbs
1236
1290
  system_health: Systemzustand
1237
1291
  swallowed_exceptions: Erkennung verschluckter Exceptions
1292
+ missing_translations: "Erfassung fehlender Übersetzungen"
1293
+ boot_errors: "Erfassung von Startfehlern"
1238
1294
  rack_attack: Rack-Attack-Erfassung
1239
1295
  actioncable: ActionCable-Erfassung
1240
1296
  activestorage: ActiveStorage-Erfassung
@@ -1640,6 +1696,13 @@ de:
1640
1696
  guide_link: ActionCable-Leitfaden
1641
1697
  activestorage:
1642
1698
  title: ActiveStorage-Zustand
1699
+ probe:
1700
+ title: "Erreichbarkeit des Dienstes"
1701
+ reachable: "Erreichbar"
1702
+ unreachable: "Nicht erreichbar"
1703
+ service: "Dienst: %{name}"
1704
+ latency: "%{ms} ms Umlaufzeit"
1705
+ how: "Eine Existenzprüfung für einen Schlüssel, der nie gespeichert wird, beim Laden dieser Seite. GET /health führt dieselbe Prüfung aus."
1643
1706
  empty:
1644
1707
  title: Keine ActiveStorage-Ereignisse gefunden
1645
1708
  message: In den Fehler-Breadcrumbs der letzten %{days} Tage wurden keine
@@ -116,6 +116,8 @@ en:
116
116
  llm: "LLM"
117
117
  n_plus_one: "N+1 Queries"
118
118
  deprecations: "Deprecations"
119
+ missing_translations: "Translations"
120
+ boot_errors: "Boot Errors"
119
121
  swallowed: "Swallowed"
120
122
  diagnostic_dumps: "Diagnostics"
121
123
  storms: "Storms"
@@ -1185,6 +1187,61 @@ en:
1185
1187
  view_unrescued: "View any unrescued %{exception} errors that leaked into error_log"
1186
1188
  footer_tip: "Swallowed exceptions are raised then silently rescued. They may hide real bugs."
1187
1189
 
1190
+ missing_translations_page:
1191
+ title: "Missing Translations"
1192
+ empty_title: "No Missing Translations Recorded"
1193
+ # %{days} is the selected day range.
1194
+ empty_body: "No missing translation keys were recorded over the last %{days} days."
1195
+ how_title: "How missing translations are tracked:"
1196
+ # %{option} is a config option name as a <code> element.
1197
+ how_enabled_html: "Tracking must be enabled (%{option})"
1198
+ # I18n.exception_handler, I18n.t, t(), :default and raise_on_missing_translations are Ruby/Rails API names, not prose.
1199
+ how_hooked: "RED wraps I18n.exception_handler and delegates to the handler your app already had; nothing else in your I18n configuration changes"
1200
+ how_recorded: "Every lookup that falls through to the handler — I18n.t and the t() view helper alike — is counted by locale and key, with the first call site seen"
1201
+ how_not_seen: "A lookup given a :default never misses, and one made with raise_on_missing_translations raises before any handler runs, so neither is counted here"
1202
+ how_buffered: "Misses are counted in memory and written at the end of the request or job, so allow a short delay before they appear"
1203
+ missing_keys: "Missing Keys"
1204
+ total_misses: "Total Misses"
1205
+ locales_affected: "Locales Affected"
1206
+ all_title: "Missing Translation Keys"
1207
+ column_key: "Key"
1208
+ column_locale: "Locale"
1209
+ column_source: "First Seen In"
1210
+ column_misses: "Misses"
1211
+ column_first_seen: "First Seen"
1212
+ # %{count} is a number of misses, %{limit} the per-thread buffer size.
1213
+ overflow_notice: "%{count} misses could not be attributed to a key because the tracker's buffer (%{limit} keys per thread) was full."
1214
+ footer_tip: "Add the key to the locale file, or pass a :default. Keys users actually hit are listed first."
1215
+ docs: "Rails i18n guide"
1216
+
1217
+ boot_errors_page:
1218
+ title: "Boot Errors"
1219
+ empty_title: "No Boot Errors Recorded"
1220
+ # %{days} is the selected day range.
1221
+ empty_body: "No process died while booting over the last %{days} days."
1222
+ how_title: "How boot errors are captured:"
1223
+ # %{option} is a config option name as a <code> element.
1224
+ how_enabled_html: "Crash capture must be enabled (%{option})"
1225
+ # at_exit, SIGKILL and segfault are Ruby/OS terms, not prose.
1226
+ how_hooked: "RED registers its at_exit hook right after your initializers run and before Rails eager-loads, so a crash during boot is seen even though the app never finished starting"
1227
+ # %{zeitwerk} and %{syntax} are exception class names as <code> elements.
1228
+ how_captured_html: "%{zeitwerk} from a file that defines the wrong constant, a %{syntax} in a model, an initializer that raised: anything that kills the process before it serves a request"
1229
+ how_imported: "The crash is written to disk, because there is no database yet, and imported on the next boot that succeeds"
1230
+ how_never: "A process killed by SIGKILL or a segfault is never seen by at_exit, in any tool"
1231
+ unresolved: "Unresolved"
1232
+ boot_crashes: "Boot Crashes"
1233
+ failed_boots: "Failed Boots"
1234
+ all_title: "Boot Crashes by Error"
1235
+ column_error: "Error"
1236
+ column_file: "File"
1237
+ column_constant: "Constant"
1238
+ column_boots: "Boots"
1239
+ column_first_seen: "First Seen"
1240
+ column_status: "Status"
1241
+ status_open: "Open"
1242
+ status_resolved: "Resolved"
1243
+ footer_tip: "A boot crash means the process never served a request. Fix it before the next deploy; the row resolves like any other error."
1244
+
1188
1245
  rack_attack_page:
1189
1246
  title: "Rate Limit Events"
1190
1247
  missing_title: "Rack Attack Is Not Installed"
@@ -1523,7 +1580,7 @@ en:
1523
1580
  unable_to_detect: "Unable to detect"
1524
1581
  no_user_model: "No User model detected"
1525
1582
  unable_to_query_count: "Unable to query count"
1526
- manual_cleanup_required: "Manual cleanup required"
1583
+ retention_enforced_by_job: "Deleted by RetentionCleanupJob once your scheduler runs it"
1527
1584
  keep_forever: "Keep Forever"
1528
1585
  no_automatic_deletion: "No automatic deletion"
1529
1586
  # These label a rake command rendered beside them. The command is never
@@ -1538,7 +1595,7 @@ en:
1538
1595
  options:
1539
1596
  enable_middleware: "Catches unhandled exceptions"
1540
1597
  enable_error_subscriber: "Subscribes to Rails error events"
1541
- retention_days: "Manual cleanup only (run: rails error_dashboard:cleanup_resolved DAYS=90)"
1598
+ retention_days: "Delete errors not seen for this many days. Enforced by RetentionCleanupJob, which nothing in the gem schedules"
1542
1599
  max_backtrace_lines: "Stack trace depth limit"
1543
1600
  sampling_rate: "Percentage of errors captured"
1544
1601
  application_name: "Name of this application (auto-detected if not set)"
@@ -1552,7 +1609,7 @@ en:
1552
1609
  total_users_for_impact: "For impact % calculation (auto-detected if not set)"
1553
1610
  async_logging: "Background job processing"
1554
1611
  async_adapter: "Job queue adapter"
1555
- enable_rate_limiting: "Throttle API requests"
1612
+ enable_rate_limiting: "Throttle dashboard requests per IP and path"
1556
1613
  rate_limit_per_minute: "Requests per minute per IP"
1557
1614
  enable_slack_notifications: "Real-time notifications"
1558
1615
  slack_webhook_url: "Slack webhook endpoint"
@@ -1561,10 +1618,15 @@ en:
1561
1618
  notification_email_from: "Sender address"
1562
1619
  enable_discord_notifications: "Discord webhook notifications"
1563
1620
  discord_webhook_url: "Discord webhook endpoint"
1621
+ enable_telegram_notifications: "Telegram Bot API notifications"
1622
+ telegram_bot_token: "Bot token from @BotFather (set TELEGRAM_BOT_TOKEN env var)"
1623
+ telegram_chat_id: "Chat, group or channel the bot posts to"
1624
+ telegram_api_base_url: "Bot API server (change only for a proxy or self-hosted server)"
1564
1625
  enable_pagerduty_notifications: "Critical error escalation"
1565
1626
  pagerduty_integration_key: "PagerDuty API key"
1566
1627
  enable_webhook_notifications: "Generic webhook endpoints"
1567
1628
  webhook_urls: "Custom webhook endpoints"
1629
+ webhook_signing_secret: "Signs outbound webhooks with HMAC-SHA256 (set WEBHOOK_SIGNING_SECRET env var)"
1568
1630
  enable_scheduled_digests: "Daily/weekly summary emails. Schedule via SolidQueue, Sidekiq, or cron"
1569
1631
  digest_frequency: "How often to send digest emails"
1570
1632
  digest_recipients: "Email addresses (falls back to notification recipients)"
@@ -1582,7 +1644,7 @@ en:
1582
1644
  source_code_context_lines: "Lines before/after target line"
1583
1645
  enable_git_blame: "Show git blame info"
1584
1646
  source_code_cache_ttl: "Source code cache duration"
1585
- only_show_app_code_source: "Hide gems/stdlib for security"
1647
+ only_show_app_code_source: "Hide gem and vendored code in the source viewer"
1586
1648
  git_branch_strategy: "Branch resolution strategy"
1587
1649
  enable_breadcrumbs: "Capture request activity trail"
1588
1650
  breadcrumb_buffer_size: "Max breadcrumbs per request"
@@ -1608,6 +1670,7 @@ en:
1608
1670
  enable_diagnostic_dump: "On-demand system state snapshots"
1609
1671
  enable_crash_capture: "at_exit hook for unhandled crashes"
1610
1672
  enable_coverage_tracking: "Diagnostic mode — enable via dashboard to see executed lines in source view (Ruby 3.2+)"
1673
+ enable_missing_translation_tracking: "Count the app's I18n misses by locale and key (wraps I18n.exception_handler)"
1611
1674
  enable_rack_attack_tracking: "Record throttle/blocklist events to their own table"
1612
1675
  enable_actioncable_tracking: "Track WebSocket channel events as breadcrumbs"
1613
1676
  enable_activestorage_tracking: "Track uploads/downloads/deletes as breadcrumbs"
@@ -1687,6 +1750,8 @@ en:
1687
1750
  breadcrumbs: "Breadcrumbs"
1688
1751
  system_health: "System health"
1689
1752
  swallowed_exceptions: "Swallowed exception detection"
1753
+ missing_translations: "Missing-translation tracking"
1754
+ boot_errors: "Boot error capture"
1690
1755
  rack_attack: "Rack Attack tracking"
1691
1756
  actioncable: "ActionCable tracking"
1692
1757
  activestorage: "ActiveStorage tracking"
@@ -2231,6 +2296,15 @@ en:
2231
2296
 
2232
2297
  activestorage:
2233
2298
  title: "ActiveStorage Health"
2299
+ probe:
2300
+ # Live reachability card. %{name} is the service name from
2301
+ # config/storage.yml and %{ms} a number of milliseconds.
2302
+ title: "Service reachability"
2303
+ reachable: "Reachable"
2304
+ unreachable: "Unreachable"
2305
+ service: "Service: %{name}"
2306
+ latency: "%{ms} ms round trip"
2307
+ how: "One existence check for a key that is never stored, made when this page loads. GET /health runs the same probe."
2234
2308
 
2235
2309
  empty:
2236
2310
  title: "No ActiveStorage Events Found"
@@ -60,6 +60,8 @@ es:
60
60
  llm: LLM
61
61
  n_plus_one: Consultas N+1
62
62
  deprecations: Deprecations
63
+ missing_translations: "Traducciones"
64
+ boot_errors: "Errores de arranque"
63
65
  swallowed: Silenciadas
64
66
  diagnostic_dumps: Diagnóstico
65
67
  storms: Tormentas
@@ -858,6 +860,53 @@ es:
858
860
  error_log
859
861
  footer_tip: Las excepciones silenciadas se lanzan y luego se capturan sin
860
862
  aviso. Pueden ocultar errores reales.
863
+ missing_translations_page:
864
+ title: "Traducciones faltantes"
865
+ empty_title: "No se registraron traducciones faltantes"
866
+ empty_body: "No se registraron claves de traducción faltantes en los últimos %{days} días."
867
+ how_title: "Cómo se registran las traducciones faltantes:"
868
+ how_enabled_html: "El seguimiento debe estar activado (%{option})"
869
+ how_hooked: "RED envuelve I18n.exception_handler y delega en el handler que su aplicación ya tenía; nada más cambia en su configuración de I18n"
870
+ how_recorded: "Cada búsqueda que llega al handler — tanto I18n.t como el helper de vista t() — se cuenta por locale y clave, junto con el primer punto de llamada visto"
871
+ how_not_seen: "Una búsqueda con :default nunca falla, y una hecha con raise_on_missing_translations lanza una excepción antes de que se ejecute cualquier handler, así que ninguna se cuenta aquí"
872
+ how_buffered: "Los fallos se cuentan en memoria y se escriben al final de la petición o del job, así que espere un breve retraso antes de que aparezcan"
873
+ missing_keys: "Claves faltantes"
874
+ total_misses: "Fallos totales"
875
+ locales_affected: "Locales afectados"
876
+ all_title: "Claves de traducción faltantes"
877
+ column_key: "Clave"
878
+ column_locale: "Locale"
879
+ column_source: "Visto primero en"
880
+ column_misses: "Fallos"
881
+ column_first_seen: "Visto por primera vez"
882
+ overflow_notice: "%{count} fallos no pudieron atribuirse a una clave porque el búfer del rastreador (%{limit} claves por hilo) estaba lleno."
883
+ footer_tip: "Añada la clave al archivo de locale o pase un :default. Las claves que los usuarios realmente encontraron aparecen primero."
884
+ docs: "Guía i18n de Rails"
885
+
886
+ boot_errors_page:
887
+ title: "Errores de arranque"
888
+ empty_title: "No se registraron errores de arranque"
889
+ empty_body: "Ningún proceso murió al arrancar en los últimos %{days} días."
890
+ how_title: "Cómo se capturan los errores de arranque:"
891
+ how_enabled_html: "La captura de fallos debe estar activada (%{option})"
892
+ how_hooked: "RED registra su hook at_exit justo después de sus initializers y antes del eager loading de Rails, así que un fallo durante el arranque se ve aunque la app nunca termine de arrancar"
893
+ how_captured_html: "Un %{zeitwerk} por un archivo que define la constante equivocada, un %{syntax} en un modelo, un initializer que lanza una excepción: cualquier cosa que mate el proceso antes de atender una petición"
894
+ how_imported: "El fallo se escribe en disco, porque aún no hay base de datos, y se importa en el siguiente arranque que tenga éxito"
895
+ how_never: "Un proceso terminado con SIGKILL o por un segfault nunca es visto por at_exit, en ninguna herramienta"
896
+ unresolved: "Sin resolver"
897
+ boot_crashes: "Fallos de arranque"
898
+ failed_boots: "Arranques fallidos"
899
+ all_title: "Fallos de arranque por error"
900
+ column_error: "Error"
901
+ column_file: "Archivo"
902
+ column_constant: "Constante"
903
+ column_boots: "Arranques"
904
+ column_first_seen: "Visto por primera vez"
905
+ column_status: "Estado"
906
+ status_open: "Abierto"
907
+ status_resolved: "Resuelto"
908
+ footer_tip: "Un fallo de arranque significa que el proceso nunca atendió una petición. Corríjalo antes del próximo despliegue; la fila se resuelve como cualquier otro error."
909
+
861
910
  rack_attack_page:
862
911
  title: Eventos de límite de tasa
863
912
  missing_title: Rack Attack no está instalado
@@ -1129,7 +1178,7 @@ es:
1129
1178
  unable_to_detect: No se pudo detectar
1130
1179
  no_user_model: No se detectó ningún modelo User
1131
1180
  unable_to_query_count: No se pudo consultar la cantidad
1132
- manual_cleanup_required: Se requiere limpieza manual
1181
+ retention_enforced_by_job: "Eliminados por RetentionCleanupJob cuando su planificador lo ejecute"
1133
1182
  keep_forever: Conservar indefinidamente
1134
1183
  no_automatic_deletion: Sin eliminación automática
1135
1184
  run_command: 'Ejecutar:'
@@ -1137,8 +1186,7 @@ es:
1137
1186
  options:
1138
1187
  enable_middleware: Captura las excepciones no gestionadas
1139
1188
  enable_error_subscriber: Se suscribe a los eventos de error de Rails
1140
- retention_days: 'Solo limpieza manual (ejecutar: rails error_dashboard:cleanup_resolved
1141
- DAYS=90)'
1189
+ retention_days: "Eliminar errores no vistos durante estos días. Lo aplica RetentionCleanupJob, que la gema no programa por sí misma"
1142
1190
  max_backtrace_lines: Profundidad máxima del backtrace
1143
1191
  sampling_rate: Porcentaje de errores capturados
1144
1192
  application_name: Nombre de esta aplicación (se detecta automáticamente si
@@ -1157,7 +1205,7 @@ es:
1157
1205
  si no se define)
1158
1206
  async_logging: Procesamiento mediante jobs en segundo plano
1159
1207
  async_adapter: Adaptador de la cola de jobs
1160
- enable_rate_limiting: Limitar las solicitudes a la API
1208
+ enable_rate_limiting: "Limitar las solicitudes del panel por IP y ruta"
1161
1209
  rate_limit_per_minute: Solicitudes por minuto y por IP
1162
1210
  enable_slack_notifications: Notificaciones en tiempo real
1163
1211
  slack_webhook_url: Endpoint del webhook de Slack
@@ -1166,10 +1214,15 @@ es:
1166
1214
  notification_email_from: Dirección del remitente
1167
1215
  enable_discord_notifications: Notificaciones por webhook de Discord
1168
1216
  discord_webhook_url: Endpoint del webhook de Discord
1217
+ enable_telegram_notifications: "Notificaciones de Telegram mediante la Bot API"
1218
+ telegram_bot_token: "Token del bot de @BotFather (configure la variable de entorno TELEGRAM_BOT_TOKEN)"
1219
+ telegram_chat_id: "Chat, grupo o canal donde publica el bot"
1220
+ telegram_api_base_url: "Servidor de la Bot API (cámbielo solo para un proxy o un servidor propio)"
1169
1221
  enable_pagerduty_notifications: Escalado de errores críticos
1170
1222
  pagerduty_integration_key: Clave de API de PagerDuty
1171
1223
  enable_webhook_notifications: Endpoints de webhook genéricos
1172
1224
  webhook_urls: Endpoints de webhook personalizados
1225
+ webhook_signing_secret: Firma los webhooks salientes con HMAC-SHA256 (defina la variable de entorno WEBHOOK_SIGNING_SECRET)
1173
1226
  enable_scheduled_digests: Correos de resumen diarios/semanales. Programación
1174
1227
  mediante SolidQueue, Sidekiq o cron
1175
1228
  digest_frequency: Frecuencia de envío de los correos de resumen
@@ -1189,7 +1242,7 @@ es:
1189
1242
  source_code_context_lines: Líneas antes y después de la línea de destino
1190
1243
  enable_git_blame: Mostrar la información de git blame
1191
1244
  source_code_cache_ttl: Duración de la caché del código fuente
1192
- only_show_app_code_source: Ocultar gems y stdlib por seguridad
1245
+ only_show_app_code_source: "Ocultar el código de gems y vendor en el visor de código"
1193
1246
  git_branch_strategy: Estrategia de resolución de la rama
1194
1247
  enable_breadcrumbs: Capturar el rastro de actividad de la solicitud
1195
1248
  breadcrumb_buffer_size: Número máximo de breadcrumbs por solicitud
@@ -1224,6 +1277,7 @@ es:
1224
1277
  enable_crash_capture: Hook at_exit para caídas no gestionadas
1225
1278
  enable_coverage_tracking: 'Modo diagnóstico: actívelo desde el panel para
1226
1279
  ver las líneas ejecutadas en la vista del código fuente (Ruby 3.2+)'
1280
+ enable_missing_translation_tracking: "Cuenta los fallos de I18n de la app por locale y clave (envuelve I18n.exception_handler)"
1227
1281
  enable_rack_attack_tracking: Registrar los eventos throttle/blocklist en su
1228
1282
  propia tabla
1229
1283
  enable_actioncable_tracking: Seguir los eventos de canal de WebSocket como
@@ -1281,6 +1335,8 @@ es:
1281
1335
  breadcrumbs: Breadcrumbs
1282
1336
  system_health: Estado del sistema
1283
1337
  swallowed_exceptions: Detección de excepciones silenciadas
1338
+ missing_translations: "Seguimiento de traducciones faltantes"
1339
+ boot_errors: "Captura de errores de arranque"
1284
1340
  rack_attack: Seguimiento de Rack Attack
1285
1341
  actioncable: Seguimiento de ActionCable
1286
1342
  activestorage: Seguimiento de ActiveStorage
@@ -1694,6 +1750,13 @@ es:
1694
1750
  guide_link: Guía de ActionCable
1695
1751
  activestorage:
1696
1752
  title: Estado de ActiveStorage
1753
+ probe:
1754
+ title: "Accesibilidad del servicio"
1755
+ reachable: "Accesible"
1756
+ unreachable: "Inaccesible"
1757
+ service: "Servicio: %{name}"
1758
+ latency: "%{ms} ms de ida y vuelta"
1759
+ how: "Una comprobación de existencia de una clave que nunca se almacena, hecha al cargar esta página. GET /health ejecuta la misma comprobación."
1697
1760
  empty:
1698
1761
  title: No se encontraron eventos de ActiveStorage
1699
1762
  message: No se detectaron operaciones del servicio ActiveStorage en los
@@ -60,6 +60,8 @@ fr:
60
60
  llm: LLM
61
61
  n_plus_one: Requêtes N+1
62
62
  deprecations: Dépréciations
63
+ missing_translations: "Traductions"
64
+ boot_errors: "Erreurs de démarrage"
63
65
  swallowed: Avalées
64
66
  diagnostic_dumps: Diagnostics
65
67
  storms: Tempêtes
@@ -857,6 +859,53 @@ fr:
857
859
  dans error_log
858
860
  footer_tip: Les exceptions avalées sont levées puis rattrapées silencieusement.
859
861
  Elles peuvent masquer de vrais bugs.
862
+ missing_translations_page:
863
+ title: "Traductions manquantes"
864
+ empty_title: "Aucune traduction manquante enregistrée"
865
+ empty_body: "Aucune clé de traduction manquante n'a été enregistrée au cours des %{days} derniers jours."
866
+ how_title: "Comment les traductions manquantes sont suivies :"
867
+ how_enabled_html: "Le suivi doit être activé (%{option})"
868
+ how_hooked: "RED enveloppe I18n.exception_handler et délègue au handler que votre application avait déjà ; rien d'autre ne change dans votre configuration I18n"
869
+ how_recorded: "Chaque recherche qui aboutit au handler — via I18n.t comme via le helper de vue t() — est comptée par locale et par clé, avec le premier point d'appel observé"
870
+ how_not_seen: "Une recherche avec :default n'échoue jamais, et une recherche avec raise_on_missing_translations lève une exception avant tout handler ; aucune des deux n'est comptée ici"
871
+ how_buffered: "Les échecs sont comptés en mémoire et écrits à la fin de la requête ou du job ; comptez un court délai avant qu'ils n'apparaissent"
872
+ missing_keys: "Clés manquantes"
873
+ total_misses: "Échecs au total"
874
+ locales_affected: "Locales concernées"
875
+ all_title: "Clés de traduction manquantes"
876
+ column_key: "Clé"
877
+ column_locale: "Locale"
878
+ column_source: "Vu d'abord dans"
879
+ column_misses: "Échecs"
880
+ column_first_seen: "Première occurrence"
881
+ overflow_notice: "%{count} échecs n'ont pas pu être attribués à une clé parce que le tampon du suivi (%{limit} clés par thread) était plein."
882
+ footer_tip: "Ajoutez la clé au fichier de locale, ou passez un :default. Les clés réellement rencontrées par les utilisateurs sont listées en premier."
883
+ docs: "Guide i18n de Rails"
884
+
885
+ boot_errors_page:
886
+ title: "Erreurs de démarrage"
887
+ empty_title: "Aucune erreur de démarrage enregistrée"
888
+ empty_body: "Aucun processus n’est mort au démarrage au cours des %{days} derniers jours."
889
+ how_title: "Comment les erreurs de démarrage sont capturées :"
890
+ how_enabled_html: "La capture des plantages doit être activée (%{option})"
891
+ how_hooked: "RED enregistre son hook at_exit juste après vos initializers et avant l’eager loading de Rails, si bien qu’un plantage au démarrage est vu même si l’application n’a jamais fini de démarrer"
892
+ how_captured_html: "Une %{zeitwerk} due à un fichier qui définit la mauvaise constante, une %{syntax} dans un modèle, un initializer qui lève une exception : tout ce qui tue le processus avant qu’il serve une requête"
893
+ how_imported: "Le plantage est écrit sur disque, faute de base de données à ce stade, puis importé au prochain démarrage réussi"
894
+ how_never: "Un processus tué par SIGKILL ou un segfault n’est jamais vu par at_exit, dans aucun outil"
895
+ unresolved: "Non résolus"
896
+ boot_crashes: "Plantages au démarrage"
897
+ failed_boots: "Démarrages échoués"
898
+ all_title: "Plantages au démarrage par erreur"
899
+ column_error: "Erreur"
900
+ column_file: "Fichier"
901
+ column_constant: "Constante"
902
+ column_boots: "Démarrages"
903
+ column_first_seen: "Première occurrence"
904
+ column_status: "Statut"
905
+ status_open: "Ouvert"
906
+ status_resolved: "Résolu"
907
+ footer_tip: "Un plantage au démarrage signifie que le processus n’a jamais servi de requête. Corrigez-le avant le prochain déploiement ; la ligne se résout comme n’importe quelle autre erreur."
908
+
860
909
  rack_attack_page:
861
910
  title: Événements de limitation de débit
862
911
  missing_title: Rack Attack n'est pas installé
@@ -1130,7 +1179,7 @@ fr:
1130
1179
  unable_to_detect: Détection impossible
1131
1180
  no_user_model: Aucun modèle User détecté
1132
1181
  unable_to_query_count: Impossible d'interroger le nombre
1133
- manual_cleanup_required: Nettoyage manuel requis
1182
+ retention_enforced_by_job: "Supprimés par RetentionCleanupJob dès que votre planificateur l'exécute"
1134
1183
  keep_forever: Conserver indéfiniment
1135
1184
  no_automatic_deletion: Aucune suppression automatique
1136
1185
  run_command: 'Exécuter :'
@@ -1138,8 +1187,7 @@ fr:
1138
1187
  options:
1139
1188
  enable_middleware: Intercepte les exceptions non gérées
1140
1189
  enable_error_subscriber: S'abonne aux événements d'erreur de Rails
1141
- retention_days: 'Nettoyage manuel uniquement (exécuter : rails error_dashboard:cleanup_resolved
1142
- DAYS=90)'
1190
+ retention_days: "Supprimer les erreurs non vues depuis ce nombre de jours. Appliqué par RetentionCleanupJob, que la gem ne planifie pas elle-même"
1143
1191
  max_backtrace_lines: Profondeur maximale du backtrace
1144
1192
  sampling_rate: Pourcentage d'erreurs capturées
1145
1193
  application_name: Nom de cette application (détecté automatiquement si non
@@ -1158,7 +1206,7 @@ fr:
1158
1206
  si non défini)
1159
1207
  async_logging: Traitement par jobs en arrière-plan
1160
1208
  async_adapter: Adaptateur de file d'attente des jobs
1161
- enable_rate_limiting: Limiter le débit des requêtes API
1209
+ enable_rate_limiting: "Limiter les requêtes du tableau de bord par IP et par chemin"
1162
1210
  rate_limit_per_minute: Requêtes par minute et par IP
1163
1211
  enable_slack_notifications: Notifications en temps réel
1164
1212
  slack_webhook_url: Point de terminaison du webhook Slack
@@ -1167,10 +1215,15 @@ fr:
1167
1215
  notification_email_from: Adresse de l'expéditeur
1168
1216
  enable_discord_notifications: Notifications par webhook Discord
1169
1217
  discord_webhook_url: Point de terminaison du webhook Discord
1218
+ enable_telegram_notifications: "Notifications Telegram via l'API Bot"
1219
+ telegram_bot_token: "Jeton du bot fourni par @BotFather (définir la variable d'environnement TELEGRAM_BOT_TOKEN)"
1220
+ telegram_chat_id: "Discussion, groupe ou canal où le bot publie"
1221
+ telegram_api_base_url: "Serveur de l'API Bot (à modifier seulement pour un proxy ou un serveur auto-hébergé)"
1170
1222
  enable_pagerduty_notifications: Escalade des erreurs critiques
1171
1223
  pagerduty_integration_key: Clé API PagerDuty
1172
1224
  enable_webhook_notifications: Points de terminaison webhook génériques
1173
1225
  webhook_urls: Points de terminaison webhook personnalisés
1226
+ webhook_signing_secret: Signe les webhooks sortants en HMAC-SHA256 (définir la variable d’environnement WEBHOOK_SIGNING_SECRET)
1174
1227
  enable_scheduled_digests: E-mails de résumé quotidiens/hebdomadaires. Planification
1175
1228
  via SolidQueue, Sidekiq ou cron
1176
1229
  digest_frequency: Fréquence d'envoi des e-mails de résumé
@@ -1190,7 +1243,7 @@ fr:
1190
1243
  source_code_context_lines: Lignes avant et après la ligne ciblée
1191
1244
  enable_git_blame: Afficher les informations git blame
1192
1245
  source_code_cache_ttl: Durée de mise en cache du code source
1193
- only_show_app_code_source: Masquer les gems et la stdlib par sécurité
1246
+ only_show_app_code_source: "Masquer le code des gems et de vendor dans le visualiseur de code"
1194
1247
  git_branch_strategy: Stratégie de résolution de la branche
1195
1248
  enable_breadcrumbs: Capturer le fil d'activité de la requête
1196
1249
  breadcrumb_buffer_size: Nombre maximal de breadcrumbs par requête
@@ -1224,6 +1277,7 @@ fr:
1224
1277
  enable_crash_capture: Hook at_exit pour les plantages non gérés
1225
1278
  enable_coverage_tracking: Mode diagnostic — à activer depuis le tableau de
1226
1279
  bord pour voir les lignes exécutées dans la vue du code source (Ruby 3.2+)
1280
+ enable_missing_translation_tracking: "Compte les échecs I18n de l'app par locale et par clé (enveloppe I18n.exception_handler)"
1227
1281
  enable_rack_attack_tracking: Enregistrer les événements throttle/blocklist
1228
1282
  dans leur propre table
1229
1283
  enable_actioncable_tracking: Suivre les événements des canaux WebSocket sous
@@ -1281,6 +1335,8 @@ fr:
1281
1335
  breadcrumbs: Breadcrumbs
1282
1336
  system_health: État du système
1283
1337
  swallowed_exceptions: Détection des exceptions avalées
1338
+ missing_translations: "Suivi des traductions manquantes"
1339
+ boot_errors: "Capture des erreurs de démarrage"
1284
1340
  rack_attack: Suivi de Rack Attack
1285
1341
  actioncable: Suivi d'ActionCable
1286
1342
  activestorage: Suivi d'ActiveStorage
@@ -1697,6 +1753,13 @@ fr:
1697
1753
  guide_link: Guide d'ActionCable
1698
1754
  activestorage:
1699
1755
  title: État d'ActiveStorage
1756
+ probe:
1757
+ title: "Joignabilité du service"
1758
+ reachable: "Joignable"
1759
+ unreachable: "Injoignable"
1760
+ service: "Service : %{name}"
1761
+ latency: "%{ms} ms aller-retour"
1762
+ how: "Une vérification d’existence d’une clé jamais stockée, faite au chargement de cette page. GET /health exécute la même sonde."
1700
1763
  empty:
1701
1764
  title: Aucun événement ActiveStorage trouvé
1702
1765
  message: Aucune opération de service ActiveStorage n'a été détectée dans