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 @@ pl:
36
36
  healthy: "✅ Sprawny"
37
37
  warning: "⚠️ Ostrzeżenie"
38
38
  critical: "\U0001F534 Krytyczny"
39
+ not_rated: "Bez oceny"
40
+ not_rated_hint: "Ocena porównuje platformy, więc potrzebne są błędy na co najmniej dwóch."
39
41
  device_type:
40
42
  mobile: Mobile
41
43
  tablet: Tablet
@@ -60,6 +62,8 @@ pl:
60
62
  llm: LLM
61
63
  n_plus_one: Zapytania N+1
62
64
  deprecations: Deprecations
65
+ missing_translations: "Tłumaczenia"
66
+ boot_errors: "Błędy startu"
63
67
  swallowed: Wyciszone
64
68
  diagnostic_dumps: Diagnostyka
65
69
  storms: Sztormy
@@ -246,6 +250,10 @@ pl:
246
250
  inactive_body: włącz, aby zobaczyć wykonane linie
247
251
  enable: Włącz
248
252
  disable: Wyłącz
253
+ occurrence:
254
+ title: "Wystąpienie #%{id}"
255
+ body: "Breadcrumbs, stan systemu i zmienne pochodzą z tego wystąpienia. Pozostałe dane pokazują najnowsze przechwycenie."
256
+ show_latest: "Pokaż najnowsze"
249
257
  baselines:
250
258
  title: Statystyki poziomu bazowego
251
259
  anomaly_label: 'Anomalia:'
@@ -518,6 +526,14 @@ pl:
518
526
  few: "+%{count} więcej"
519
527
  many: "+%{count} więcej"
520
528
  view_errors: Zobacz błędy
529
+ captured_occurrences:
530
+ title: "Zapisane wystąpienia"
531
+ hint: "Breadcrumbs, stan systemu i zmienne są przechowywane dla najnowszych wystąpień (occurrence_context_limit). Otwórz jedno, aby je zobaczyć."
532
+ column_occurrence: "Wystąpienie"
533
+ column_occurred_at: "Wystąpiło"
534
+ column_version: "Wersja"
535
+ view: "Pokaż"
536
+ viewing: "Wyświetlane"
521
537
  co_occurring:
522
538
  title: Współwystępujące błędy
523
539
  badge: Wzorce czasowe
@@ -772,6 +788,7 @@ pl:
772
788
  many: "%{count} ramek"
773
789
  click_to_expand: "(kliknij, aby rozwinąć)"
774
790
  view_source: Zobacz kod
791
+ client_report_note: "Te ramki pochodzą z raportu klienta (ManualErrorReporter). Opisują kod uruchomiony po stronie klienta, więc RED nie otwiera dla nich plików źródłowych, nie pokazuje fragmentów kodu ani nie uruchamia git blame."
775
792
  none: Backtrace niedostępny
776
793
  row:
777
794
  new_badge: NOWY
@@ -865,6 +882,53 @@ pl:
865
882
  error_log
866
883
  footer_tip: Wyciszone wyjątki są podnoszone, a następnie po cichu przechwytywane.
867
884
  Mogą ukrywać prawdziwe błędy.
885
+ missing_translations_page:
886
+ title: "Brakujące tłumaczenia"
887
+ empty_title: "Nie zarejestrowano brakujących tłumaczeń"
888
+ empty_body: "W ciągu ostatnich %{days} dni nie zarejestrowano brakujących kluczy tłumaczeń."
889
+ how_title: "Jak śledzone są brakujące tłumaczenia:"
890
+ how_enabled_html: "Śledzenie musi być włączone (%{option})"
891
+ how_hooked: "RED opakowuje I18n.exception_handler i przekazuje wywołanie do handlera, który aplikacja już miała; nic więcej w konfiguracji I18n się nie zmienia"
892
+ how_recorded: "Każde wyszukanie, które trafia do handlera — zarówno z I18n.t, jak i z helpera widoku t() — jest liczone według locale i klucza, wraz z pierwszym zaobserwowanym miejscem wywołania"
893
+ how_not_seen: "Wyszukanie z :default nigdy nie kończy się brakiem, a wyszukanie z raise_on_missing_translations zgłasza wyjątek, zanim uruchomi się jakikolwiek handler, więc żadne z nich nie jest tu liczone"
894
+ how_buffered: "Braki są liczone w pamięci i zapisywane na końcu żądania lub zadania, więc mogą pojawić się z niewielkim opóźnieniem"
895
+ missing_keys: "Brakujące klucze"
896
+ total_misses: "Łącznie braków"
897
+ locales_affected: "Dotknięte locale"
898
+ all_title: "Brakujące klucze tłumaczeń"
899
+ column_key: "Klucz"
900
+ column_locale: "Locale"
901
+ column_source: "Pierwszy raz w"
902
+ column_misses: "Braki"
903
+ column_first_seen: "Pierwsze wystąpienie"
904
+ overflow_notice: "%{count} braków nie udało się przypisać do klucza, ponieważ bufor trackera (%{limit} kluczy na wątek) był pełny."
905
+ footer_tip: "Dodaj klucz do pliku locale albo przekaż :default. Klucze, na które użytkownicy faktycznie trafili, są wymienione jako pierwsze."
906
+ docs: "Przewodnik i18n Rails"
907
+
908
+ boot_errors_page:
909
+ title: "Błędy startu"
910
+ empty_title: "Nie zarejestrowano błędów startu"
911
+ empty_body: "W ciągu ostatnich %{days} dni żaden proces nie zginął podczas startu."
912
+ how_title: "Jak przechwytywane są błędy startu:"
913
+ how_enabled_html: "Przechwytywanie awarii musi być włączone (%{option})"
914
+ how_hooked: "RED rejestruje swój hook at_exit zaraz po Twoich initializerach i przed eager loadingiem Rails, więc awaria podczas startu jest widziana, mimo że aplikacja nigdy nie wystartowała do końca"
915
+ how_captured_html: "%{zeitwerk} z pliku definiującego niewłaściwą stałą, %{syntax} w modelu, initializer zgłaszający wyjątek: wszystko, co zabija proces, zanim obsłuży żądanie"
916
+ how_imported: "Awaria jest zapisywana na dysk, bo bazy danych jeszcze nie ma, i importowana przy następnym udanym starcie"
917
+ how_never: "Procesu zabitego przez SIGKILL lub segfault at_exit nigdy nie zobaczy, w żadnym narzędziu"
918
+ unresolved: "Nierozwiązane"
919
+ boot_crashes: "Awarie startu"
920
+ failed_boots: "Nieudane starty"
921
+ all_title: "Awarie startu według błędu"
922
+ column_error: "Błąd"
923
+ column_file: "Plik"
924
+ column_constant: "Stała"
925
+ column_boots: "Starty"
926
+ column_first_seen: "Pierwsze wystąpienie"
927
+ column_status: "Status"
928
+ status_open: "Otwarty"
929
+ status_resolved: "Rozwiązany"
930
+ footer_tip: "Awaria startu oznacza, że proces nigdy nie obsłużył żądania. Napraw ją przed następnym wdrożeniem; wiersz rozwiązuje się jak każdy inny błąd."
931
+
868
932
  rack_attack_page:
869
933
  title: Zdarzenia limitu żądań
870
934
  missing_title: Rack Attack nie jest zainstalowany
@@ -1105,6 +1169,11 @@ pl:
1105
1169
  other: "%{count} zdarzenia"
1106
1170
  few: "%{count} zdarzenia"
1107
1171
  many: "%{count} zdarzeń"
1172
+ occurrences:
1173
+ one: "%{count} wystąpienie"
1174
+ other: "%{count} wystąpienia"
1175
+ few: "%{count} wystąpienia"
1176
+ many: "%{count} wystąpień"
1108
1177
  queries:
1109
1178
  one: "%{count} zapytanie"
1110
1179
  other: "%{count} zapytania"
@@ -1150,7 +1219,7 @@ pl:
1150
1219
  unable_to_detect: Nie udało się wykryć
1151
1220
  no_user_model: Nie wykryto modelu User
1152
1221
  unable_to_query_count: Nie udało się odczytać liczby
1153
- manual_cleanup_required: Wymagane ręczne czyszczenie
1222
+ retention_enforced_by_job: "Usuwane przez RetentionCleanupJob, gdy uruchomi go Twój harmonogram"
1154
1223
  keep_forever: Przechowuj bezterminowo
1155
1224
  no_automatic_deletion: Bez automatycznego usuwania
1156
1225
  run_command: 'Uruchom:'
@@ -1158,8 +1227,8 @@ pl:
1158
1227
  options:
1159
1228
  enable_middleware: Przechwytuje nieobsłużone wyjątki
1160
1229
  enable_error_subscriber: Subskrybuje zdarzenia błędów Rails
1161
- retention_days: 'Tylko ręczne czyszczenie (uruchom: rails error_dashboard:cleanup_resolved
1162
- DAYS=90)'
1230
+ retention_days: "Usuwaj błędy niewidziane przez tyle dni. Wykonuje to RetentionCleanupJob, którego gem sam nie planuje"
1231
+ occurrence_context_limit: "Ile najnowszych wystąpień każdego błędu zachowuje breadcrumbs, stan systemu i zmienne (0 = wyłączone)"
1163
1232
  max_backtrace_lines: Limit głębokości śladu stosu
1164
1233
  sampling_rate: Odsetek przechwytywanych błędów
1165
1234
  application_name: Nazwa tej aplikacji (wykrywana automatycznie, jeśli nie
@@ -1178,7 +1247,7 @@ pl:
1178
1247
  nie ustawiono)
1179
1248
  async_logging: Przetwarzanie w zadaniach w tle
1180
1249
  async_adapter: Adapter kolejki zadań
1181
- enable_rate_limiting: Ogranicza żądania do API
1250
+ enable_rate_limiting: "Ograniczaj żądania do panelu według IP i ścieżki"
1182
1251
  rate_limit_per_minute: Żądań na minutę z jednego IP
1183
1252
  enable_slack_notifications: Powiadomienia w czasie rzeczywistym
1184
1253
  slack_webhook_url: Punkt końcowy webhooka Slack
@@ -1187,10 +1256,15 @@ pl:
1187
1256
  notification_email_from: Adres nadawcy
1188
1257
  enable_discord_notifications: Powiadomienia przez webhook Discord
1189
1258
  discord_webhook_url: Punkt końcowy webhooka Discord
1259
+ enable_telegram_notifications: "Powiadomienia Telegram przez Bot API"
1260
+ telegram_bot_token: "Token bota z @BotFather (ustaw zmienną środowiskową TELEGRAM_BOT_TOKEN)"
1261
+ telegram_chat_id: "Czat, grupa lub kanał, do którego pisze bot"
1262
+ telegram_api_base_url: "Serwer Bot API (zmieniaj tylko dla proxy lub własnego serwera)"
1190
1263
  enable_pagerduty_notifications: Eskalacja błędów krytycznych
1191
1264
  pagerduty_integration_key: Klucz API PagerDuty
1192
1265
  enable_webhook_notifications: Dowolne punkty końcowe webhooków
1193
1266
  webhook_urls: Własne punkty końcowe webhooków
1267
+ webhook_signing_secret: Podpisuje wychodzące webhooki algorytmem HMAC-SHA256 (ustaw zmienną środowiskową WEBHOOK_SIGNING_SECRET)
1194
1268
  enable_scheduled_digests: Dzienne/tygodniowe e-maile podsumowujące. Planuj
1195
1269
  przez SolidQueue, Sidekiq lub cron
1196
1270
  digest_frequency: Jak często wysyłać e-maile podsumowujące
@@ -1210,7 +1284,7 @@ pl:
1210
1284
  source_code_context_lines: Linie przed i po linii docelowej
1211
1285
  enable_git_blame: Pokazuj informacje git blame
1212
1286
  source_code_cache_ttl: Czas buforowania kodu źródłowego
1213
- only_show_app_code_source: Ukryj gems/stdlib ze względów bezpieczeństwa
1287
+ only_show_app_code_source: "Ukryj kod gemów i vendor w podglądzie źródeł"
1214
1288
  git_branch_strategy: Strategia ustalania gałęzi
1215
1289
  enable_breadcrumbs: Przechwytuj ślad aktywności żądania
1216
1290
  breadcrumb_buffer_size: Maksymalna liczba breadcrumbs na żądanie
@@ -1242,6 +1316,7 @@ pl:
1242
1316
  enable_crash_capture: Hak at_exit dla nieobsłużonych awarii
1243
1317
  enable_coverage_tracking: Tryb diagnostyczny — włącz w panelu, aby widzieć
1244
1318
  wykonane linie w podglądzie kodu (Ruby 3.2+)
1319
+ enable_missing_translation_tracking: "Zlicza braki I18n aplikacji według locale i klucza (opakowuje I18n.exception_handler)"
1245
1320
  enable_rack_attack_tracking: Zapisuj zdarzenia throttle/blocklist w osobnej
1246
1321
  tabeli
1247
1322
  enable_actioncable_tracking: Śledź zdarzenia kanałów WebSocket jako breadcrumbs
@@ -1301,6 +1376,8 @@ pl:
1301
1376
  breadcrumbs: Breadcrumbs
1302
1377
  system_health: Stan systemu
1303
1378
  swallowed_exceptions: Wykrywanie wyciszonych wyjątków
1379
+ missing_translations: "Śledzenie brakujących tłumaczeń"
1380
+ boot_errors: "Przechwytywanie błędów startu"
1304
1381
  rack_attack: Śledzenie Rack Attack
1305
1382
  actioncable: Śledzenie ActionCable
1306
1383
  activestorage: Śledzenie ActiveStorage
@@ -1713,6 +1790,13 @@ pl:
1713
1790
  guide_link: Przewodnik po ActionCable
1714
1791
  activestorage:
1715
1792
  title: Stan ActiveStorage
1793
+ probe:
1794
+ title: "Osiągalność usługi"
1795
+ reachable: "Osiągalna"
1796
+ unreachable: "Nieosiągalna"
1797
+ service: "Usługa: %{name}"
1798
+ latency: "%{ms} ms w obie strony"
1799
+ how: "Jedno sprawdzenie istnienia klucza, który nigdy nie jest zapisywany, wykonywane przy ładowaniu tej strony. GET /health wykonuje tę samą sondę."
1716
1800
  empty:
1717
1801
  title: Nie znaleziono zdarzeń ActiveStorage
1718
1802
  message: W ciągu ostatnich %{days} dni nie wykryto operacji usług ActiveStorage
@@ -36,6 +36,8 @@ pt-BR:
36
36
  healthy: "✅ Saudável"
37
37
  warning: "⚠️ Atenção"
38
38
  critical: "\U0001F534 Crítico"
39
+ not_rated: "Sem avaliação"
40
+ not_rated_hint: "A avaliação compara plataformas, então precisa de erros em pelo menos duas."
39
41
  device_type:
40
42
  mobile: Celular
41
43
  tablet: Tablet
@@ -60,6 +62,8 @@ pt-BR:
60
62
  llm: LLM
61
63
  n_plus_one: Consultas N+1
62
64
  deprecations: Deprecations
65
+ missing_translations: "Traduções"
66
+ boot_errors: "Erros de inicialização"
63
67
  swallowed: Engolidas
64
68
  diagnostic_dumps: Diagnóstico
65
69
  storms: Tempestades
@@ -245,6 +249,10 @@ pt-BR:
245
249
  inactive_body: ative para ver as linhas executadas
246
250
  enable: Ativar
247
251
  disable: Desativar
252
+ occurrence:
253
+ title: "Ocorrência #%{id}"
254
+ body: "Breadcrumbs, saúde do sistema e variáveis vêm desta ocorrência. Todo o resto mostra a captura mais recente."
255
+ show_latest: "Ver a mais recente"
248
256
  baselines:
249
257
  title: Estatísticas de referência
250
258
  anomaly_label: 'Anomalia:'
@@ -517,6 +525,14 @@ pt-BR:
517
525
  other: "+%{count} outros"
518
526
  many: "+%{count} outros"
519
527
  view_errors: Ver os erros
528
+ captured_occurrences:
529
+ title: "Ocorrências capturadas"
530
+ hint: "Breadcrumbs, saúde do sistema e variáveis são mantidos para as ocorrências mais recentes (occurrence_context_limit). Abra uma para vê-los."
531
+ column_occurrence: "Ocorrência"
532
+ column_occurred_at: "Ocorreu em"
533
+ column_version: "Versão"
534
+ view: "Ver"
535
+ viewing: "Em exibição"
520
536
  co_occurring:
521
537
  title: Erros concomitantes
522
538
  badge: Padrões temporais
@@ -765,6 +781,7 @@ pt-BR:
765
781
  many: "%{count} frames"
766
782
  click_to_expand: "(clique para expandir)"
767
783
  view_source: Ver o código-fonte
784
+ client_report_note: "Estes frames vieram de um relatório do cliente (ManualErrorReporter). Eles descrevem código executado no cliente, por isso o RED não abre arquivos-fonte, não mostra trechos nem executa git blame para eles."
768
785
  none: Nenhum backtrace disponível
769
786
  row:
770
787
  new_badge: NOVO
@@ -855,6 +872,53 @@ pt-BR:
855
872
  view_unrescued: Ver os erros %{exception} não tratados que chegaram ao error_log
856
873
  footer_tip: As exceções engolidas são levantadas e depois tratadas em silêncio.
857
874
  Elas podem esconder bugs reais.
875
+ missing_translations_page:
876
+ title: "Traduções ausentes"
877
+ empty_title: "Nenhuma tradução ausente registrada"
878
+ empty_body: "Nenhuma chave de tradução ausente foi registrada nos últimos %{days} dias."
879
+ how_title: "Como as traduções ausentes são rastreadas:"
880
+ how_enabled_html: "O rastreamento precisa estar ativado (%{option})"
881
+ how_hooked: "O RED envolve o I18n.exception_handler e delega ao handler que sua aplicação já tinha; nada mais muda na sua configuração do I18n"
882
+ how_recorded: "Toda busca que chega ao handler — tanto por I18n.t quanto pelo helper de view t() — é contada por locale e chave, junto com o primeiro ponto de chamada observado"
883
+ how_not_seen: "Uma busca com :default nunca falha, e uma feita com raise_on_missing_translations lança uma exceção antes de qualquer handler rodar, então nenhuma das duas é contada aqui"
884
+ how_buffered: "As falhas são contadas em memória e gravadas ao fim da requisição ou do job, então espere um pequeno atraso até aparecerem"
885
+ missing_keys: "Chaves ausentes"
886
+ total_misses: "Total de falhas"
887
+ locales_affected: "Locales afetados"
888
+ all_title: "Chaves de tradução ausentes"
889
+ column_key: "Chave"
890
+ column_locale: "Locale"
891
+ column_source: "Visto primeiro em"
892
+ column_misses: "Falhas"
893
+ column_first_seen: "Primeira ocorrência"
894
+ overflow_notice: "%{count} falhas não puderam ser atribuídas a uma chave porque o buffer do rastreador (%{limit} chaves por thread) estava cheio."
895
+ footer_tip: "Adicione a chave ao arquivo de locale ou passe um :default. As chaves que os usuários realmente encontraram aparecem primeiro."
896
+ docs: "Guia i18n do Rails"
897
+
898
+ boot_errors_page:
899
+ title: "Erros de inicialização"
900
+ empty_title: "Nenhum erro de inicialização registrado"
901
+ empty_body: "Nenhum processo morreu ao iniciar nos últimos %{days} dias."
902
+ how_title: "Como os erros de inicialização são capturados:"
903
+ how_enabled_html: "A captura de falhas precisa estar ativada (%{option})"
904
+ how_hooked: "O RED registra seu hook at_exit logo após seus initializers e antes do eager loading do Rails, então uma falha durante a inicialização é vista mesmo que o app nunca termine de subir"
905
+ how_captured_html: "Um %{zeitwerk} de um arquivo que define a constante errada, um %{syntax} em um model, um initializer que lançou exceção: qualquer coisa que mate o processo antes de atender uma requisição"
906
+ how_imported: "A falha é gravada em disco, porque ainda não há banco de dados, e importada na próxima inicialização bem-sucedida"
907
+ how_never: "Um processo morto por SIGKILL ou por um segfault nunca é visto pelo at_exit, em nenhuma ferramenta"
908
+ unresolved: "Não resolvidos"
909
+ boot_crashes: "Falhas de inicialização"
910
+ failed_boots: "Inicializações com falha"
911
+ all_title: "Falhas de inicialização por erro"
912
+ column_error: "Erro"
913
+ column_file: "Arquivo"
914
+ column_constant: "Constante"
915
+ column_boots: "Inicializações"
916
+ column_first_seen: "Primeira ocorrência"
917
+ column_status: "Status"
918
+ status_open: "Aberto"
919
+ status_resolved: "Resolvido"
920
+ footer_tip: "Uma falha de inicialização significa que o processo nunca atendeu uma requisição. Corrija antes do próximo deploy; a linha é resolvida como qualquer outro erro."
921
+
858
922
  rack_attack_page:
859
923
  title: Eventos de limite de taxa
860
924
  missing_title: O Rack Attack não está instalado
@@ -1084,6 +1148,10 @@ pt-BR:
1084
1148
  one: "%{count} evento"
1085
1149
  other: "%{count} eventos"
1086
1150
  many: "%{count} eventos"
1151
+ occurrences:
1152
+ one: "%{count} ocorrência"
1153
+ other: "%{count} ocorrências"
1154
+ many: "%{count} ocorrências"
1087
1155
  queries:
1088
1156
  one: "%{count} consulta"
1089
1157
  other: "%{count} consultas"
@@ -1124,7 +1192,7 @@ pt-BR:
1124
1192
  unable_to_detect: Não foi possível detectar
1125
1193
  no_user_model: Nenhum modelo User detectado
1126
1194
  unable_to_query_count: Não foi possível consultar a quantidade
1127
- manual_cleanup_required: Limpeza manual necessária
1195
+ retention_enforced_by_job: "Excluídos pelo RetentionCleanupJob quando seu agendador o executar"
1128
1196
  keep_forever: Manter para sempre
1129
1197
  no_automatic_deletion: Sem exclusão automática
1130
1198
  run_command: 'Executar:'
@@ -1132,8 +1200,8 @@ pt-BR:
1132
1200
  options:
1133
1201
  enable_middleware: Captura exceções não tratadas
1134
1202
  enable_error_subscriber: Assina os eventos de erro do Rails
1135
- retention_days: 'Somente limpeza manual (executar: rails error_dashboard:cleanup_resolved
1136
- DAYS=90)'
1203
+ retention_days: "Excluir erros não vistos há este número de dias. Aplicado pelo RetentionCleanupJob, que a gem não agenda por conta própria"
1204
+ occurrence_context_limit: "Quantas ocorrências recentes por erro mantêm breadcrumbs, saúde do sistema e variáveis (0 = desativado)"
1137
1205
  max_backtrace_lines: Profundidade máxima do backtrace
1138
1206
  sampling_rate: Porcentagem de erros capturados
1139
1207
  application_name: Nome desta aplicação (detectado automaticamente se não for
@@ -1151,7 +1219,7 @@ pt-BR:
1151
1219
  se não for definido)
1152
1220
  async_logging: Processamento por jobs em segundo plano
1153
1221
  async_adapter: Adaptador da fila de jobs
1154
- enable_rate_limiting: Limitar as requisições à API
1222
+ enable_rate_limiting: "Limitar as requisições do painel por IP e caminho"
1155
1223
  rate_limit_per_minute: Requisições por minuto e por IP
1156
1224
  enable_slack_notifications: Notificações em tempo real
1157
1225
  slack_webhook_url: Endpoint do webhook do Slack
@@ -1160,10 +1228,15 @@ pt-BR:
1160
1228
  notification_email_from: Endereço do remetente
1161
1229
  enable_discord_notifications: Notificações por webhook do Discord
1162
1230
  discord_webhook_url: Endpoint do webhook do Discord
1231
+ enable_telegram_notifications: "Notificações do Telegram via Bot API"
1232
+ telegram_bot_token: "Token do bot do @BotFather (defina a variável de ambiente TELEGRAM_BOT_TOKEN)"
1233
+ telegram_chat_id: "Chat, grupo ou canal em que o bot publica"
1234
+ telegram_api_base_url: "Servidor da Bot API (altere apenas para um proxy ou servidor próprio)"
1163
1235
  enable_pagerduty_notifications: Escalonamento de erros críticos
1164
1236
  pagerduty_integration_key: Chave de API do PagerDuty
1165
1237
  enable_webhook_notifications: Endpoints de webhook genéricos
1166
1238
  webhook_urls: Endpoints de webhook personalizados
1239
+ webhook_signing_secret: Assina os webhooks de saída com HMAC-SHA256 (defina a variável de ambiente WEBHOOK_SIGNING_SECRET)
1167
1240
  enable_scheduled_digests: E-mails de resumo diários/semanais. Agendamento
1168
1241
  via SolidQueue, Sidekiq ou cron
1169
1242
  digest_frequency: Com que frequência enviar os e-mails de resumo
@@ -1183,7 +1256,7 @@ pt-BR:
1183
1256
  source_code_context_lines: Linhas antes e depois da linha de destino
1184
1257
  enable_git_blame: Exibir as informações do git blame
1185
1258
  source_code_cache_ttl: Duração do cache do código-fonte
1186
- only_show_app_code_source: Ocultar gems e stdlib por segurança
1259
+ only_show_app_code_source: "Ocultar código de gems e vendor no visualizador de código"
1187
1260
  git_branch_strategy: Estratégia de resolução do branch
1188
1261
  enable_breadcrumbs: Capturar o rastro de atividade da requisição
1189
1262
  breadcrumb_buffer_size: Número máximo de breadcrumbs por requisição
@@ -1215,6 +1288,7 @@ pt-BR:
1215
1288
  enable_crash_capture: Hook at_exit para falhas não tratadas
1216
1289
  enable_coverage_tracking: Modo diagnóstico — ative pelo painel para ver as
1217
1290
  linhas executadas na visualização do código-fonte (Ruby 3.2+)
1291
+ enable_missing_translation_tracking: "Conta as falhas de I18n do app por locale e chave (envolve o I18n.exception_handler)"
1218
1292
  enable_rack_attack_tracking: Registrar os eventos throttle/blocklist em uma
1219
1293
  tabela própria
1220
1294
  enable_actioncable_tracking: Monitorar os eventos de canal do WebSocket como
@@ -1272,6 +1346,8 @@ pt-BR:
1272
1346
  breadcrumbs: Breadcrumbs
1273
1347
  system_health: Saúde do sistema
1274
1348
  swallowed_exceptions: Detecção de exceções engolidas
1349
+ missing_translations: "Rastreamento de traduções ausentes"
1350
+ boot_errors: "Captura de erros de inicialização"
1275
1351
  rack_attack: Monitoramento do Rack Attack
1276
1352
  actioncable: Monitoramento do ActionCable
1277
1353
  activestorage: Monitoramento do ActiveStorage
@@ -1680,6 +1756,13 @@ pt-BR:
1680
1756
  guide_link: Guia do ActionCable
1681
1757
  activestorage:
1682
1758
  title: Saúde do ActiveStorage
1759
+ probe:
1760
+ title: "Alcançabilidade do serviço"
1761
+ reachable: "Alcançável"
1762
+ unreachable: "Inalcançável"
1763
+ service: "Serviço: %{name}"
1764
+ latency: "%{ms} ms de ida e volta"
1765
+ how: "Uma verificação de existência de uma chave que nunca é armazenada, feita ao carregar esta página. GET /health executa a mesma sonda."
1683
1766
  empty:
1684
1767
  title: Nenhum evento do ActiveStorage encontrado
1685
1768
  message: Nenhuma operação do serviço ActiveStorage foi detectada nos breadcrumbs
@@ -36,6 +36,8 @@ ru:
36
36
  healthy: "✅ В норме"
37
37
  warning: "⚠️ Предупреждение"
38
38
  critical: "\U0001F534 Критично"
39
+ not_rated: "Без оценки"
40
+ not_rated_hint: "Оценка сравнивает платформы, поэтому нужны ошибки как минимум на двух."
39
41
  device_type:
40
42
  mobile: Мобильное
41
43
  tablet: Планшет
@@ -60,6 +62,8 @@ ru:
60
62
  llm: LLM
61
63
  n_plus_one: N+1 запросы
62
64
  deprecations: Устаревшее
65
+ missing_translations: "Переводы"
66
+ boot_errors: "Ошибки запуска"
63
67
  swallowed: Подавленные
64
68
  diagnostic_dumps: Диагностика
65
69
  storms: Штормы
@@ -246,6 +250,10 @@ ru:
246
250
  inactive_body: включите, чтобы видеть выполненные строки
247
251
  enable: Включить
248
252
  disable: Отключить
253
+ occurrence:
254
+ title: "Событие #%{id}"
255
+ body: "Breadcrumbs, состояние системы и переменные относятся к этому событию. Всё остальное показывает последний захват."
256
+ show_latest: "Показать последнее"
249
257
  baselines:
250
258
  title: Статистика базовой линии
251
259
  anomaly_label: 'Аномалия:'
@@ -521,6 +529,14 @@ ru:
521
529
  few: "+ ещё %{count}"
522
530
  many: "+ ещё %{count}"
523
531
  view_errors: Смотреть ошибки
532
+ captured_occurrences:
533
+ title: "Сохранённые события"
534
+ hint: "Breadcrumbs, состояние системы и переменные хранятся для последних событий (occurrence_context_limit). Откройте событие, чтобы их увидеть."
535
+ column_occurrence: "Событие"
536
+ column_occurred_at: "Время"
537
+ column_version: "Версия"
538
+ view: "Открыть"
539
+ viewing: "Открыто"
524
540
  co_occurring:
525
541
  title: Сопутствующие ошибки
526
542
  badge: Временные закономерности
@@ -775,6 +791,7 @@ ru:
775
791
  many: "%{count} кадров"
776
792
  click_to_expand: "(нажмите, чтобы развернуть)"
777
793
  view_source: Смотреть исходный код
794
+ client_report_note: "Эти фреймы пришли из отчёта клиента (ManualErrorReporter). Они описывают код, выполнявшийся на клиенте, поэтому RED не открывает для них исходные файлы, не показывает фрагменты и не запускает git blame."
778
795
  none: Backtrace недоступен
779
796
  row:
780
797
  new_badge: НОВАЯ
@@ -868,6 +885,53 @@ ru:
868
885
  error_log
869
886
  footer_tip: Подавленные исключения возбуждаются, а затем молча перехватываются.
870
887
  Они могут скрывать настоящие ошибки.
888
+ missing_translations_page:
889
+ title: "Отсутствующие переводы"
890
+ empty_title: "Отсутствующие переводы не зафиксированы"
891
+ empty_body: "За последние %{days} дн. отсутствующие ключи перевода не зафиксированы."
892
+ how_title: "Как отслеживаются отсутствующие переводы:"
893
+ how_enabled_html: "Отслеживание должно быть включено (%{option})"
894
+ how_hooked: "RED оборачивает I18n.exception_handler и передаёт вызов обработчику, который уже был в приложении; больше ничего в настройках I18n не меняется"
895
+ how_recorded: "Каждый запрос, дошедший до обработчика — как через I18n.t, так и через хелпер t() во view — считается по локали и ключу вместе с первым замеченным местом вызова"
896
+ how_not_seen: "Запрос с :default никогда не даёт промаха, а запрос с raise_on_missing_translations выбрасывает исключение до вызова любого обработчика, поэтому здесь не учитываются ни тот, ни другой"
897
+ how_buffered: "Промахи считаются в памяти и записываются в конце запроса или задания, так что они появятся с небольшой задержкой"
898
+ missing_keys: "Отсутствующие ключи"
899
+ total_misses: "Всего промахов"
900
+ locales_affected: "Затронутые локали"
901
+ all_title: "Отсутствующие ключи перевода"
902
+ column_key: "Ключ"
903
+ column_locale: "Локаль"
904
+ column_source: "Впервые замечен в"
905
+ column_misses: "Промахи"
906
+ column_first_seen: "Впервые замечен"
907
+ overflow_notice: "%{count} промахов не удалось отнести к ключу: буфер трекера (%{limit} ключей на поток) был заполнен."
908
+ footer_tip: "Добавьте ключ в файл локали или передайте :default. Ключи, на которые действительно наткнулись пользователи, идут первыми."
909
+ docs: "Руководство Rails по i18n"
910
+
911
+ boot_errors_page:
912
+ title: "Ошибки запуска"
913
+ empty_title: "Ошибки запуска не зафиксированы"
914
+ empty_body: "За последние %{days} дн. ни один процесс не упал при запуске."
915
+ how_title: "Как перехватываются ошибки запуска:"
916
+ how_enabled_html: "Перехват аварий должен быть включён (%{option})"
917
+ how_hooked: "RED регистрирует свой хук at_exit сразу после ваших инициализаторов и до eager loading в Rails, поэтому авария при запуске видна, даже если приложение так и не запустилось"
918
+ how_captured_html: "%{zeitwerk} из файла, определяющего не ту константу, %{syntax} в модели, инициализатор с исключением: всё, что убивает процесс до обработки первого запроса"
919
+ how_imported: "Авария записывается на диск, потому что базы данных ещё нет, и импортируется при следующем успешном запуске"
920
+ how_never: "Процесс, убитый SIGKILL или упавший с segfault, at_exit не увидит ни в одном инструменте"
921
+ unresolved: "Нерешённые"
922
+ boot_crashes: "Аварии при запуске"
923
+ failed_boots: "Неудачные запуски"
924
+ all_title: "Аварии при запуске по ошибке"
925
+ column_error: "Ошибка"
926
+ column_file: "Файл"
927
+ column_constant: "Константа"
928
+ column_boots: "Запуски"
929
+ column_first_seen: "Впервые замечена"
930
+ column_status: "Статус"
931
+ status_open: "Открыта"
932
+ status_resolved: "Решена"
933
+ footer_tip: "Авария при запуске означает, что процесс не обработал ни одного запроса. Исправьте её до следующего деплоя; строка закрывается как любая другая ошибка."
934
+
871
935
  rack_attack_page:
872
936
  title: События ограничения частоты
873
937
  missing_title: Rack Attack не установлен
@@ -1108,6 +1172,11 @@ ru:
1108
1172
  other: "%{count} события"
1109
1173
  few: "%{count} события"
1110
1174
  many: "%{count} событий"
1175
+ occurrences:
1176
+ one: "%{count} событие"
1177
+ other: "%{count} события"
1178
+ few: "%{count} события"
1179
+ many: "%{count} событий"
1111
1180
  queries:
1112
1181
  one: "%{count} запрос"
1113
1182
  other: "%{count} запроса"
@@ -1153,7 +1222,7 @@ ru:
1153
1222
  unable_to_detect: Не удалось определить
1154
1223
  no_user_model: Модель User не обнаружена
1155
1224
  unable_to_query_count: Не удалось получить количество
1156
- manual_cleanup_required: Требуется ручная очистка
1225
+ retention_enforced_by_job: "Удаляются RetentionCleanupJob, когда его запускает ваш планировщик"
1157
1226
  keep_forever: Хранить всегда
1158
1227
  no_automatic_deletion: Автоматическое удаление отключено
1159
1228
  run_command: 'Выполните:'
@@ -1161,8 +1230,8 @@ ru:
1161
1230
  options:
1162
1231
  enable_middleware: Перехватывает необработанные исключения
1163
1232
  enable_error_subscriber: Подписывается на события ошибок Rails
1164
- retention_days: 'Только ручная очистка (выполните: rails error_dashboard:cleanup_resolved
1165
- DAYS=90)'
1233
+ retention_days: "Удалять ошибки, не встречавшиеся столько дней. Выполняет RetentionCleanupJob, который гем сам не планирует"
1234
+ occurrence_context_limit: "Сколько последних событий каждой ошибки сохраняют breadcrumbs, состояние системы и переменные (0 = выключено)"
1166
1235
  max_backtrace_lines: Ограничение глубины backtrace
1167
1236
  sampling_rate: Доля захватываемых ошибок
1168
1237
  application_name: Имя этого приложения (определяется автоматически, если не
@@ -1180,7 +1249,7 @@ ru:
1180
1249
  если не задано)
1181
1250
  async_logging: Обработка в фоновых задачах
1182
1251
  async_adapter: Адаптер очереди задач
1183
- enable_rate_limiting: Ограничивать частоту API-запросов
1252
+ enable_rate_limiting: "Ограничивать запросы к панели по IP и пути"
1184
1253
  rate_limit_per_minute: Запросов в минуту на IP
1185
1254
  enable_slack_notifications: Уведомления в реальном времени
1186
1255
  slack_webhook_url: Адрес webhook Slack
@@ -1189,10 +1258,15 @@ ru:
1189
1258
  notification_email_from: Адрес отправителя
1190
1259
  enable_discord_notifications: Уведомления через webhook Discord
1191
1260
  discord_webhook_url: Адрес webhook Discord
1261
+ enable_telegram_notifications: "Уведомления Telegram через Bot API"
1262
+ telegram_bot_token: "Токен бота от @BotFather (задайте переменную окружения TELEGRAM_BOT_TOKEN)"
1263
+ telegram_chat_id: "Чат, группа или канал, куда пишет бот"
1264
+ telegram_api_base_url: "Сервер Bot API (менять только для прокси или собственного сервера)"
1192
1265
  enable_pagerduty_notifications: Эскалация критических ошибок
1193
1266
  pagerduty_integration_key: API-ключ PagerDuty
1194
1267
  enable_webhook_notifications: Произвольные webhook-адреса
1195
1268
  webhook_urls: Свои webhook-адреса
1269
+ webhook_signing_secret: Подписывает исходящие webhook-запросы HMAC-SHA256 (задайте переменную окружения WEBHOOK_SIGNING_SECRET)
1196
1270
  enable_scheduled_digests: Ежедневные/еженедельные сводки. Планирование через
1197
1271
  SolidQueue, Sidekiq или cron
1198
1272
  digest_frequency: Как часто отправлять сводки
@@ -1211,7 +1285,7 @@ ru:
1211
1285
  source_code_context_lines: Строк до и после целевой строки
1212
1286
  enable_git_blame: Показывать сведения git blame
1213
1287
  source_code_cache_ttl: Время жизни кэша исходного кода
1214
- only_show_app_code_source: Скрывать gem-ы и stdlib в целях безопасности
1288
+ only_show_app_code_source: "Скрывать код гемов и vendor в просмотрщике исходников"
1215
1289
  git_branch_strategy: Стратегия определения ветки
1216
1290
  enable_breadcrumbs: Записывать след активности запроса
1217
1291
  breadcrumb_buffer_size: Максимум breadcrumbs на запрос
@@ -1241,6 +1315,7 @@ ru:
1241
1315
  enable_crash_capture: Хук at_exit для необработанных аварийных завершений
1242
1316
  enable_coverage_tracking: Диагностический режим — включите в панели, чтобы
1243
1317
  видеть выполненные строки в исходном коде (Ruby 3.2+)
1318
+ enable_missing_translation_tracking: "Считает промахи I18n приложения по локали и ключу (оборачивает I18n.exception_handler)"
1244
1319
  enable_rack_attack_tracking: Записывать события throttle/blocklist в отдельную
1245
1320
  таблицу
1246
1321
  enable_actioncable_tracking: Отслеживать события каналов WebSocket как breadcrumbs
@@ -1300,6 +1375,8 @@ ru:
1300
1375
  breadcrumbs: Breadcrumbs
1301
1376
  system_health: Состояние системы
1302
1377
  swallowed_exceptions: Обнаружение подавленных исключений (swallowed exception)
1378
+ missing_translations: "Отслеживание отсутствующих переводов"
1379
+ boot_errors: "Перехват ошибок запуска"
1303
1380
  rack_attack: Отслеживание Rack Attack
1304
1381
  actioncable: Отслеживание ActionCable
1305
1382
  activestorage: Отслеживание ActiveStorage
@@ -1713,6 +1790,13 @@ ru:
1713
1790
  guide_link: Руководство по ActionCable
1714
1791
  activestorage:
1715
1792
  title: Состояние ActiveStorage
1793
+ probe:
1794
+ title: "Доступность сервиса"
1795
+ reachable: "Доступен"
1796
+ unreachable: "Недоступен"
1797
+ service: "Сервис: %{name}"
1798
+ latency: "%{ms} мс туда и обратно"
1799
+ how: "Одна проверка существования ключа, который никогда не сохраняется, при загрузке этой страницы. GET /health выполняет ту же проверку."
1716
1800
  empty:
1717
1801
  title: События ActiveStorage не найдены
1718
1802
  message: За последние %{days} дн. в breadcrumbs ошибок не обнаружено операций