rails_error_dashboard 0.15.0 → 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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -3
  3. data/app/controllers/rails_error_dashboard/errors_controller.rb +29 -2
  4. data/app/controllers/rails_error_dashboard/webhooks_controller.rb +10 -9
  5. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +7 -14
  6. data/app/helpers/rails_error_dashboard/overview_helper.rb +4 -0
  7. data/app/jobs/rails_error_dashboard/retention_cleanup_job.rb +5 -0
  8. data/app/models/rails_error_dashboard/error_log.rb +11 -8
  9. data/app/models/rails_error_dashboard/error_occurrence.rb +1 -0
  10. data/app/models/rails_error_dashboard/error_occurrence_context.rb +14 -0
  11. data/app/views/layouts/rails_error_dashboard.html.erb +3 -1
  12. data/app/views/rails_error_dashboard/errors/_captured_occurrences.html.erb +45 -0
  13. data/app/views/rails_error_dashboard/errors/_error_info.html.erb +10 -3
  14. data/app/views/rails_error_dashboard/errors/_occurrence_banner.html.erb +12 -0
  15. data/app/views/rails_error_dashboard/errors/overview.html.erb +10 -7
  16. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +16 -11
  17. data/app/views/rails_error_dashboard/errors/settings.html.erb +6 -5
  18. data/app/views/rails_error_dashboard/errors/show.html.erb +7 -4
  19. data/config/locales/de.yml +19 -0
  20. data/config/locales/en.yml +21 -0
  21. data/config/locales/es.yml +20 -0
  22. data/config/locales/fr.yml +20 -0
  23. data/config/locales/it.yml +20 -0
  24. data/config/locales/ja.yml +18 -0
  25. data/config/locales/pl.yml +21 -0
  26. data/config/locales/pt-BR.yml +20 -0
  27. data/config/locales/ru.yml +21 -0
  28. data/config/locales/uk.yml +21 -0
  29. data/config/locales/zh-CN.yml +18 -0
  30. data/db/migrate/20260106094256_backfill_application_for_existing_errors.rb +3 -3
  31. data/db/migrate/20261015000001_create_rails_error_dashboard_error_occurrence_contexts.rb +35 -0
  32. data/db/migrate/20261015000002_add_capture_source_to_error_occurrences_and_error_logs.rb +46 -0
  33. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +14 -5
  34. data/lib/rails_error_dashboard/commands/batch_mute_errors.rb +11 -2
  35. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +7 -2
  36. data/lib/rails_error_dashboard/commands/batch_unmute_errors.rb +7 -2
  37. data/lib/rails_error_dashboard/commands/find_or_increment_error.rb +6 -0
  38. data/lib/rails_error_dashboard/commands/flush_missing_translations.rb +2 -4
  39. data/lib/rails_error_dashboard/commands/flush_rack_attack_events.rb +2 -4
  40. data/lib/rails_error_dashboard/commands/flush_storm_counts.rb +7 -6
  41. data/lib/rails_error_dashboard/commands/flush_swallowed_exceptions.rb +2 -4
  42. data/lib/rails_error_dashboard/commands/log_error.rb +19 -7
  43. data/lib/rails_error_dashboard/commands/record_occurrence_context.rb +60 -0
  44. data/lib/rails_error_dashboard/configuration.rb +19 -3
  45. data/lib/rails_error_dashboard/error_reporter.rb +4 -2
  46. data/lib/rails_error_dashboard/manual_error_reporter.rb +11 -1
  47. data/lib/rails_error_dashboard/middleware/error_catcher.rb +18 -4
  48. data/lib/rails_error_dashboard/queries/analytics_stats.rb +0 -12
  49. data/lib/rails_error_dashboard/queries/co_occurring_errors.rb +59 -33
  50. data/lib/rails_error_dashboard/queries/platform_comparison.rb +14 -6
  51. data/lib/rails_error_dashboard/services/backtrace_processor.rb +16 -7
  52. data/lib/rails_error_dashboard/services/crash_capture.rb +5 -0
  53. data/lib/rails_error_dashboard/services/github_link_generator.rb +1 -6
  54. data/lib/rails_error_dashboard/services/markdown_error_formatter.rb +15 -16
  55. data/lib/rails_error_dashboard/services/repository_url.rb +18 -0
  56. data/lib/rails_error_dashboard/services/similarity_calculator.rb +3 -9
  57. data/lib/rails_error_dashboard/services/storm_protection/count_buffer.rb +6 -3
  58. data/lib/rails_error_dashboard/services/storm_protection/gate.rb +6 -1
  59. data/lib/rails_error_dashboard/value_objects/occurrence_snapshot.rb +23 -0
  60. data/lib/rails_error_dashboard/version.rb +1 -1
  61. data/lib/rails_error_dashboard.rb +16 -0
  62. data/lib/tasks/error_dashboard.rake +2 -3
  63. metadata +10 -2
@@ -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
@@ -379,6 +381,11 @@ en:
379
381
  enable: "Enable"
380
382
  disable: "Disable"
381
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
+
382
389
  baselines:
383
390
  title: "Baseline Statistics"
384
391
  # %{sigma} is a standard-deviation count, %{level} an anomaly level.
@@ -702,6 +709,15 @@ en:
702
709
  other: "+%{count} more"
703
710
  view_errors: "View Errors"
704
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
+
705
721
  co_occurring:
706
722
  title: "Co-occurring Errors"
707
723
  badge: "Time Patterns"
@@ -1057,6 +1073,7 @@ en:
1057
1073
  other: "%{count} frames"
1058
1074
  click_to_expand: "(click to expand)"
1059
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."
1060
1077
  none: "No backtrace available"
1061
1078
 
1062
1079
  row:
@@ -1532,6 +1549,9 @@ en:
1532
1549
  events:
1533
1550
  one: "%{count} event"
1534
1551
  other: "%{count} events"
1552
+ occurrences:
1553
+ one: "%{count} occurrence"
1554
+ other: "%{count} occurrences"
1535
1555
  queries:
1536
1556
  one: "%{count} query"
1537
1557
  other: "%{count} queries"
@@ -1596,6 +1616,7 @@ en:
1596
1616
  enable_middleware: "Catches unhandled exceptions"
1597
1617
  enable_error_subscriber: "Subscribes to Rails error events"
1598
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)"
1599
1620
  max_backtrace_lines: "Stack trace depth limit"
1600
1621
  sampling_rate: "Percentage of errors captured"
1601
1622
  application_name: "Name of this application (auto-detected if not set)"
@@ -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
@@ -247,6 +249,10 @@ es:
247
249
  inactive_body: actívela para ver las líneas ejecutadas
248
250
  enable: Activar
249
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"
250
256
  baselines:
251
257
  title: Estadísticas de referencia
252
258
  anomaly_label: 'Anomalía:'
@@ -519,6 +525,14 @@ es:
519
525
  other: "+%{count} más"
520
526
  many: "+%{count} más"
521
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"
522
536
  co_occurring:
523
537
  title: Errores concurrentes
524
538
  badge: Patrones temporales
@@ -769,6 +783,7 @@ es:
769
783
  many: "%{count} frames"
770
784
  click_to_expand: "(haga clic para desplegar)"
771
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."
772
787
  none: No hay backtrace disponible
773
788
  row:
774
789
  new_badge: NUEVO
@@ -1138,6 +1153,10 @@ es:
1138
1153
  one: "%{count} evento"
1139
1154
  other: "%{count} eventos"
1140
1155
  many: "%{count} eventos"
1156
+ occurrences:
1157
+ one: "%{count} aparición"
1158
+ other: "%{count} apariciones"
1159
+ many: "%{count} apariciones"
1141
1160
  queries:
1142
1161
  one: "%{count} consulta"
1143
1162
  other: "%{count} consultas"
@@ -1187,6 +1206,7 @@ es:
1187
1206
  enable_middleware: Captura las excepciones no gestionadas
1188
1207
  enable_error_subscriber: Se suscribe a los eventos de error de Rails
1189
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)"
1190
1210
  max_backtrace_lines: Profundidad máxima del backtrace
1191
1211
  sampling_rate: Porcentaje de errores capturados
1192
1212
  application_name: Nombre de esta aplicación (se detecta automáticamente si
@@ -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
@@ -249,6 +251,10 @@ fr:
249
251
  inactive_body: activez pour voir les lignes exécutées
250
252
  enable: Activer
251
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"
252
258
  baselines:
253
259
  title: Statistiques de référence
254
260
  anomaly_label: 'Anomalie :'
@@ -519,6 +525,14 @@ fr:
519
525
  other: "+%{count} autres"
520
526
  many: "+%{count} autres"
521
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"
522
536
  co_occurring:
523
537
  title: Erreurs concomitantes
524
538
  badge: Motifs temporels
@@ -768,6 +782,7 @@ fr:
768
782
  many: "%{count} frames"
769
783
  click_to_expand: "(cliquez pour développer)"
770
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."
771
786
  none: Aucun backtrace disponible
772
787
  row:
773
788
  new_badge: NOUVEAU
@@ -1139,6 +1154,10 @@ fr:
1139
1154
  one: "%{count} événement"
1140
1155
  other: "%{count} événements"
1141
1156
  many: "%{count} événements"
1157
+ occurrences:
1158
+ one: "%{count} occurrence"
1159
+ other: "%{count} occurrences"
1160
+ many: "%{count} occurrences"
1142
1161
  queries:
1143
1162
  one: "%{count} requête"
1144
1163
  other: "%{count} requêtes"
@@ -1188,6 +1207,7 @@ fr:
1188
1207
  enable_middleware: Intercepte les exceptions non gérées
1189
1208
  enable_error_subscriber: S'abonne aux événements d'erreur de Rails
1190
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é)"
1191
1211
  max_backtrace_lines: Profondeur maximale du backtrace
1192
1212
  sampling_rate: Pourcentage d'erreurs capturées
1193
1213
  application_name: Nom de cette application (détecté automatiquement si non
@@ -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
@@ -246,6 +248,10 @@ it:
246
248
  inactive_body: abilita per vedere le righe eseguite
247
249
  enable: Abilita
248
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"
249
255
  baselines:
250
256
  title: Statistiche della baseline
251
257
  anomaly_label: 'Anomalia:'
@@ -513,6 +519,14 @@ it:
513
519
  other: "+%{count} altri"
514
520
  many: "+%{count} altri"
515
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"
516
530
  co_occurring:
517
531
  title: Errori concomitanti
518
532
  badge: Schemi temporali
@@ -761,6 +775,7 @@ it:
761
775
  many: "%{count} frame"
762
776
  click_to_expand: "(clicca per espandere)"
763
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."
764
779
  none: Backtrace non disponibile
765
780
  row:
766
781
  new_badge: NUOVO
@@ -1129,6 +1144,10 @@ it:
1129
1144
  one: "%{count} evento"
1130
1145
  other: "%{count} eventi"
1131
1146
  many: "%{count} eventi"
1147
+ occurrences:
1148
+ one: "%{count} occorrenza"
1149
+ other: "%{count} occorrenze"
1150
+ many: "%{count} occorrenze"
1132
1151
  queries:
1133
1152
  one: "%{count} query"
1134
1153
  other: "%{count} query"
@@ -1178,6 +1197,7 @@ it:
1178
1197
  enable_middleware: Intercetta le eccezioni non gestite
1179
1198
  enable_error_subscriber: Si iscrive agli eventi di errore di Rails
1180
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)"
1181
1201
  max_backtrace_lines: Limite di profondità dello stack trace
1182
1202
  sampling_rate: Percentuale di errori acquisiti
1183
1203
  application_name: Nome di questa applicazione (rilevato automaticamente se
@@ -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: タブレット
@@ -233,6 +235,10 @@ ja:
233
235
  inactive_body: 有効にすると実行された行を確認できます
234
236
  enable: 有効にする
235
237
  disable: 無効にする
238
+ occurrence:
239
+ title: "発生 #%{id}"
240
+ body: "Breadcrumb、システムヘルス、変数はこの発生時のものです。それ以外は最新のキャプチャを表示しています。"
241
+ show_latest: "最新を表示"
236
242
  baselines:
237
243
  title: ベースライン統計
238
244
  anomaly_label: '異常:'
@@ -454,6 +460,14 @@ ja:
454
460
  more:
455
461
  other: 他%{count}件
456
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: "表示中"
457
471
  co_occurring:
458
472
  title: 同時発生エラー
459
473
  badge: 時間パターン
@@ -682,6 +696,7 @@ ja:
682
696
  other: "%{count}フレーム"
683
697
  click_to_expand: "(クリックで展開)"
684
698
  view_source: ソースを表示
699
+ client_report_note: "これらのフレームはクライアントからの報告(ManualErrorReporter)によるものです。クライアント側で実行されたコードを示すため、RED はソースファイルを開かず、コード片の表示や git blame も行いません。"
685
700
  none: Backtrace はありません
686
701
  row:
687
702
  new_badge: NEW
@@ -991,6 +1006,8 @@ ja:
991
1006
  other: "%{count}秒"
992
1007
  events:
993
1008
  other: "%{count}件のイベント"
1009
+ occurrences:
1010
+ other: "%{count}件の発生"
994
1011
  queries:
995
1012
  other: "%{count}クエリ"
996
1013
  std_devs: "%{count}σ"
@@ -1030,6 +1047,7 @@ ja:
1030
1047
  enable_middleware: 未処理の例外を捕捉します
1031
1048
  enable_error_subscriber: Rails のエラーイベントを購読します
1032
1049
  retention_days: "この日数の間発生しなかったエラーを削除します。RetentionCleanupJob が実行しますが、gem 自体はスケジュールしません"
1050
+ occurrence_context_limit: "エラーごとに Breadcrumb、システムヘルス、変数を保持する最新の発生数(0 = 無効)"
1033
1051
  max_backtrace_lines: スタックトレースの深さの上限
1034
1052
  sampling_rate: エラーを記録する割合
1035
1053
  application_name: このアプリケーションの名前 (未設定の場合は自動検出)
@@ -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
@@ -248,6 +250,10 @@ pl:
248
250
  inactive_body: włącz, aby zobaczyć wykonane linie
249
251
  enable: Włącz
250
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"
251
257
  baselines:
252
258
  title: Statystyki poziomu bazowego
253
259
  anomaly_label: 'Anomalia:'
@@ -520,6 +526,14 @@ pl:
520
526
  few: "+%{count} więcej"
521
527
  many: "+%{count} więcej"
522
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"
523
537
  co_occurring:
524
538
  title: Współwystępujące błędy
525
539
  badge: Wzorce czasowe
@@ -774,6 +788,7 @@ pl:
774
788
  many: "%{count} ramek"
775
789
  click_to_expand: "(kliknij, aby rozwinąć)"
776
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."
777
792
  none: Backtrace niedostępny
778
793
  row:
779
794
  new_badge: NOWY
@@ -1154,6 +1169,11 @@ pl:
1154
1169
  other: "%{count} zdarzenia"
1155
1170
  few: "%{count} zdarzenia"
1156
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ń"
1157
1177
  queries:
1158
1178
  one: "%{count} zapytanie"
1159
1179
  other: "%{count} zapytania"
@@ -1208,6 +1228,7 @@ pl:
1208
1228
  enable_middleware: Przechwytuje nieobsłużone wyjątki
1209
1229
  enable_error_subscriber: Subskrybuje zdarzenia błędów Rails
1210
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)"
1211
1232
  max_backtrace_lines: Limit głębokości śladu stosu
1212
1233
  sampling_rate: Odsetek przechwytywanych błędów
1213
1234
  application_name: Nazwa tej aplikacji (wykrywana automatycznie, jeśli nie
@@ -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
@@ -247,6 +249,10 @@ pt-BR:
247
249
  inactive_body: ative para ver as linhas executadas
248
250
  enable: Ativar
249
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"
250
256
  baselines:
251
257
  title: Estatísticas de referência
252
258
  anomaly_label: 'Anomalia:'
@@ -519,6 +525,14 @@ pt-BR:
519
525
  other: "+%{count} outros"
520
526
  many: "+%{count} outros"
521
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"
522
536
  co_occurring:
523
537
  title: Erros concomitantes
524
538
  badge: Padrões temporais
@@ -767,6 +781,7 @@ pt-BR:
767
781
  many: "%{count} frames"
768
782
  click_to_expand: "(clique para expandir)"
769
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."
770
785
  none: Nenhum backtrace disponível
771
786
  row:
772
787
  new_badge: NOVO
@@ -1133,6 +1148,10 @@ pt-BR:
1133
1148
  one: "%{count} evento"
1134
1149
  other: "%{count} eventos"
1135
1150
  many: "%{count} eventos"
1151
+ occurrences:
1152
+ one: "%{count} ocorrência"
1153
+ other: "%{count} ocorrências"
1154
+ many: "%{count} ocorrências"
1136
1155
  queries:
1137
1156
  one: "%{count} consulta"
1138
1157
  other: "%{count} consultas"
@@ -1182,6 +1201,7 @@ pt-BR:
1182
1201
  enable_middleware: Captura exceções não tratadas
1183
1202
  enable_error_subscriber: Assina os eventos de erro do Rails
1184
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)"
1185
1205
  max_backtrace_lines: Profundidade máxima do backtrace
1186
1206
  sampling_rate: Porcentagem de erros capturados
1187
1207
  application_name: Nome desta aplicação (detectado automaticamente se não for
@@ -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: Планшет
@@ -248,6 +250,10 @@ ru:
248
250
  inactive_body: включите, чтобы видеть выполненные строки
249
251
  enable: Включить
250
252
  disable: Отключить
253
+ occurrence:
254
+ title: "Событие #%{id}"
255
+ body: "Breadcrumbs, состояние системы и переменные относятся к этому событию. Всё остальное показывает последний захват."
256
+ show_latest: "Показать последнее"
251
257
  baselines:
252
258
  title: Статистика базовой линии
253
259
  anomaly_label: 'Аномалия:'
@@ -523,6 +529,14 @@ ru:
523
529
  few: "+ ещё %{count}"
524
530
  many: "+ ещё %{count}"
525
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: "Открыто"
526
540
  co_occurring:
527
541
  title: Сопутствующие ошибки
528
542
  badge: Временные закономерности
@@ -777,6 +791,7 @@ ru:
777
791
  many: "%{count} кадров"
778
792
  click_to_expand: "(нажмите, чтобы развернуть)"
779
793
  view_source: Смотреть исходный код
794
+ client_report_note: "Эти фреймы пришли из отчёта клиента (ManualErrorReporter). Они описывают код, выполнявшийся на клиенте, поэтому RED не открывает для них исходные файлы, не показывает фрагменты и не запускает git blame."
780
795
  none: Backtrace недоступен
781
796
  row:
782
797
  new_badge: НОВАЯ
@@ -1157,6 +1172,11 @@ ru:
1157
1172
  other: "%{count} события"
1158
1173
  few: "%{count} события"
1159
1174
  many: "%{count} событий"
1175
+ occurrences:
1176
+ one: "%{count} событие"
1177
+ other: "%{count} события"
1178
+ few: "%{count} события"
1179
+ many: "%{count} событий"
1160
1180
  queries:
1161
1181
  one: "%{count} запрос"
1162
1182
  other: "%{count} запроса"
@@ -1211,6 +1231,7 @@ ru:
1211
1231
  enable_middleware: Перехватывает необработанные исключения
1212
1232
  enable_error_subscriber: Подписывается на события ошибок Rails
1213
1233
  retention_days: "Удалять ошибки, не встречавшиеся столько дней. Выполняет RetentionCleanupJob, который гем сам не планирует"
1234
+ occurrence_context_limit: "Сколько последних событий каждой ошибки сохраняют breadcrumbs, состояние системы и переменные (0 = выключено)"
1214
1235
  max_backtrace_lines: Ограничение глубины backtrace
1215
1236
  sampling_rate: Доля захватываемых ошибок
1216
1237
  application_name: Имя этого приложения (определяется автоматически, если не
@@ -36,6 +36,8 @@ uk:
36
36
  healthy: "✅ Справний"
37
37
  warning: "⚠️ Попередження"
38
38
  critical: "\U0001F534 Критичний"
39
+ not_rated: "Без оцінки"
40
+ not_rated_hint: "Оцінка порівнює платформи, тому потрібні помилки щонайменше на двох."
39
41
  device_type:
40
42
  mobile: Mobile
41
43
  tablet: Tablet
@@ -248,6 +250,10 @@ uk:
248
250
  inactive_body: увімкніть, щоб бачити виконані рядки
249
251
  enable: Увімкнути
250
252
  disable: Вимкнути
253
+ occurrence:
254
+ title: "Подія #%{id}"
255
+ body: "Breadcrumbs, стан системи та змінні належать до цієї події. Усе інше показує останнє захоплення."
256
+ show_latest: "Показати останню"
251
257
  baselines:
252
258
  title: Статистика базового рівня
253
259
  anomaly_label: 'Аномалія:'
@@ -520,6 +526,14 @@ uk:
520
526
  few: "+%{count} ще"
521
527
  many: "+%{count} ще"
522
528
  view_errors: Переглянути помилки
529
+ captured_occurrences:
530
+ title: "Збережені події"
531
+ hint: "Breadcrumbs, стан системи та змінні зберігаються для останніх подій (occurrence_context_limit). Відкрийте подію, щоб їх побачити."
532
+ column_occurrence: "Подія"
533
+ column_occurred_at: "Час"
534
+ column_version: "Версія"
535
+ view: "Відкрити"
536
+ viewing: "Відкрито"
523
537
  co_occurring:
524
538
  title: Супутні помилки
525
539
  badge: Часові закономірності
@@ -775,6 +789,7 @@ uk:
775
789
  many: "%{count} кадрів"
776
790
  click_to_expand: "(натисніть, щоб розгорнути)"
777
791
  view_source: Переглянути код
792
+ client_report_note: "Ці фрейми надійшли зі звіту клієнта (ManualErrorReporter). Вони описують код, що виконувався на клієнті, тому RED не відкриває для них вихідні файли, не показує фрагменти й не запускає git blame."
778
793
  none: Backtrace недоступний
779
794
  row:
780
795
  new_badge: НОВА
@@ -1153,6 +1168,11 @@ uk:
1153
1168
  other: "%{count} події"
1154
1169
  few: "%{count} події"
1155
1170
  many: "%{count} подій"
1171
+ occurrences:
1172
+ one: "%{count} подія"
1173
+ other: "%{count} події"
1174
+ few: "%{count} події"
1175
+ many: "%{count} подій"
1156
1176
  queries:
1157
1177
  one: "%{count} запит"
1158
1178
  other: "%{count} запита"
@@ -1207,6 +1227,7 @@ uk:
1207
1227
  enable_middleware: Перехоплює необроблені винятки
1208
1228
  enable_error_subscriber: Підписується на події помилок Rails
1209
1229
  retention_days: "Видаляти помилки, яких не було стільки днів. Виконує RetentionCleanupJob, який гем сам не планує"
1230
+ occurrence_context_limit: "Скільки останніх подій кожної помилки зберігають breadcrumbs, стан системи та змінні (0 = вимкнено)"
1210
1231
  max_backtrace_lines: Обмеження глибини стеку викликів
1211
1232
  sampling_rate: Відсоток захоплених помилок
1212
1233
  application_name: Назва цього застосунку (визначається автоматично, якщо не
@@ -36,6 +36,8 @@ zh-CN:
36
36
  healthy: "✅ 正常"
37
37
  warning: "⚠️ 警告"
38
38
  critical: "\U0001F534 严重"
39
+ not_rated: "未评级"
40
+ not_rated_hint: "评级是在平台之间比较的,因此至少需要两个平台上的错误。"
39
41
  device_type:
40
42
  mobile: Mobile
41
43
  tablet: Tablet
@@ -231,6 +233,10 @@ zh-CN:
231
233
  inactive_body: 启用后可查看已执行的行
232
234
  enable: 启用
233
235
  disable: 停用
236
+ occurrence:
237
+ title: "发生 #%{id}"
238
+ body: "Breadcrumbs、系统状态和变量来自这次发生。其余内容显示最新一次捕获。"
239
+ show_latest: "查看最新"
234
240
  baselines:
235
241
  title: 基线统计
236
242
  anomaly_label: 异常:
@@ -451,6 +457,14 @@ zh-CN:
451
457
  more:
452
458
  other: 另有 %{count} 项
453
459
  view_errors: 查看错误
460
+ captured_occurrences:
461
+ title: "已捕获的发生记录"
462
+ hint: "仅为最近的发生保留 Breadcrumbs、系统状态和变量(occurrence_context_limit)。打开某一条即可查看。"
463
+ column_occurrence: "发生"
464
+ column_occurred_at: "发生时间"
465
+ column_version: "版本"
466
+ view: "查看"
467
+ viewing: "正在查看"
454
468
  co_occurring:
455
469
  title: 同时出现的错误
456
470
  badge: 时间规律
@@ -679,6 +693,7 @@ zh-CN:
679
693
  other: "%{count} 个栈帧"
680
694
  click_to_expand: "(点击展开)"
681
695
  view_source: 查看源码
696
+ client_report_note: "这些帧来自客户端报告(ManualErrorReporter)。它们描述的是在客户端运行的代码,因此 RED 不会为其打开源文件、显示代码片段或运行 git blame。"
682
697
  none: 无可用的 backtrace
683
698
  row:
684
699
  new_badge: 新
@@ -986,6 +1001,8 @@ zh-CN:
986
1001
  other: "%{count} 秒"
987
1002
  events:
988
1003
  other: "%{count} 个事件"
1004
+ occurrences:
1005
+ other: "%{count} 次发生"
989
1006
  queries:
990
1007
  other: "%{count} 条查询"
991
1008
  std_devs: "%{count}σ"
@@ -1025,6 +1042,7 @@ zh-CN:
1025
1042
  enable_middleware: 捕获未处理的异常
1026
1043
  enable_error_subscriber: 订阅 Rails 错误事件
1027
1044
  retention_days: "删除这么多天内未再出现的错误。由 RetentionCleanupJob 执行,gem 本身不会安排它运行"
1045
+ occurrence_context_limit: "每个错误保留 Breadcrumbs、系统状态和变量的最近发生次数(0 = 关闭)"
1028
1046
  max_backtrace_lines: 堆栈跟踪深度上限
1029
1047
  sampling_rate: 错误捕获的采样比例
1030
1048
  application_name: 本应用的名称(未设置时自动检测)
@@ -3,9 +3,9 @@ class BackfillApplicationForExistingErrors < ActiveRecord::Migration[7.0]
3
3
  return if RailsErrorDashboard::ErrorLog.count.zero?
4
4
 
5
5
  # Create default application
6
- default_name = ENV['APPLICATION_NAME'] ||
7
- (defined?(Rails) && Rails.application.class.module_parent_name) ||
8
- 'Legacy Application'
6
+ # The name new errors are captured under, config.application_name first,
7
+ # so old and new errors land in the same Application
8
+ default_name = RailsErrorDashboard.resolved_application_name
9
9
 
10
10
  app = RailsErrorDashboard::Application.find_or_create_by!(name: default_name) do |a|
11
11
  a.description = 'Auto-created during migration for existing errors'
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The moment-of-failure context of individual occurrences: breadcrumbs, system
4
+ # health, local and instance variables, as the error row stores them for its
5
+ # latest capture. The error row keeps only the latest; this keeps the last
6
+ # config.occurrence_context_limit occurrences per error (default 25).
7
+ #
8
+ # A side table, not columns on error_occurrences: the co-occurrence queries
9
+ # load occurrence rows whole, and these payloads run to several KB.
10
+ class CreateRailsErrorDashboardErrorOccurrenceContexts < ActiveRecord::Migration[7.0]
11
+ def change
12
+ # Guard against the squashed schema migration having already created this
13
+ # table -- without it, every later migration is silently cancelled.
14
+ return if table_exists?(:rails_error_dashboard_error_occurrence_contexts)
15
+
16
+ create_table :rails_error_dashboard_error_occurrence_contexts do |t|
17
+ t.bigint :error_occurrence_id, null: false
18
+ # Denormalized from the occurrence, so trimming to the newest N per error
19
+ # and retention's delete-by-error need no join
20
+ t.bigint :error_log_id, null: false
21
+ t.text :breadcrumbs
22
+ t.text :system_health
23
+ t.text :local_variables
24
+ t.text :instance_variables
25
+ t.datetime :created_at, null: false
26
+ end
27
+
28
+ # Named explicitly: an auto-generated name would exceed PostgreSQL's
29
+ # 63-character limit and fail during the HOST app's deploy.
30
+ add_index :rails_error_dashboard_error_occurrence_contexts, :error_occurrence_id,
31
+ unique: true, name: "index_red_occurrence_contexts_on_occurrence"
32
+ add_index :rails_error_dashboard_error_occurrence_contexts, :error_log_id,
33
+ name: "index_red_occurrence_contexts_on_error_log"
34
+ end
35
+ end