rails_error_dashboard 0.14.4 → 0.16.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -8
  3. data/app/controllers/rails_error_dashboard/application_controller.rb +28 -4
  4. data/app/controllers/rails_error_dashboard/errors_controller.rb +97 -4
  5. data/app/controllers/rails_error_dashboard/health_controller.rb +38 -0
  6. data/app/controllers/rails_error_dashboard/webhooks_controller.rb +10 -9
  7. data/app/helpers/rails_error_dashboard/application_helper.rb +2 -2
  8. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +63 -16
  9. data/app/helpers/rails_error_dashboard/overview_helper.rb +4 -0
  10. data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +20 -2
  11. data/app/jobs/rails_error_dashboard/cascade_detection_job.rb +30 -0
  12. data/app/jobs/rails_error_dashboard/concerns/plain_channel_message.rb +33 -6
  13. data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +1 -1
  14. data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +1 -1
  15. data/app/jobs/rails_error_dashboard/retention_cleanup_job.rb +31 -0
  16. data/app/jobs/rails_error_dashboard/scheduled_digest_job.rb +6 -1
  17. data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +1 -1
  18. data/app/jobs/rails_error_dashboard/telegram_error_notification_job.rb +25 -0
  19. data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +2 -18
  20. data/app/models/rails_error_dashboard/error_log.rb +54 -20
  21. data/app/models/rails_error_dashboard/error_occurrence.rb +1 -0
  22. data/app/models/rails_error_dashboard/error_occurrence_context.rb +14 -0
  23. data/app/models/rails_error_dashboard/missing_translation.rb +43 -0
  24. data/app/views/layouts/rails_error_dashboard.html.erb +14 -2
  25. data/app/views/rails_error_dashboard/errors/_captured_occurrences.html.erb +45 -0
  26. data/app/views/rails_error_dashboard/errors/_error_info.html.erb +12 -3
  27. data/app/views/rails_error_dashboard/errors/_occurrence_banner.html.erb +12 -0
  28. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +3 -1
  29. data/app/views/rails_error_dashboard/errors/_source_code.html.erb +3 -9
  30. data/app/views/rails_error_dashboard/errors/activestorage_health_summary.html.erb +28 -0
  31. data/app/views/rails_error_dashboard/errors/boot_errors.html.erb +130 -0
  32. data/app/views/rails_error_dashboard/errors/index.html.erb +1 -1
  33. data/app/views/rails_error_dashboard/errors/missing_translations.html.erb +143 -0
  34. data/app/views/rails_error_dashboard/errors/overview.html.erb +10 -7
  35. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +16 -11
  36. data/app/views/rails_error_dashboard/errors/settings/_value_badge.html.erb +7 -4
  37. data/app/views/rails_error_dashboard/errors/settings.html.erb +23 -8
  38. data/app/views/rails_error_dashboard/errors/show.html.erb +7 -4
  39. data/config/locales/de.yml +87 -5
  40. data/config/locales/en.yml +99 -4
  41. data/config/locales/es.yml +88 -5
  42. data/config/locales/fr.yml +88 -5
  43. data/config/locales/it.yml +88 -5
  44. data/config/locales/ja.yml +86 -4
  45. data/config/locales/pl.yml +89 -5
  46. data/config/locales/pt-BR.yml +88 -5
  47. data/config/locales/ru.yml +89 -5
  48. data/config/locales/uk.yml +89 -5
  49. data/config/locales/zh-CN.yml +86 -4
  50. data/config/routes.rb +6 -0
  51. data/db/migrate/20251223000000_create_rails_error_dashboard_complete_schema.rb +10 -2
  52. data/db/migrate/20260106094256_backfill_application_for_existing_errors.rb +3 -3
  53. data/db/migrate/20261010000001_create_missing_translations.rb +50 -0
  54. data/db/migrate/20261015000001_create_rails_error_dashboard_error_occurrence_contexts.rb +35 -0
  55. data/db/migrate/20261015000002_add_capture_source_to_error_occurrences_and_error_logs.rb +46 -0
  56. data/lib/generators/rails_error_dashboard/install/install_generator.rb +9 -4
  57. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +41 -5
  58. data/lib/rails_error_dashboard/commands/assign_error.rb +24 -1
  59. data/lib/rails_error_dashboard/commands/batch_mute_errors.rb +11 -2
  60. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +16 -3
  61. data/lib/rails_error_dashboard/commands/batch_unmute_errors.rb +7 -2
  62. data/lib/rails_error_dashboard/commands/find_or_increment_error.rb +6 -0
  63. data/lib/rails_error_dashboard/commands/flush_missing_translations.rb +101 -0
  64. data/lib/rails_error_dashboard/commands/flush_rack_attack_events.rb +2 -4
  65. data/lib/rails_error_dashboard/commands/flush_storm_counts.rb +7 -6
  66. data/lib/rails_error_dashboard/commands/flush_swallowed_exceptions.rb +2 -4
  67. data/lib/rails_error_dashboard/commands/log_error.rb +20 -8
  68. data/lib/rails_error_dashboard/commands/record_occurrence_context.rb +60 -0
  69. data/lib/rails_error_dashboard/commands/resolve_error.rb +2 -15
  70. data/lib/rails_error_dashboard/commands/update_error_status.rb +7 -0
  71. data/lib/rails_error_dashboard/configuration.rb +61 -4
  72. data/lib/rails_error_dashboard/engine.rb +42 -1
  73. data/lib/rails_error_dashboard/error_reporter.rb +4 -2
  74. data/lib/rails_error_dashboard/manual_error_reporter.rb +11 -1
  75. data/lib/rails_error_dashboard/middleware/error_catcher.rb +18 -4
  76. data/lib/rails_error_dashboard/middleware/rate_limiter.rb +7 -1
  77. data/lib/rails_error_dashboard/plugin.rb +19 -3
  78. data/lib/rails_error_dashboard/plugin_registry.rb +61 -12
  79. data/lib/rails_error_dashboard/queries/analytics_stats.rb +0 -12
  80. data/lib/rails_error_dashboard/queries/boot_errors.rb +76 -0
  81. data/lib/rails_error_dashboard/queries/co_occurring_errors.rb +59 -33
  82. data/lib/rails_error_dashboard/queries/dashboard_stats.rb +3 -11
  83. data/lib/rails_error_dashboard/queries/errors_list.rb +8 -16
  84. data/lib/rails_error_dashboard/queries/health_status.rb +191 -0
  85. data/lib/rails_error_dashboard/queries/missing_translation_summary.rb +82 -0
  86. data/lib/rails_error_dashboard/queries/platform_comparison.rb +14 -6
  87. data/lib/rails_error_dashboard/services/active_storage_probe.rb +91 -0
  88. data/lib/rails_error_dashboard/services/backtrace_parser.rb +13 -7
  89. data/lib/rails_error_dashboard/services/backtrace_processor.rb +31 -7
  90. data/lib/rails_error_dashboard/services/baseline_alert_payload_builder.rb +30 -0
  91. data/lib/rails_error_dashboard/services/crash_capture.rb +90 -2
  92. data/lib/rails_error_dashboard/services/digest_builder.rb +9 -6
  93. data/lib/rails_error_dashboard/services/error_notification_dispatcher.rb +6 -0
  94. data/lib/rails_error_dashboard/services/github_link_generator.rb +25 -14
  95. data/lib/rails_error_dashboard/services/markdown_error_formatter.rb +15 -16
  96. data/lib/rails_error_dashboard/services/missing_translation_handler.rb +152 -0
  97. data/lib/rails_error_dashboard/services/missing_translation_tracker.rb +316 -0
  98. data/lib/rails_error_dashboard/services/repository_url.rb +18 -0
  99. data/lib/rails_error_dashboard/services/resolution_callbacks.rb +44 -0
  100. data/lib/rails_error_dashboard/services/severity_classifier.rb +52 -0
  101. data/lib/rails_error_dashboard/services/similarity_calculator.rb +3 -9
  102. data/lib/rails_error_dashboard/services/source_code_reader.rb +23 -3
  103. data/lib/rails_error_dashboard/services/storm_protection/count_buffer.rb +6 -3
  104. data/lib/rails_error_dashboard/services/storm_protection/gate.rb +6 -1
  105. data/lib/rails_error_dashboard/services/telegram_delivery.rb +134 -0
  106. data/lib/rails_error_dashboard/services/telegram_payload_builder.rb +105 -0
  107. data/lib/rails_error_dashboard/services/webhook_delivery.rb +63 -0
  108. data/lib/rails_error_dashboard/services/webhook_signer.rb +80 -0
  109. data/lib/rails_error_dashboard/value_objects/occurrence_snapshot.rb +23 -0
  110. data/lib/rails_error_dashboard/version.rb +1 -1
  111. data/lib/rails_error_dashboard.rb +28 -0
  112. data/lib/tasks/error_dashboard.rake +2 -3
  113. metadata +29 -2
@@ -36,6 +36,8 @@ de:
36
36
  healthy: "✅ Fehlerfrei"
37
37
  warning: "⚠️ Warnung"
38
38
  critical: "\U0001F534 Kritisch"
39
+ not_rated: "Nicht bewertet"
40
+ not_rated_hint: "Eine Bewertung vergleicht Plattformen und braucht daher Fehler auf mindestens zwei."
39
41
  device_type:
40
42
  mobile: Mobil
41
43
  tablet: Tablet
@@ -60,6 +62,8 @@ de:
60
62
  llm: LLM
61
63
  n_plus_one: N+1-Abfragen
62
64
  deprecations: Deprecations
65
+ missing_translations: "Übersetzungen"
66
+ boot_errors: "Startfehler"
63
67
  swallowed: Verschluckt
64
68
  diagnostic_dumps: Diagnose
65
69
  storms: Fehlerstürme
@@ -240,6 +244,10 @@ de:
240
244
  inactive_body: aktivieren, um ausgeführte Zeilen zu sehen
241
245
  enable: Aktivieren
242
246
  disable: Deaktivieren
247
+ occurrence:
248
+ title: "Vorkommen #%{id}"
249
+ body: "Breadcrumbs, Systemzustand und Variablen stammen aus diesem Vorkommen. Alles andere zeigt die neueste Erfassung."
250
+ show_latest: "Neueste anzeigen"
243
251
  baselines:
244
252
  title: Referenzstatistiken
245
253
  anomaly_label: 'Anomalie:'
@@ -495,6 +503,14 @@ de:
495
503
  one: "+%{count} weiterer"
496
504
  other: "+%{count} weitere"
497
505
  view_errors: Fehler ansehen
506
+ captured_occurrences:
507
+ title: "Erfasste Vorkommen"
508
+ hint: "Breadcrumbs, Systemzustand und Variablen werden für die neuesten Vorkommen aufbewahrt (occurrence_context_limit). Öffnen Sie eines, um sie zu sehen."
509
+ column_occurrence: "Vorkommen"
510
+ column_occurred_at: "Aufgetreten"
511
+ column_version: "Version"
512
+ view: "Anzeigen"
513
+ viewing: "Angezeigt"
498
514
  co_occurring:
499
515
  title: Gemeinsam auftretende Fehler
500
516
  badge: Zeitliche Muster
@@ -739,6 +755,7 @@ de:
739
755
  other: "%{count} Frames"
740
756
  click_to_expand: "(zum Aufklappen klicken)"
741
757
  view_source: Quellcode ansehen
758
+ client_report_note: "Diese Frames stammen aus einem Client-Bericht (ManualErrorReporter). Sie beschreiben Code, der auf dem Client lief, daher öffnet RED für sie keine Quelldatei, zeigt keinen Ausschnitt und führt kein git blame aus."
742
759
  none: Kein Backtrace verfügbar
743
760
  row:
744
761
  new_badge: NEU
@@ -828,6 +845,53 @@ de:
828
845
  gelangt sind
829
846
  footer_tip: Verschluckte Exceptions werden ausgelöst und dann still abgefangen.
830
847
  Sie können echte Fehler verbergen.
848
+ missing_translations_page:
849
+ title: "Fehlende Übersetzungen"
850
+ empty_title: "Keine fehlenden Übersetzungen erfasst"
851
+ empty_body: "In den letzten %{days} Tagen wurden keine fehlenden Übersetzungsschlüssel erfasst."
852
+ how_title: "So werden fehlende Übersetzungen erfasst:"
853
+ how_enabled_html: "Die Erfassung muss aktiviert sein (%{option})"
854
+ 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"
855
+ 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"
856
+ 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"
857
+ 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"
858
+ missing_keys: "Fehlende Schlüssel"
859
+ total_misses: "Fehlschläge gesamt"
860
+ locales_affected: "Betroffene Locales"
861
+ all_title: "Fehlende Übersetzungsschlüssel"
862
+ column_key: "Schlüssel"
863
+ column_locale: "Locale"
864
+ column_source: "Zuerst gesehen in"
865
+ column_misses: "Fehlschläge"
866
+ column_first_seen: "Zuerst gesehen"
867
+ overflow_notice: "%{count} Fehlschläge konnten keinem Schlüssel zugeordnet werden, weil der Puffer des Trackers (%{limit} Schlüssel pro Thread) voll war."
868
+ 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."
869
+ docs: "Rails-i18n-Leitfaden"
870
+
871
+ boot_errors_page:
872
+ title: "Startfehler"
873
+ empty_title: "Keine Startfehler erfasst"
874
+ empty_body: "In den letzten %{days} Tagen ist kein Prozess beim Starten abgestürzt."
875
+ how_title: "So werden Startfehler erfasst:"
876
+ how_enabled_html: "Die Absturzerfassung muss aktiviert sein (%{option})"
877
+ 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"
878
+ 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"
879
+ how_imported: "Der Absturz wird auf die Festplatte geschrieben, weil es noch keine Datenbank gibt, und beim nächsten erfolgreichen Start importiert"
880
+ how_never: "Ein per SIGKILL beendeter oder abgestürzter (Segfault) Prozess wird von at_exit nie gesehen, in keinem Werkzeug"
881
+ unresolved: "Ungelöst"
882
+ boot_crashes: "Startabstürze"
883
+ failed_boots: "Fehlgeschlagene Starts"
884
+ all_title: "Startabstürze nach Fehler"
885
+ column_error: "Fehler"
886
+ column_file: "Datei"
887
+ column_constant: "Konstante"
888
+ column_boots: "Starts"
889
+ column_first_seen: "Zuerst gesehen"
890
+ column_status: "Status"
891
+ status_open: "Offen"
892
+ status_resolved: "Gelöst"
893
+ 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."
894
+
831
895
  rack_attack_page:
832
896
  title: Rate-Limit-Ereignisse
833
897
  missing_title: Rack Attack ist nicht installiert
@@ -1052,6 +1116,9 @@ de:
1052
1116
  events:
1053
1117
  one: "%{count} Ereignis"
1054
1118
  other: "%{count} Ereignisse"
1119
+ occurrences:
1120
+ one: "%{count} Vorkommen"
1121
+ other: "%{count} Vorkommen"
1055
1122
  queries:
1056
1123
  one: "%{count} Abfrage"
1057
1124
  other: "%{count} Abfragen"
@@ -1087,7 +1154,7 @@ de:
1087
1154
  unable_to_detect: Erkennung nicht möglich
1088
1155
  no_user_model: Kein User-Modell erkannt
1089
1156
  unable_to_query_count: Anzahl konnte nicht abgefragt werden
1090
- manual_cleanup_required: Manuelle Bereinigung erforderlich
1157
+ retention_enforced_by_job: "Wird vom RetentionCleanupJob gelöscht, sobald Ihr Scheduler ihn ausführt"
1091
1158
  keep_forever: Dauerhaft behalten
1092
1159
  no_automatic_deletion: Keine automatische Löschung
1093
1160
  run_command: 'Ausführen:'
@@ -1095,8 +1162,8 @@ de:
1095
1162
  options:
1096
1163
  enable_middleware: Fängt unbehandelte Exceptions ab
1097
1164
  enable_error_subscriber: Abonniert Rails-Fehlerereignisse
1098
- retention_days: 'Nur manuelle Bereinigung (ausführen: rails error_dashboard:cleanup_resolved
1099
- DAYS=90)'
1165
+ retention_days: "Fehler löschen, die so viele Tage nicht mehr aufgetreten sind. Durchgesetzt vom RetentionCleanupJob, den das Gem selbst nicht einplant"
1166
+ occurrence_context_limit: "Für wie viele der neuesten Vorkommen je Fehler Breadcrumbs, Systemzustand und Variablen aufbewahrt werden (0 = aus)"
1100
1167
  max_backtrace_lines: Maximale Backtrace-Tiefe
1101
1168
  sampling_rate: Anteil der erfassten Fehler
1102
1169
  application_name: Name dieser Anwendung (wird automatisch erkannt, wenn nicht
@@ -1115,7 +1182,7 @@ de:
1115
1182
  erkannt, wenn nicht gesetzt)
1116
1183
  async_logging: Verarbeitung über Hintergrund-Jobs
1117
1184
  async_adapter: Adapter für die Job-Warteschlange
1118
- enable_rate_limiting: API-Anfragen drosseln
1185
+ enable_rate_limiting: "Dashboard-Anfragen pro IP und Pfad drosseln"
1119
1186
  rate_limit_per_minute: Anfragen pro Minute und IP
1120
1187
  enable_slack_notifications: Echtzeit-Benachrichtigungen
1121
1188
  slack_webhook_url: Slack-Webhook-Endpunkt
@@ -1124,10 +1191,15 @@ de:
1124
1191
  notification_email_from: Absenderadresse
1125
1192
  enable_discord_notifications: Discord-Webhook-Benachrichtigungen
1126
1193
  discord_webhook_url: Discord-Webhook-Endpunkt
1194
+ enable_telegram_notifications: "Telegram-Benachrichtigungen über die Bot-API"
1195
+ telegram_bot_token: "Bot-Token von @BotFather (Umgebungsvariable TELEGRAM_BOT_TOKEN setzen)"
1196
+ telegram_chat_id: "Chat, Gruppe oder Kanal, in den der Bot schreibt"
1197
+ telegram_api_base_url: "Bot-API-Server (nur für einen Proxy oder selbst gehosteten Server ändern)"
1127
1198
  enable_pagerduty_notifications: Eskalation bei kritischen Fehlern
1128
1199
  pagerduty_integration_key: PagerDuty-API-Schlüssel
1129
1200
  enable_webhook_notifications: Allgemeine Webhook-Endpunkte
1130
1201
  webhook_urls: Eigene Webhook-Endpunkte
1202
+ webhook_signing_secret: Signiert ausgehende Webhooks mit HMAC-SHA256 (Umgebungsvariable WEBHOOK_SIGNING_SECRET setzen)
1131
1203
  enable_scheduled_digests: Tägliche/wöchentliche Zusammenfassungs-E-Mails.
1132
1204
  Planung über SolidQueue, Sidekiq oder cron
1133
1205
  digest_frequency: Wie oft Zusammenfassungs-E-Mails gesendet werden
@@ -1148,7 +1220,7 @@ de:
1148
1220
  source_code_context_lines: Zeilen vor und nach der Zielzeile
1149
1221
  enable_git_blame: git-blame-Informationen anzeigen
1150
1222
  source_code_cache_ttl: Cache-Dauer für den Quellcode
1151
- only_show_app_code_source: Gems und stdlib aus Sicherheitsgründen ausblenden
1223
+ only_show_app_code_source: "Gem- und Vendor-Code im Quelltext-Viewer ausblenden"
1152
1224
  git_branch_strategy: Strategie zur Branch-Auflösung
1153
1225
  enable_breadcrumbs: Aktivitätsverlauf der Anfrage erfassen
1154
1226
  breadcrumb_buffer_size: Maximale Anzahl Breadcrumbs pro Anfrage
@@ -1180,6 +1252,7 @@ de:
1180
1252
  enable_crash_capture: at_exit-Hook für unbehandelte Abstürze
1181
1253
  enable_coverage_tracking: Diagnosemodus — über das Dashboard aktivieren, um
1182
1254
  ausgeführte Zeilen in der Quellcodeansicht zu sehen (Ruby 3.2+)
1255
+ enable_missing_translation_tracking: "Zählt die I18n-Fehlschläge der App nach Locale und Schlüssel (umhüllt I18n.exception_handler)"
1183
1256
  enable_rack_attack_tracking: Throttle- und Blocklist-Ereignisse in einer eigenen
1184
1257
  Tabelle erfassen
1185
1258
  enable_actioncable_tracking: WebSocket-Kanalereignisse als Breadcrumbs erfassen
@@ -1235,6 +1308,8 @@ de:
1235
1308
  breadcrumbs: Breadcrumbs
1236
1309
  system_health: Systemzustand
1237
1310
  swallowed_exceptions: Erkennung verschluckter Exceptions
1311
+ missing_translations: "Erfassung fehlender Übersetzungen"
1312
+ boot_errors: "Erfassung von Startfehlern"
1238
1313
  rack_attack: Rack-Attack-Erfassung
1239
1314
  actioncable: ActionCable-Erfassung
1240
1315
  activestorage: ActiveStorage-Erfassung
@@ -1640,6 +1715,13 @@ de:
1640
1715
  guide_link: ActionCable-Leitfaden
1641
1716
  activestorage:
1642
1717
  title: ActiveStorage-Zustand
1718
+ probe:
1719
+ title: "Erreichbarkeit des Dienstes"
1720
+ reachable: "Erreichbar"
1721
+ unreachable: "Nicht erreichbar"
1722
+ service: "Dienst: %{name}"
1723
+ latency: "%{ms} ms Umlaufzeit"
1724
+ 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
1725
  empty:
1644
1726
  title: Keine ActiveStorage-Ereignisse gefunden
1645
1727
  message: In den Fehler-Breadcrumbs der letzten %{days} Tage wurden keine
@@ -82,6 +82,8 @@ en:
82
82
  healthy: "✅ Healthy"
83
83
  warning: "⚠️ Warning"
84
84
  critical: "🔴 Critical"
85
+ not_rated: "Not rated"
86
+ not_rated_hint: "A rating compares platforms, so it needs errors on at least two."
85
87
 
86
88
  # Device classes reported by the user-agent parser. Browser and OS names
87
89
  # (Chrome, Safari, Windows, iOS) are brands and stay as written; these
@@ -116,6 +118,8 @@ en:
116
118
  llm: "LLM"
117
119
  n_plus_one: "N+1 Queries"
118
120
  deprecations: "Deprecations"
121
+ missing_translations: "Translations"
122
+ boot_errors: "Boot Errors"
119
123
  swallowed: "Swallowed"
120
124
  diagnostic_dumps: "Diagnostics"
121
125
  storms: "Storms"
@@ -377,6 +381,11 @@ en:
377
381
  enable: "Enable"
378
382
  disable: "Disable"
379
383
 
384
+ occurrence:
385
+ title: "Occurrence #%{id}"
386
+ body: "Breadcrumbs, system health and variables are from this occurrence. Everything else shows the latest capture."
387
+ show_latest: "Show latest"
388
+
380
389
  baselines:
381
390
  title: "Baseline Statistics"
382
391
  # %{sigma} is a standard-deviation count, %{level} an anomaly level.
@@ -700,6 +709,15 @@ en:
700
709
  other: "+%{count} more"
701
710
  view_errors: "View Errors"
702
711
 
712
+ captured_occurrences:
713
+ title: "Captured occurrences"
714
+ hint: "Breadcrumbs, system health and variables are kept for the most recent occurrences (occurrence_context_limit). Open one to see them."
715
+ column_occurrence: "Occurrence"
716
+ column_occurred_at: "Occurred"
717
+ column_version: "Version"
718
+ view: "View"
719
+ viewing: "Viewing"
720
+
703
721
  co_occurring:
704
722
  title: "Co-occurring Errors"
705
723
  badge: "Time Patterns"
@@ -1055,6 +1073,7 @@ en:
1055
1073
  other: "%{count} frames"
1056
1074
  click_to_expand: "(click to expand)"
1057
1075
  view_source: "View Source"
1076
+ client_report_note: "These frames came from a client report (ManualErrorReporter). They describe code that ran on the client, so RED opens no source file, shows no snippet and runs no git blame for them."
1058
1077
  none: "No backtrace available"
1059
1078
 
1060
1079
  row:
@@ -1185,6 +1204,61 @@ en:
1185
1204
  view_unrescued: "View any unrescued %{exception} errors that leaked into error_log"
1186
1205
  footer_tip: "Swallowed exceptions are raised then silently rescued. They may hide real bugs."
1187
1206
 
1207
+ missing_translations_page:
1208
+ title: "Missing Translations"
1209
+ empty_title: "No Missing Translations Recorded"
1210
+ # %{days} is the selected day range.
1211
+ empty_body: "No missing translation keys were recorded over the last %{days} days."
1212
+ how_title: "How missing translations are tracked:"
1213
+ # %{option} is a config option name as a <code> element.
1214
+ how_enabled_html: "Tracking must be enabled (%{option})"
1215
+ # I18n.exception_handler, I18n.t, t(), :default and raise_on_missing_translations are Ruby/Rails API names, not prose.
1216
+ how_hooked: "RED wraps I18n.exception_handler and delegates to the handler your app already had; nothing else in your I18n configuration changes"
1217
+ 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"
1218
+ 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"
1219
+ 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"
1220
+ missing_keys: "Missing Keys"
1221
+ total_misses: "Total Misses"
1222
+ locales_affected: "Locales Affected"
1223
+ all_title: "Missing Translation Keys"
1224
+ column_key: "Key"
1225
+ column_locale: "Locale"
1226
+ column_source: "First Seen In"
1227
+ column_misses: "Misses"
1228
+ column_first_seen: "First Seen"
1229
+ # %{count} is a number of misses, %{limit} the per-thread buffer size.
1230
+ overflow_notice: "%{count} misses could not be attributed to a key because the tracker's buffer (%{limit} keys per thread) was full."
1231
+ footer_tip: "Add the key to the locale file, or pass a :default. Keys users actually hit are listed first."
1232
+ docs: "Rails i18n guide"
1233
+
1234
+ boot_errors_page:
1235
+ title: "Boot Errors"
1236
+ empty_title: "No Boot Errors Recorded"
1237
+ # %{days} is the selected day range.
1238
+ empty_body: "No process died while booting over the last %{days} days."
1239
+ how_title: "How boot errors are captured:"
1240
+ # %{option} is a config option name as a <code> element.
1241
+ how_enabled_html: "Crash capture must be enabled (%{option})"
1242
+ # at_exit, SIGKILL and segfault are Ruby/OS terms, not prose.
1243
+ 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"
1244
+ # %{zeitwerk} and %{syntax} are exception class names as <code> elements.
1245
+ 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"
1246
+ how_imported: "The crash is written to disk, because there is no database yet, and imported on the next boot that succeeds"
1247
+ how_never: "A process killed by SIGKILL or a segfault is never seen by at_exit, in any tool"
1248
+ unresolved: "Unresolved"
1249
+ boot_crashes: "Boot Crashes"
1250
+ failed_boots: "Failed Boots"
1251
+ all_title: "Boot Crashes by Error"
1252
+ column_error: "Error"
1253
+ column_file: "File"
1254
+ column_constant: "Constant"
1255
+ column_boots: "Boots"
1256
+ column_first_seen: "First Seen"
1257
+ column_status: "Status"
1258
+ status_open: "Open"
1259
+ status_resolved: "Resolved"
1260
+ 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."
1261
+
1188
1262
  rack_attack_page:
1189
1263
  title: "Rate Limit Events"
1190
1264
  missing_title: "Rack Attack Is Not Installed"
@@ -1475,6 +1549,9 @@ en:
1475
1549
  events:
1476
1550
  one: "%{count} event"
1477
1551
  other: "%{count} events"
1552
+ occurrences:
1553
+ one: "%{count} occurrence"
1554
+ other: "%{count} occurrences"
1478
1555
  queries:
1479
1556
  one: "%{count} query"
1480
1557
  other: "%{count} queries"
@@ -1523,7 +1600,7 @@ en:
1523
1600
  unable_to_detect: "Unable to detect"
1524
1601
  no_user_model: "No User model detected"
1525
1602
  unable_to_query_count: "Unable to query count"
1526
- manual_cleanup_required: "Manual cleanup required"
1603
+ retention_enforced_by_job: "Deleted by RetentionCleanupJob once your scheduler runs it"
1527
1604
  keep_forever: "Keep Forever"
1528
1605
  no_automatic_deletion: "No automatic deletion"
1529
1606
  # These label a rake command rendered beside them. The command is never
@@ -1538,7 +1615,8 @@ en:
1538
1615
  options:
1539
1616
  enable_middleware: "Catches unhandled exceptions"
1540
1617
  enable_error_subscriber: "Subscribes to Rails error events"
1541
- retention_days: "Manual cleanup only (run: rails error_dashboard:cleanup_resolved DAYS=90)"
1618
+ retention_days: "Delete errors not seen for this many days. Enforced by RetentionCleanupJob, which nothing in the gem schedules"
1619
+ occurrence_context_limit: "How many recent occurrences per error keep their breadcrumbs, system health and variables (0 = off)"
1542
1620
  max_backtrace_lines: "Stack trace depth limit"
1543
1621
  sampling_rate: "Percentage of errors captured"
1544
1622
  application_name: "Name of this application (auto-detected if not set)"
@@ -1552,7 +1630,7 @@ en:
1552
1630
  total_users_for_impact: "For impact % calculation (auto-detected if not set)"
1553
1631
  async_logging: "Background job processing"
1554
1632
  async_adapter: "Job queue adapter"
1555
- enable_rate_limiting: "Throttle API requests"
1633
+ enable_rate_limiting: "Throttle dashboard requests per IP and path"
1556
1634
  rate_limit_per_minute: "Requests per minute per IP"
1557
1635
  enable_slack_notifications: "Real-time notifications"
1558
1636
  slack_webhook_url: "Slack webhook endpoint"
@@ -1561,10 +1639,15 @@ en:
1561
1639
  notification_email_from: "Sender address"
1562
1640
  enable_discord_notifications: "Discord webhook notifications"
1563
1641
  discord_webhook_url: "Discord webhook endpoint"
1642
+ enable_telegram_notifications: "Telegram Bot API notifications"
1643
+ telegram_bot_token: "Bot token from @BotFather (set TELEGRAM_BOT_TOKEN env var)"
1644
+ telegram_chat_id: "Chat, group or channel the bot posts to"
1645
+ telegram_api_base_url: "Bot API server (change only for a proxy or self-hosted server)"
1564
1646
  enable_pagerduty_notifications: "Critical error escalation"
1565
1647
  pagerduty_integration_key: "PagerDuty API key"
1566
1648
  enable_webhook_notifications: "Generic webhook endpoints"
1567
1649
  webhook_urls: "Custom webhook endpoints"
1650
+ webhook_signing_secret: "Signs outbound webhooks with HMAC-SHA256 (set WEBHOOK_SIGNING_SECRET env var)"
1568
1651
  enable_scheduled_digests: "Daily/weekly summary emails. Schedule via SolidQueue, Sidekiq, or cron"
1569
1652
  digest_frequency: "How often to send digest emails"
1570
1653
  digest_recipients: "Email addresses (falls back to notification recipients)"
@@ -1582,7 +1665,7 @@ en:
1582
1665
  source_code_context_lines: "Lines before/after target line"
1583
1666
  enable_git_blame: "Show git blame info"
1584
1667
  source_code_cache_ttl: "Source code cache duration"
1585
- only_show_app_code_source: "Hide gems/stdlib for security"
1668
+ only_show_app_code_source: "Hide gem and vendored code in the source viewer"
1586
1669
  git_branch_strategy: "Branch resolution strategy"
1587
1670
  enable_breadcrumbs: "Capture request activity trail"
1588
1671
  breadcrumb_buffer_size: "Max breadcrumbs per request"
@@ -1608,6 +1691,7 @@ en:
1608
1691
  enable_diagnostic_dump: "On-demand system state snapshots"
1609
1692
  enable_crash_capture: "at_exit hook for unhandled crashes"
1610
1693
  enable_coverage_tracking: "Diagnostic mode — enable via dashboard to see executed lines in source view (Ruby 3.2+)"
1694
+ enable_missing_translation_tracking: "Count the app's I18n misses by locale and key (wraps I18n.exception_handler)"
1611
1695
  enable_rack_attack_tracking: "Record throttle/blocklist events to their own table"
1612
1696
  enable_actioncable_tracking: "Track WebSocket channel events as breadcrumbs"
1613
1697
  enable_activestorage_tracking: "Track uploads/downloads/deletes as breadcrumbs"
@@ -1687,6 +1771,8 @@ en:
1687
1771
  breadcrumbs: "Breadcrumbs"
1688
1772
  system_health: "System health"
1689
1773
  swallowed_exceptions: "Swallowed exception detection"
1774
+ missing_translations: "Missing-translation tracking"
1775
+ boot_errors: "Boot error capture"
1690
1776
  rack_attack: "Rack Attack tracking"
1691
1777
  actioncable: "ActionCable tracking"
1692
1778
  activestorage: "ActiveStorage tracking"
@@ -2231,6 +2317,15 @@ en:
2231
2317
 
2232
2318
  activestorage:
2233
2319
  title: "ActiveStorage Health"
2320
+ probe:
2321
+ # Live reachability card. %{name} is the service name from
2322
+ # config/storage.yml and %{ms} a number of milliseconds.
2323
+ title: "Service reachability"
2324
+ reachable: "Reachable"
2325
+ unreachable: "Unreachable"
2326
+ service: "Service: %{name}"
2327
+ latency: "%{ms} ms round trip"
2328
+ how: "One existence check for a key that is never stored, made when this page loads. GET /health runs the same probe."
2234
2329
 
2235
2330
  empty:
2236
2331
  title: "No ActiveStorage Events Found"
@@ -36,6 +36,8 @@ es:
36
36
  healthy: "✅ Correcto"
37
37
  warning: "⚠️ Advertencia"
38
38
  critical: "\U0001F534 Crítico"
39
+ not_rated: "Sin calificar"
40
+ not_rated_hint: "La calificación compara plataformas, así que necesita errores en al menos dos."
39
41
  device_type:
40
42
  mobile: Móvil
41
43
  tablet: Tableta
@@ -60,6 +62,8 @@ es:
60
62
  llm: LLM
61
63
  n_plus_one: Consultas N+1
62
64
  deprecations: Deprecations
65
+ missing_translations: "Traducciones"
66
+ boot_errors: "Errores de arranque"
63
67
  swallowed: Silenciadas
64
68
  diagnostic_dumps: Diagnóstico
65
69
  storms: Tormentas
@@ -245,6 +249,10 @@ es:
245
249
  inactive_body: actívela para ver las líneas ejecutadas
246
250
  enable: Activar
247
251
  disable: Desactivar
252
+ occurrence:
253
+ title: "Aparición #%{id}"
254
+ body: "Los breadcrumbs, el estado del sistema y las variables provienen de esta aparición. Todo lo demás muestra la captura más reciente."
255
+ show_latest: "Ver la más reciente"
248
256
  baselines:
249
257
  title: Estadísticas de referencia
250
258
  anomaly_label: 'Anomalía:'
@@ -517,6 +525,14 @@ es:
517
525
  other: "+%{count} más"
518
526
  many: "+%{count} más"
519
527
  view_errors: Ver los errores
528
+ captured_occurrences:
529
+ title: "Apariciones capturadas"
530
+ hint: "Los breadcrumbs, el estado del sistema y las variables se conservan para las apariciones más recientes (occurrence_context_limit). Abra una para verlos."
531
+ column_occurrence: "Aparición"
532
+ column_occurred_at: "Ocurrió"
533
+ column_version: "Versión"
534
+ view: "Ver"
535
+ viewing: "En pantalla"
520
536
  co_occurring:
521
537
  title: Errores concurrentes
522
538
  badge: Patrones temporales
@@ -767,6 +783,7 @@ es:
767
783
  many: "%{count} frames"
768
784
  click_to_expand: "(haga clic para desplegar)"
769
785
  view_source: Ver el código fuente
786
+ client_report_note: "Estos frames provienen de un informe de cliente (ManualErrorReporter). Describen código que se ejecutó en el cliente, así que RED no abre archivos fuente, no muestra fragmentos ni ejecuta git blame para ellos."
770
787
  none: No hay backtrace disponible
771
788
  row:
772
789
  new_badge: NUEVO
@@ -858,6 +875,53 @@ es:
858
875
  error_log
859
876
  footer_tip: Las excepciones silenciadas se lanzan y luego se capturan sin
860
877
  aviso. Pueden ocultar errores reales.
878
+ missing_translations_page:
879
+ title: "Traducciones faltantes"
880
+ empty_title: "No se registraron traducciones faltantes"
881
+ empty_body: "No se registraron claves de traducción faltantes en los últimos %{days} días."
882
+ how_title: "Cómo se registran las traducciones faltantes:"
883
+ how_enabled_html: "El seguimiento debe estar activado (%{option})"
884
+ 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"
885
+ 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"
886
+ 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í"
887
+ 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"
888
+ missing_keys: "Claves faltantes"
889
+ total_misses: "Fallos totales"
890
+ locales_affected: "Locales afectados"
891
+ all_title: "Claves de traducción faltantes"
892
+ column_key: "Clave"
893
+ column_locale: "Locale"
894
+ column_source: "Visto primero en"
895
+ column_misses: "Fallos"
896
+ column_first_seen: "Visto por primera vez"
897
+ overflow_notice: "%{count} fallos no pudieron atribuirse a una clave porque el búfer del rastreador (%{limit} claves por hilo) estaba lleno."
898
+ footer_tip: "Añada la clave al archivo de locale o pase un :default. Las claves que los usuarios realmente encontraron aparecen primero."
899
+ docs: "Guía i18n de Rails"
900
+
901
+ boot_errors_page:
902
+ title: "Errores de arranque"
903
+ empty_title: "No se registraron errores de arranque"
904
+ empty_body: "Ningún proceso murió al arrancar en los últimos %{days} días."
905
+ how_title: "Cómo se capturan los errores de arranque:"
906
+ how_enabled_html: "La captura de fallos debe estar activada (%{option})"
907
+ 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"
908
+ 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"
909
+ 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"
910
+ how_never: "Un proceso terminado con SIGKILL o por un segfault nunca es visto por at_exit, en ninguna herramienta"
911
+ unresolved: "Sin resolver"
912
+ boot_crashes: "Fallos de arranque"
913
+ failed_boots: "Arranques fallidos"
914
+ all_title: "Fallos de arranque por error"
915
+ column_error: "Error"
916
+ column_file: "Archivo"
917
+ column_constant: "Constante"
918
+ column_boots: "Arranques"
919
+ column_first_seen: "Visto por primera vez"
920
+ column_status: "Estado"
921
+ status_open: "Abierto"
922
+ status_resolved: "Resuelto"
923
+ 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."
924
+
861
925
  rack_attack_page:
862
926
  title: Eventos de límite de tasa
863
927
  missing_title: Rack Attack no está instalado
@@ -1089,6 +1153,10 @@ es:
1089
1153
  one: "%{count} evento"
1090
1154
  other: "%{count} eventos"
1091
1155
  many: "%{count} eventos"
1156
+ occurrences:
1157
+ one: "%{count} aparición"
1158
+ other: "%{count} apariciones"
1159
+ many: "%{count} apariciones"
1092
1160
  queries:
1093
1161
  one: "%{count} consulta"
1094
1162
  other: "%{count} consultas"
@@ -1129,7 +1197,7 @@ es:
1129
1197
  unable_to_detect: No se pudo detectar
1130
1198
  no_user_model: No se detectó ningún modelo User
1131
1199
  unable_to_query_count: No se pudo consultar la cantidad
1132
- manual_cleanup_required: Se requiere limpieza manual
1200
+ retention_enforced_by_job: "Eliminados por RetentionCleanupJob cuando su planificador lo ejecute"
1133
1201
  keep_forever: Conservar indefinidamente
1134
1202
  no_automatic_deletion: Sin eliminación automática
1135
1203
  run_command: 'Ejecutar:'
@@ -1137,8 +1205,8 @@ es:
1137
1205
  options:
1138
1206
  enable_middleware: Captura las excepciones no gestionadas
1139
1207
  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)'
1208
+ retention_days: "Eliminar errores no vistos durante estos días. Lo aplica RetentionCleanupJob, que la gema no programa por sí misma"
1209
+ occurrence_context_limit: "Cuántas apariciones recientes por error conservan sus breadcrumbs, estado del sistema y variables (0 = desactivado)"
1142
1210
  max_backtrace_lines: Profundidad máxima del backtrace
1143
1211
  sampling_rate: Porcentaje de errores capturados
1144
1212
  application_name: Nombre de esta aplicación (se detecta automáticamente si
@@ -1157,7 +1225,7 @@ es:
1157
1225
  si no se define)
1158
1226
  async_logging: Procesamiento mediante jobs en segundo plano
1159
1227
  async_adapter: Adaptador de la cola de jobs
1160
- enable_rate_limiting: Limitar las solicitudes a la API
1228
+ enable_rate_limiting: "Limitar las solicitudes del panel por IP y ruta"
1161
1229
  rate_limit_per_minute: Solicitudes por minuto y por IP
1162
1230
  enable_slack_notifications: Notificaciones en tiempo real
1163
1231
  slack_webhook_url: Endpoint del webhook de Slack
@@ -1166,10 +1234,15 @@ es:
1166
1234
  notification_email_from: Dirección del remitente
1167
1235
  enable_discord_notifications: Notificaciones por webhook de Discord
1168
1236
  discord_webhook_url: Endpoint del webhook de Discord
1237
+ enable_telegram_notifications: "Notificaciones de Telegram mediante la Bot API"
1238
+ telegram_bot_token: "Token del bot de @BotFather (configure la variable de entorno TELEGRAM_BOT_TOKEN)"
1239
+ telegram_chat_id: "Chat, grupo o canal donde publica el bot"
1240
+ telegram_api_base_url: "Servidor de la Bot API (cámbielo solo para un proxy o un servidor propio)"
1169
1241
  enable_pagerduty_notifications: Escalado de errores críticos
1170
1242
  pagerduty_integration_key: Clave de API de PagerDuty
1171
1243
  enable_webhook_notifications: Endpoints de webhook genéricos
1172
1244
  webhook_urls: Endpoints de webhook personalizados
1245
+ webhook_signing_secret: Firma los webhooks salientes con HMAC-SHA256 (defina la variable de entorno WEBHOOK_SIGNING_SECRET)
1173
1246
  enable_scheduled_digests: Correos de resumen diarios/semanales. Programación
1174
1247
  mediante SolidQueue, Sidekiq o cron
1175
1248
  digest_frequency: Frecuencia de envío de los correos de resumen
@@ -1189,7 +1262,7 @@ es:
1189
1262
  source_code_context_lines: Líneas antes y después de la línea de destino
1190
1263
  enable_git_blame: Mostrar la información de git blame
1191
1264
  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
1265
+ only_show_app_code_source: "Ocultar el código de gems y vendor en el visor de código"
1193
1266
  git_branch_strategy: Estrategia de resolución de la rama
1194
1267
  enable_breadcrumbs: Capturar el rastro de actividad de la solicitud
1195
1268
  breadcrumb_buffer_size: Número máximo de breadcrumbs por solicitud
@@ -1224,6 +1297,7 @@ es:
1224
1297
  enable_crash_capture: Hook at_exit para caídas no gestionadas
1225
1298
  enable_coverage_tracking: 'Modo diagnóstico: actívelo desde el panel para
1226
1299
  ver las líneas ejecutadas en la vista del código fuente (Ruby 3.2+)'
1300
+ enable_missing_translation_tracking: "Cuenta los fallos de I18n de la app por locale y clave (envuelve I18n.exception_handler)"
1227
1301
  enable_rack_attack_tracking: Registrar los eventos throttle/blocklist en su
1228
1302
  propia tabla
1229
1303
  enable_actioncable_tracking: Seguir los eventos de canal de WebSocket como
@@ -1281,6 +1355,8 @@ es:
1281
1355
  breadcrumbs: Breadcrumbs
1282
1356
  system_health: Estado del sistema
1283
1357
  swallowed_exceptions: Detección de excepciones silenciadas
1358
+ missing_translations: "Seguimiento de traducciones faltantes"
1359
+ boot_errors: "Captura de errores de arranque"
1284
1360
  rack_attack: Seguimiento de Rack Attack
1285
1361
  actioncable: Seguimiento de ActionCable
1286
1362
  activestorage: Seguimiento de ActiveStorage
@@ -1694,6 +1770,13 @@ es:
1694
1770
  guide_link: Guía de ActionCable
1695
1771
  activestorage:
1696
1772
  title: Estado de ActiveStorage
1773
+ probe:
1774
+ title: "Accesibilidad del servicio"
1775
+ reachable: "Accesible"
1776
+ unreachable: "Inaccesible"
1777
+ service: "Servicio: %{name}"
1778
+ latency: "%{ms} ms de ida y vuelta"
1779
+ 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
1780
  empty:
1698
1781
  title: No se encontraron eventos de ActiveStorage
1699
1782
  message: No se detectaron operaciones del servicio ActiveStorage en los