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 @@ fr:
36
36
  healthy: "✅ Sain"
37
37
  warning: "⚠️ Avertissement"
38
38
  critical: "\U0001F534 Critique"
39
+ not_rated: "Non évalué"
40
+ not_rated_hint: "L'évaluation compare les plateformes : il faut des erreurs sur au moins deux."
39
41
  device_type:
40
42
  mobile: Mobile
41
43
  tablet: Tablette
@@ -60,6 +62,8 @@ fr:
60
62
  llm: LLM
61
63
  n_plus_one: Requêtes N+1
62
64
  deprecations: Dépréciations
65
+ missing_translations: "Traductions"
66
+ boot_errors: "Erreurs de démarrage"
63
67
  swallowed: Avalées
64
68
  diagnostic_dumps: Diagnostics
65
69
  storms: Tempêtes
@@ -247,6 +251,10 @@ fr:
247
251
  inactive_body: activez pour voir les lignes exécutées
248
252
  enable: Activer
249
253
  disable: Désactiver
254
+ occurrence:
255
+ title: "Occurrence #%{id}"
256
+ body: "Les breadcrumbs, l'état du système et les variables proviennent de cette occurrence. Tout le reste montre la capture la plus récente."
257
+ show_latest: "Voir la plus récente"
250
258
  baselines:
251
259
  title: Statistiques de référence
252
260
  anomaly_label: 'Anomalie :'
@@ -517,6 +525,14 @@ fr:
517
525
  other: "+%{count} autres"
518
526
  many: "+%{count} autres"
519
527
  view_errors: Voir les erreurs
528
+ captured_occurrences:
529
+ title: "Occurrences capturées"
530
+ hint: "Les breadcrumbs, l'état du système et les variables sont conservés pour les occurrences les plus récentes (occurrence_context_limit). Ouvrez-en une pour les voir."
531
+ column_occurrence: "Occurrence"
532
+ column_occurred_at: "Survenue"
533
+ column_version: "Version"
534
+ view: "Voir"
535
+ viewing: "Affichée"
520
536
  co_occurring:
521
537
  title: Erreurs concomitantes
522
538
  badge: Motifs temporels
@@ -766,6 +782,7 @@ fr:
766
782
  many: "%{count} frames"
767
783
  click_to_expand: "(cliquez pour développer)"
768
784
  view_source: Voir le code source
785
+ client_report_note: "Ces frames proviennent d'un rapport client (ManualErrorReporter). Ils décrivent du code exécuté côté client : RED n'ouvre donc aucun fichier source, n'affiche aucun extrait et n'exécute pas git blame pour eux."
769
786
  none: Aucun backtrace disponible
770
787
  row:
771
788
  new_badge: NOUVEAU
@@ -857,6 +874,53 @@ fr:
857
874
  dans error_log
858
875
  footer_tip: Les exceptions avalées sont levées puis rattrapées silencieusement.
859
876
  Elles peuvent masquer de vrais bugs.
877
+ missing_translations_page:
878
+ title: "Traductions manquantes"
879
+ empty_title: "Aucune traduction manquante enregistrée"
880
+ empty_body: "Aucune clé de traduction manquante n'a été enregistrée au cours des %{days} derniers jours."
881
+ how_title: "Comment les traductions manquantes sont suivies :"
882
+ how_enabled_html: "Le suivi doit être activé (%{option})"
883
+ 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"
884
+ 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é"
885
+ 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"
886
+ 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"
887
+ missing_keys: "Clés manquantes"
888
+ total_misses: "Échecs au total"
889
+ locales_affected: "Locales concernées"
890
+ all_title: "Clés de traduction manquantes"
891
+ column_key: "Clé"
892
+ column_locale: "Locale"
893
+ column_source: "Vu d'abord dans"
894
+ column_misses: "Échecs"
895
+ column_first_seen: "Première occurrence"
896
+ 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."
897
+ 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."
898
+ docs: "Guide i18n de Rails"
899
+
900
+ boot_errors_page:
901
+ title: "Erreurs de démarrage"
902
+ empty_title: "Aucune erreur de démarrage enregistrée"
903
+ empty_body: "Aucun processus n’est mort au démarrage au cours des %{days} derniers jours."
904
+ how_title: "Comment les erreurs de démarrage sont capturées :"
905
+ how_enabled_html: "La capture des plantages doit être activée (%{option})"
906
+ 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"
907
+ 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"
908
+ how_imported: "Le plantage est écrit sur disque, faute de base de données à ce stade, puis importé au prochain démarrage réussi"
909
+ how_never: "Un processus tué par SIGKILL ou un segfault n’est jamais vu par at_exit, dans aucun outil"
910
+ unresolved: "Non résolus"
911
+ boot_crashes: "Plantages au démarrage"
912
+ failed_boots: "Démarrages échoués"
913
+ all_title: "Plantages au démarrage par erreur"
914
+ column_error: "Erreur"
915
+ column_file: "Fichier"
916
+ column_constant: "Constante"
917
+ column_boots: "Démarrages"
918
+ column_first_seen: "Première occurrence"
919
+ column_status: "Statut"
920
+ status_open: "Ouvert"
921
+ status_resolved: "Résolu"
922
+ 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."
923
+
860
924
  rack_attack_page:
861
925
  title: Événements de limitation de débit
862
926
  missing_title: Rack Attack n'est pas installé
@@ -1090,6 +1154,10 @@ fr:
1090
1154
  one: "%{count} événement"
1091
1155
  other: "%{count} événements"
1092
1156
  many: "%{count} événements"
1157
+ occurrences:
1158
+ one: "%{count} occurrence"
1159
+ other: "%{count} occurrences"
1160
+ many: "%{count} occurrences"
1093
1161
  queries:
1094
1162
  one: "%{count} requête"
1095
1163
  other: "%{count} requêtes"
@@ -1130,7 +1198,7 @@ fr:
1130
1198
  unable_to_detect: Détection impossible
1131
1199
  no_user_model: Aucun modèle User détecté
1132
1200
  unable_to_query_count: Impossible d'interroger le nombre
1133
- manual_cleanup_required: Nettoyage manuel requis
1201
+ retention_enforced_by_job: "Supprimés par RetentionCleanupJob dès que votre planificateur l'exécute"
1134
1202
  keep_forever: Conserver indéfiniment
1135
1203
  no_automatic_deletion: Aucune suppression automatique
1136
1204
  run_command: 'Exécuter :'
@@ -1138,8 +1206,8 @@ fr:
1138
1206
  options:
1139
1207
  enable_middleware: Intercepte les exceptions non gérées
1140
1208
  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)'
1209
+ retention_days: "Supprimer les erreurs non vues depuis ce nombre de jours. Appliqué par RetentionCleanupJob, que la gem ne planifie pas elle-même"
1210
+ occurrence_context_limit: "Nombre d'occurrences récentes par erreur dont les breadcrumbs, l'état du système et les variables sont conservés (0 = désactivé)"
1143
1211
  max_backtrace_lines: Profondeur maximale du backtrace
1144
1212
  sampling_rate: Pourcentage d'erreurs capturées
1145
1213
  application_name: Nom de cette application (détecté automatiquement si non
@@ -1158,7 +1226,7 @@ fr:
1158
1226
  si non défini)
1159
1227
  async_logging: Traitement par jobs en arrière-plan
1160
1228
  async_adapter: Adaptateur de file d'attente des jobs
1161
- enable_rate_limiting: Limiter le débit des requêtes API
1229
+ enable_rate_limiting: "Limiter les requêtes du tableau de bord par IP et par chemin"
1162
1230
  rate_limit_per_minute: Requêtes par minute et par IP
1163
1231
  enable_slack_notifications: Notifications en temps réel
1164
1232
  slack_webhook_url: Point de terminaison du webhook Slack
@@ -1167,10 +1235,15 @@ fr:
1167
1235
  notification_email_from: Adresse de l'expéditeur
1168
1236
  enable_discord_notifications: Notifications par webhook Discord
1169
1237
  discord_webhook_url: Point de terminaison du webhook Discord
1238
+ enable_telegram_notifications: "Notifications Telegram via l'API Bot"
1239
+ telegram_bot_token: "Jeton du bot fourni par @BotFather (définir la variable d'environnement TELEGRAM_BOT_TOKEN)"
1240
+ telegram_chat_id: "Discussion, groupe ou canal où le bot publie"
1241
+ telegram_api_base_url: "Serveur de l'API Bot (à modifier seulement pour un proxy ou un serveur auto-hébergé)"
1170
1242
  enable_pagerduty_notifications: Escalade des erreurs critiques
1171
1243
  pagerduty_integration_key: Clé API PagerDuty
1172
1244
  enable_webhook_notifications: Points de terminaison webhook génériques
1173
1245
  webhook_urls: Points de terminaison webhook personnalisés
1246
+ webhook_signing_secret: Signe les webhooks sortants en HMAC-SHA256 (définir la variable d’environnement WEBHOOK_SIGNING_SECRET)
1174
1247
  enable_scheduled_digests: E-mails de résumé quotidiens/hebdomadaires. Planification
1175
1248
  via SolidQueue, Sidekiq ou cron
1176
1249
  digest_frequency: Fréquence d'envoi des e-mails de résumé
@@ -1190,7 +1263,7 @@ fr:
1190
1263
  source_code_context_lines: Lignes avant et après la ligne ciblée
1191
1264
  enable_git_blame: Afficher les informations git blame
1192
1265
  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é
1266
+ only_show_app_code_source: "Masquer le code des gems et de vendor dans le visualiseur de code"
1194
1267
  git_branch_strategy: Stratégie de résolution de la branche
1195
1268
  enable_breadcrumbs: Capturer le fil d'activité de la requête
1196
1269
  breadcrumb_buffer_size: Nombre maximal de breadcrumbs par requête
@@ -1224,6 +1297,7 @@ fr:
1224
1297
  enable_crash_capture: Hook at_exit pour les plantages non gérés
1225
1298
  enable_coverage_tracking: Mode diagnostic — à activer depuis le tableau de
1226
1299
  bord pour voir les lignes exécutées dans la vue du code source (Ruby 3.2+)
1300
+ enable_missing_translation_tracking: "Compte les échecs I18n de l'app par locale et par clé (enveloppe I18n.exception_handler)"
1227
1301
  enable_rack_attack_tracking: Enregistrer les événements throttle/blocklist
1228
1302
  dans leur propre table
1229
1303
  enable_actioncable_tracking: Suivre les événements des canaux WebSocket sous
@@ -1281,6 +1355,8 @@ fr:
1281
1355
  breadcrumbs: Breadcrumbs
1282
1356
  system_health: État du système
1283
1357
  swallowed_exceptions: Détection des exceptions avalées
1358
+ missing_translations: "Suivi des traductions manquantes"
1359
+ boot_errors: "Capture des erreurs de démarrage"
1284
1360
  rack_attack: Suivi de Rack Attack
1285
1361
  actioncable: Suivi d'ActionCable
1286
1362
  activestorage: Suivi d'ActiveStorage
@@ -1697,6 +1773,13 @@ fr:
1697
1773
  guide_link: Guide d'ActionCable
1698
1774
  activestorage:
1699
1775
  title: État d'ActiveStorage
1776
+ probe:
1777
+ title: "Joignabilité du service"
1778
+ reachable: "Joignable"
1779
+ unreachable: "Injoignable"
1780
+ service: "Service : %{name}"
1781
+ latency: "%{ms} ms aller-retour"
1782
+ 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
1783
  empty:
1701
1784
  title: Aucun événement ActiveStorage trouvé
1702
1785
  message: Aucune opération de service ActiveStorage n'a été détectée dans
@@ -36,6 +36,8 @@ it:
36
36
  healthy: "✅ Integro"
37
37
  warning: "⚠️ Avviso"
38
38
  critical: "\U0001F534 Critico"
39
+ not_rated: "Non valutato"
40
+ not_rated_hint: "La valutazione confronta le piattaforme, quindi servono errori su almeno due."
39
41
  device_type:
40
42
  mobile: Mobile
41
43
  tablet: Tablet
@@ -60,6 +62,8 @@ it:
60
62
  llm: LLM
61
63
  n_plus_one: Query N+1
62
64
  deprecations: Deprecations
65
+ missing_translations: "Traduzioni"
66
+ boot_errors: "Errori di avvio"
63
67
  swallowed: Soppresse
64
68
  diagnostic_dumps: Diagnostica
65
69
  storms: Tempeste
@@ -244,6 +248,10 @@ it:
244
248
  inactive_body: abilita per vedere le righe eseguite
245
249
  enable: Abilita
246
250
  disable: Disabilita
251
+ occurrence:
252
+ title: "Occorrenza #%{id}"
253
+ body: "Breadcrumbs, stato del sistema e variabili provengono da questa occorrenza. Tutto il resto mostra l'acquisizione più recente."
254
+ show_latest: "Mostra la più recente"
247
255
  baselines:
248
256
  title: Statistiche della baseline
249
257
  anomaly_label: 'Anomalia:'
@@ -511,6 +519,14 @@ it:
511
519
  other: "+%{count} altri"
512
520
  many: "+%{count} altri"
513
521
  view_errors: Vedi gli errori
522
+ captured_occurrences:
523
+ title: "Occorrenze acquisite"
524
+ hint: "Breadcrumbs, stato del sistema e variabili vengono conservati per le occorrenze più recenti (occurrence_context_limit). Aprine una per vederli."
525
+ column_occurrence: "Occorrenza"
526
+ column_occurred_at: "Avvenuta"
527
+ column_version: "Versione"
528
+ view: "Visualizza"
529
+ viewing: "In visualizzazione"
514
530
  co_occurring:
515
531
  title: Errori concomitanti
516
532
  badge: Schemi temporali
@@ -759,6 +775,7 @@ it:
759
775
  many: "%{count} frame"
760
776
  click_to_expand: "(clicca per espandere)"
761
777
  view_source: Vedi il codice
778
+ client_report_note: "Questi frame provengono da una segnalazione del client (ManualErrorReporter). Descrivono codice eseguito sul client, quindi RED non apre file sorgente, non mostra estratti e non esegue git blame per essi."
762
779
  none: Backtrace non disponibile
763
780
  row:
764
781
  new_badge: NUOVO
@@ -850,6 +867,53 @@ it:
850
867
  view_unrescued: Vedi gli errori %{exception} non intercettati finiti in error_log
851
868
  footer_tip: Le eccezioni soppresse vengono sollevate e poi intercettate in
852
869
  silenzio. Possono nascondere bug reali.
870
+ missing_translations_page:
871
+ title: "Traduzioni mancanti"
872
+ empty_title: "Nessuna traduzione mancante registrata"
873
+ empty_body: "Nessuna chiave di traduzione mancante è stata registrata negli ultimi %{days} giorni."
874
+ how_title: "Come vengono tracciate le traduzioni mancanti:"
875
+ how_enabled_html: "Il tracciamento deve essere attivo (%{option})"
876
+ how_hooked: "RED avvolge I18n.exception_handler e delega all'handler che la tua app aveva già; nient'altro cambia nella tua configurazione I18n"
877
+ how_recorded: "Ogni ricerca che arriva all'handler — sia da I18n.t sia dall'helper di vista t() — viene contata per locale e chiave, insieme al primo punto di chiamata osservato"
878
+ how_not_seen: "Una ricerca con :default non fallisce mai, e una fatta con raise_on_missing_translations solleva un'eccezione prima che qualsiasi handler venga eseguito, quindi nessuna delle due è contata qui"
879
+ how_buffered: "I fallimenti vengono contati in memoria e scritti alla fine della richiesta o del job, quindi attendi un breve ritardo prima che compaiano"
880
+ missing_keys: "Chiavi mancanti"
881
+ total_misses: "Fallimenti totali"
882
+ locales_affected: "Locale interessati"
883
+ all_title: "Chiavi di traduzione mancanti"
884
+ column_key: "Chiave"
885
+ column_locale: "Locale"
886
+ column_source: "Visto prima in"
887
+ column_misses: "Fallimenti"
888
+ column_first_seen: "Prima occorrenza"
889
+ overflow_notice: "%{count} fallimenti non sono stati attribuiti a una chiave perché il buffer del tracker (%{limit} chiavi per thread) era pieno."
890
+ footer_tip: "Aggiungi la chiave al file di locale, oppure passa un :default. Le chiavi effettivamente incontrate dagli utenti sono elencate per prime."
891
+ docs: "Guida i18n di Rails"
892
+
893
+ boot_errors_page:
894
+ title: "Errori di avvio"
895
+ empty_title: "Nessun errore di avvio registrato"
896
+ empty_body: "Nessun processo è morto durante l’avvio negli ultimi %{days} giorni."
897
+ how_title: "Come vengono catturati gli errori di avvio:"
898
+ how_enabled_html: "La cattura dei crash deve essere attiva (%{option})"
899
+ how_hooked: "RED registra il suo hook at_exit subito dopo i tuoi initializer e prima dell’eager loading di Rails, così un crash durante l’avvio viene visto anche se l’app non ha mai finito di partire"
900
+ how_captured_html: "Un %{zeitwerk} da un file che definisce la costante sbagliata, un %{syntax} in un modello, un initializer che solleva un’eccezione: qualsiasi cosa uccida il processo prima che serva una richiesta"
901
+ how_imported: "Il crash viene scritto su disco, perché non c’è ancora un database, e importato al successivo avvio riuscito"
902
+ how_never: "Un processo terminato da SIGKILL o da un segfault non viene mai visto da at_exit, in nessuno strumento"
903
+ unresolved: "Non risolti"
904
+ boot_crashes: "Crash all’avvio"
905
+ failed_boots: "Avvii falliti"
906
+ all_title: "Crash all’avvio per errore"
907
+ column_error: "Errore"
908
+ column_file: "File"
909
+ column_constant: "Costante"
910
+ column_boots: "Avvii"
911
+ column_first_seen: "Prima occorrenza"
912
+ column_status: "Stato"
913
+ status_open: "Aperto"
914
+ status_resolved: "Risolto"
915
+ footer_tip: "Un crash all’avvio significa che il processo non ha mai servito una richiesta. Correggilo prima del prossimo deploy; la riga si risolve come qualsiasi altro errore."
916
+
853
917
  rack_attack_page:
854
918
  title: Eventi di limite di richieste
855
919
  missing_title: Rack Attack non è installato
@@ -1080,6 +1144,10 @@ it:
1080
1144
  one: "%{count} evento"
1081
1145
  other: "%{count} eventi"
1082
1146
  many: "%{count} eventi"
1147
+ occurrences:
1148
+ one: "%{count} occorrenza"
1149
+ other: "%{count} occorrenze"
1150
+ many: "%{count} occorrenze"
1083
1151
  queries:
1084
1152
  one: "%{count} query"
1085
1153
  other: "%{count} query"
@@ -1120,7 +1188,7 @@ it:
1120
1188
  unable_to_detect: Impossibile rilevare
1121
1189
  no_user_model: Nessun modello User rilevato
1122
1190
  unable_to_query_count: Impossibile ottenere il conteggio
1123
- manual_cleanup_required: Richiesta pulizia manuale
1191
+ retention_enforced_by_job: "Eliminati da RetentionCleanupJob quando lo scheduler lo esegue"
1124
1192
  keep_forever: Conserva per sempre
1125
1193
  no_automatic_deletion: Nessuna eliminazione automatica
1126
1194
  run_command: 'Esegui:'
@@ -1128,8 +1196,8 @@ it:
1128
1196
  options:
1129
1197
  enable_middleware: Intercetta le eccezioni non gestite
1130
1198
  enable_error_subscriber: Si iscrive agli eventi di errore di Rails
1131
- retention_days: 'Solo pulizia manuale (esegui: rails error_dashboard:cleanup_resolved
1132
- DAYS=90)'
1199
+ retention_days: "Elimina gli errori non visti da questo numero di giorni. Applicato da RetentionCleanupJob, che la gem non pianifica da sola"
1200
+ occurrence_context_limit: "Quante occorrenze recenti per errore conservano breadcrumbs, stato del sistema e variabili (0 = disattivato)"
1133
1201
  max_backtrace_lines: Limite di profondità dello stack trace
1134
1202
  sampling_rate: Percentuale di errori acquisiti
1135
1203
  application_name: Nome di questa applicazione (rilevato automaticamente se
@@ -1148,7 +1216,7 @@ it:
1148
1216
  se non impostato)
1149
1217
  async_logging: Elaborazione in job in background
1150
1218
  async_adapter: Adapter della coda dei job
1151
- enable_rate_limiting: Limita le richieste alle API
1219
+ enable_rate_limiting: "Limita le richieste della dashboard per IP e percorso"
1152
1220
  rate_limit_per_minute: Richieste al minuto per IP
1153
1221
  enable_slack_notifications: Notifiche in tempo reale
1154
1222
  slack_webhook_url: Endpoint del webhook di Slack
@@ -1157,10 +1225,15 @@ it:
1157
1225
  notification_email_from: Indirizzo del mittente
1158
1226
  enable_discord_notifications: Notifiche tramite webhook di Discord
1159
1227
  discord_webhook_url: Endpoint del webhook di Discord
1228
+ enable_telegram_notifications: "Notifiche Telegram tramite la Bot API"
1229
+ telegram_bot_token: "Token del bot da @BotFather (impostare la variabile d'ambiente TELEGRAM_BOT_TOKEN)"
1230
+ telegram_chat_id: "Chat, gruppo o canale in cui scrive il bot"
1231
+ telegram_api_base_url: "Server della Bot API (da cambiare solo per un proxy o un server self-hosted)"
1160
1232
  enable_pagerduty_notifications: Escalation degli errori critici
1161
1233
  pagerduty_integration_key: Chiave API di PagerDuty
1162
1234
  enable_webhook_notifications: Endpoint webhook generici
1163
1235
  webhook_urls: Endpoint webhook personalizzati
1236
+ webhook_signing_secret: Firma i webhook in uscita con HMAC-SHA256 (imposta la variabile d’ambiente WEBHOOK_SIGNING_SECRET)
1164
1237
  enable_scheduled_digests: E-mail di riepilogo giornaliere/settimanali. Pianifica
1165
1238
  tramite SolidQueue, Sidekiq o cron
1166
1239
  digest_frequency: Con quale frequenza inviare le e-mail di riepilogo
@@ -1181,7 +1254,7 @@ it:
1181
1254
  source_code_context_lines: Righe prima e dopo quella di riferimento
1182
1255
  enable_git_blame: Mostra le informazioni di git blame
1183
1256
  source_code_cache_ttl: Durata della cache del codice sorgente
1184
- only_show_app_code_source: Nascondi gems/stdlib per sicurezza
1257
+ only_show_app_code_source: "Nascondi il codice di gem e vendor nel visualizzatore del codice"
1185
1258
  git_branch_strategy: Strategia di risoluzione del branch
1186
1259
  enable_breadcrumbs: Acquisisci la traccia delle attività della richiesta
1187
1260
  breadcrumb_buffer_size: Numero massimo di breadcrumbs per richiesta
@@ -1214,6 +1287,7 @@ it:
1214
1287
  enable_crash_capture: Hook at_exit per i crash non gestiti
1215
1288
  enable_coverage_tracking: Modalità diagnostica — abilitala dal pannello per
1216
1289
  vedere le righe eseguite nella vista del codice (Ruby 3.2+)
1290
+ enable_missing_translation_tracking: "Conta i fallimenti I18n dell'app per locale e chiave (avvolge I18n.exception_handler)"
1217
1291
  enable_rack_attack_tracking: Registra gli eventi throttle/blocklist in una
1218
1292
  tabella dedicata
1219
1293
  enable_actioncable_tracking: Traccia gli eventi dei canali WebSocket come
@@ -1271,6 +1345,8 @@ it:
1271
1345
  breadcrumbs: Breadcrumbs
1272
1346
  system_health: Stato del sistema
1273
1347
  swallowed_exceptions: Rilevamento delle eccezioni soppresse
1348
+ missing_translations: "Tracciamento delle traduzioni mancanti"
1349
+ boot_errors: "Cattura degli errori di avvio"
1274
1350
  rack_attack: Tracciamento di Rack Attack
1275
1351
  actioncable: Tracciamento di ActionCable
1276
1352
  activestorage: Tracciamento di ActiveStorage
@@ -1682,6 +1758,13 @@ it:
1682
1758
  guide_link: Guida ad ActionCable
1683
1759
  activestorage:
1684
1760
  title: Stato di ActiveStorage
1761
+ probe:
1762
+ title: "Raggiungibilità del servizio"
1763
+ reachable: "Raggiungibile"
1764
+ unreachable: "Non raggiungibile"
1765
+ service: "Servizio: %{name}"
1766
+ latency: "%{ms} ms andata e ritorno"
1767
+ how: "Un controllo di esistenza su una chiave mai memorizzata, eseguito al caricamento di questa pagina. GET /health esegue la stessa verifica."
1685
1768
  empty:
1686
1769
  title: Nessun evento ActiveStorage trovato
1687
1770
  message: Negli ultimi %{days} giorni non sono state rilevate operazioni
@@ -36,6 +36,8 @@ ja:
36
36
  healthy: "✅ 正常"
37
37
  warning: "⚠️ 警告"
38
38
  critical: "\U0001F534 重大"
39
+ not_rated: "評価なし"
40
+ not_rated_hint: "評価はプラットフォーム同士の比較なので、2つ以上のプラットフォームのエラーが必要です。"
39
41
  device_type:
40
42
  mobile: モバイル
41
43
  tablet: タブレット
@@ -60,6 +62,8 @@ ja:
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: ストーム
@@ -231,6 +235,10 @@ ja:
231
235
  inactive_body: 有効にすると実行された行を確認できます
232
236
  enable: 有効にする
233
237
  disable: 無効にする
238
+ occurrence:
239
+ title: "発生 #%{id}"
240
+ body: "Breadcrumb、システムヘルス、変数はこの発生時のものです。それ以外は最新のキャプチャを表示しています。"
241
+ show_latest: "最新を表示"
234
242
  baselines:
235
243
  title: ベースライン統計
236
244
  anomaly_label: '異常:'
@@ -452,6 +460,14 @@ ja:
452
460
  more:
453
461
  other: 他%{count}件
454
462
  view_errors: エラーを表示
463
+ captured_occurrences:
464
+ title: "記録された発生"
465
+ hint: "Breadcrumb、システムヘルス、変数は最新の発生分だけ保持されます(occurrence_context_limit)。発生を開くと確認できます。"
466
+ column_occurrence: "発生"
467
+ column_occurred_at: "発生日時"
468
+ column_version: "バージョン"
469
+ view: "表示"
470
+ viewing: "表示中"
455
471
  co_occurring:
456
472
  title: 同時発生エラー
457
473
  badge: 時間パターン
@@ -680,6 +696,7 @@ ja:
680
696
  other: "%{count}フレーム"
681
697
  click_to_expand: "(クリックで展開)"
682
698
  view_source: ソースを表示
699
+ client_report_note: "これらのフレームはクライアントからの報告(ManualErrorReporter)によるものです。クライアント側で実行されたコードを示すため、RED はソースファイルを開かず、コード片の表示や git blame も行いません。"
683
700
  none: Backtrace はありません
684
701
  row:
685
702
  new_badge: NEW
@@ -756,6 +773,53 @@ ja:
756
773
  column_ratio: 比率
757
774
  view_unrescued: error_log に記録された未 rescue の%{exception}エラーを表示
758
775
  footer_tip: 握りつぶされた例外とは、raise された後に暗黙的に rescue された例外です。実際の不具合を隠している可能性があります。
776
+ missing_translations_page:
777
+ title: "翻訳の欠落"
778
+ empty_title: "欠落した翻訳は記録されていません"
779
+ empty_body: "過去 %{days} 日間に欠落した翻訳キーは記録されていません。"
780
+ how_title: "翻訳の欠落を追跡する仕組み:"
781
+ how_enabled_html: "追跡を有効にする必要があります(%{option})"
782
+ how_hooked: "RED は I18n.exception_handler をラップし、アプリが元々使っていたハンドラーに処理を委譲します。それ以外の I18n 設定は変更しません"
783
+ how_recorded: "ハンドラーに到達した検索は、I18n.t でもビューヘルパー t() でも、ロケールとキーごとに、最初に観測された呼び出し元とともに数えられます"
784
+ how_not_seen: ":default を指定した検索は欠落になりません。raise_on_missing_translations を使った検索はハンドラーが動く前に例外を投げるため、どちらもここでは数えられません"
785
+ how_buffered: "欠落はメモリ上で数えられ、リクエストまたはジョブの終了時に書き込まれるため、表示されるまで少し時間がかかります"
786
+ missing_keys: "欠落キー"
787
+ total_misses: "欠落の合計"
788
+ locales_affected: "影響を受けたロケール"
789
+ all_title: "欠落している翻訳キー"
790
+ column_key: "キー"
791
+ column_locale: "ロケール"
792
+ column_source: "最初の検出箇所"
793
+ column_misses: "欠落数"
794
+ column_first_seen: "初回検出"
795
+ overflow_notice: "トラッカーのバッファ(スレッドあたり %{limit} キー)が満杯だったため、%{count} 件の欠落をキーに割り当てられませんでした。"
796
+ footer_tip: "ロケールファイルにキーを追加するか、:default を渡してください。実際にユーザーが遭遇したキーが先に表示されます。"
797
+ docs: "Rails i18n ガイド"
798
+
799
+ boot_errors_page:
800
+ title: "起動エラー"
801
+ empty_title: "起動エラーは記録されていません"
802
+ empty_body: "過去 %{days} 日間に起動中に終了したプロセスはありません。"
803
+ how_title: "起動エラーを捕捉する仕組み:"
804
+ how_enabled_html: "クラッシュ捕捉を有効にする必要があります(%{option})"
805
+ how_hooked: "RED は initializer の直後、Rails の eager load の前に at_exit フックを登録するため、アプリが起動し切る前のクラッシュも捕捉されます"
806
+ how_captured_html: "誤った定数を定義したファイルによる %{zeitwerk}、モデル内の %{syntax}、例外を投げた initializer など、リクエストを処理する前にプロセスを終了させるもの"
807
+ how_imported: "この時点ではデータベースがないためクラッシュはディスクに書き込まれ、次に起動が成功したときに取り込まれます"
808
+ how_never: "SIGKILL やセグメンテーション違反で終了したプロセスは、どのツールでも at_exit では捕捉できません"
809
+ unresolved: "未解決"
810
+ boot_crashes: "起動クラッシュ"
811
+ failed_boots: "失敗した起動"
812
+ all_title: "エラー別の起動クラッシュ"
813
+ column_error: "エラー"
814
+ column_file: "ファイル"
815
+ column_constant: "定数"
816
+ column_boots: "起動回数"
817
+ column_first_seen: "初回検出"
818
+ column_status: "状態"
819
+ status_open: "未対応"
820
+ status_resolved: "解決済み"
821
+ footer_tip: "起動クラッシュはプロセスが一度もリクエストを処理しなかったことを意味します。次のデプロイ前に修正してください。行は他のエラーと同様に解決できます。"
822
+
759
823
  rack_attack_page:
760
824
  title: レート制限イベント
761
825
  missing_title: Rack Attack がインストールされていません
@@ -942,6 +1006,8 @@ ja:
942
1006
  other: "%{count}秒"
943
1007
  events:
944
1008
  other: "%{count}件のイベント"
1009
+ occurrences:
1010
+ other: "%{count}件の発生"
945
1011
  queries:
946
1012
  other: "%{count}クエリ"
947
1013
  std_devs: "%{count}σ"
@@ -972,7 +1038,7 @@ ja:
972
1038
  unable_to_detect: 検出できません
973
1039
  no_user_model: User モデルが見つかりません
974
1040
  unable_to_query_count: 件数を取得できません
975
- manual_cleanup_required: 手動でのクリーンアップが必要です
1041
+ retention_enforced_by_job: "スケジューラーが RetentionCleanupJob を実行すると削除されます"
976
1042
  keep_forever: 無期限に保持
977
1043
  no_automatic_deletion: 自動削除は行いません
978
1044
  run_command: '実行:'
@@ -980,7 +1046,8 @@ ja:
980
1046
  options:
981
1047
  enable_middleware: 未処理の例外を捕捉します
982
1048
  enable_error_subscriber: Rails のエラーイベントを購読します
983
- retention_days: '手動クリーンアップのみ (実行: rails error_dashboard:cleanup_resolved DAYS=90)'
1049
+ retention_days: "この日数の間発生しなかったエラーを削除します。RetentionCleanupJob が実行しますが、gem 自体はスケジュールしません"
1050
+ occurrence_context_limit: "エラーごとに Breadcrumb、システムヘルス、変数を保持する最新の発生数(0 = 無効)"
984
1051
  max_backtrace_lines: スタックトレースの深さの上限
985
1052
  sampling_rate: エラーを記録する割合
986
1053
  application_name: このアプリケーションの名前 (未設定の場合は自動検出)
@@ -994,7 +1061,7 @@ ja:
994
1061
  total_users_for_impact: 影響率の算出に使用 (未設定の場合は自動検出)
995
1062
  async_logging: バックグラウンドジョブで処理します
996
1063
  async_adapter: ジョブキューのアダプタ
997
- enable_rate_limiting: API リクエストを制限します
1064
+ enable_rate_limiting: "ダッシュボードへのリクエストを IP とパスごとに制限します"
998
1065
  rate_limit_per_minute: IP ごとの1分あたりのリクエスト数
999
1066
  enable_slack_notifications: リアルタイム通知
1000
1067
  slack_webhook_url: Slack の webhook エンドポイント
@@ -1003,10 +1070,15 @@ ja:
1003
1070
  notification_email_from: 送信元アドレス
1004
1071
  enable_discord_notifications: Discord の webhook 通知
1005
1072
  discord_webhook_url: Discord の webhook エンドポイント
1073
+ enable_telegram_notifications: "Telegram Bot API 通知"
1074
+ telegram_bot_token: "@BotFather のボットトークン(環境変数 TELEGRAM_BOT_TOKEN を設定)"
1075
+ telegram_chat_id: "ボットが投稿するチャット・グループ・チャンネル"
1076
+ telegram_api_base_url: "Bot API サーバー(プロキシやセルフホストの場合のみ変更)"
1006
1077
  enable_pagerduty_notifications: 重大なエラーのエスカレーション
1007
1078
  pagerduty_integration_key: PagerDuty の API キー
1008
1079
  enable_webhook_notifications: 汎用の webhook エンドポイント
1009
1080
  webhook_urls: カスタム webhook エンドポイント
1081
+ webhook_signing_secret: 送信 webhook に HMAC-SHA256 署名を付けます(環境変数 WEBHOOK_SIGNING_SECRET を設定)
1010
1082
  enable_scheduled_digests: 日次/週次のサマリーメール。SolidQueue、Sidekiq、cron でスケジュールします
1011
1083
  digest_frequency: ダイジェストメールの送信頻度
1012
1084
  digest_recipients: メールアドレス (未設定の場合は通知の宛先を使用)
@@ -1024,7 +1096,7 @@ ja:
1024
1096
  source_code_context_lines: 対象行の前後に表示する行数
1025
1097
  enable_git_blame: git blame の情報を表示します
1026
1098
  source_code_cache_ttl: ソースコードのキャッシュ保持時間
1027
- only_show_app_code_source: セキュリティのため gem/標準ライブラリを非表示にします
1099
+ only_show_app_code_source: "ソースビューアーで gem と vendor のコードを非表示にします"
1028
1100
  git_branch_strategy: ブランチの解決方法
1029
1101
  enable_breadcrumbs: リクエストの操作履歴を記録します
1030
1102
  breadcrumb_buffer_size: リクエストあたりの breadcrumb の最大数
@@ -1049,6 +1121,7 @@ ja:
1049
1121
  enable_crash_capture: 未処理のクラッシュを捕捉する at_exit フック
1050
1122
  enable_coverage_tracking: 診断モード — ダッシュボードから有効にすると、ソース表示で実行された行を確認できます (Ruby
1051
1123
  3.2 以上)
1124
+ enable_missing_translation_tracking: "アプリの I18n 欠落をロケールとキーごとに数えます(I18n.exception_handler をラップ)"
1052
1125
  enable_rack_attack_tracking: throttle/blocklist イベントを専用テーブルに記録します
1053
1126
  enable_actioncable_tracking: WebSocket のチャネルイベントを breadcrumb として記録します
1054
1127
  enable_activestorage_tracking: アップロード/ダウンロード/削除を breadcrumb として記録します
@@ -1094,6 +1167,8 @@ ja:
1094
1167
  breadcrumbs: Breadcrumb
1095
1168
  system_health: システムヘルス
1096
1169
  swallowed_exceptions: 握りつぶされた例外の検出
1170
+ missing_translations: "翻訳欠落の追跡"
1171
+ boot_errors: "起動エラーの捕捉"
1097
1172
  rack_attack: Rack Attack トラッキング
1098
1173
  actioncable: ActionCable トラッキング
1099
1174
  activestorage: ActiveStorage トラッキング
@@ -1462,6 +1537,13 @@ ja:
1462
1537
  guide_link: ActionCable ガイド
1463
1538
  activestorage:
1464
1539
  title: ActiveStorage の状態
1540
+ probe:
1541
+ title: "サービスの到達性"
1542
+ reachable: "到達可能"
1543
+ unreachable: "到達不能"
1544
+ service: "サービス: %{name}"
1545
+ latency: "往復 %{ms} ms"
1546
+ how: "このページの読み込み時に、保存されることのないキーの存在確認を 1 回行います。GET /health も同じ検査を実行します。"
1465
1547
  empty:
1466
1548
  title: ActiveStorage のイベントが見つかりません
1467
1549
  message: 過去%{days}日間、エラーの breadcrumb から ActiveStorage のサービス操作は検出されませんでした。