rails_error_dashboard 0.9.1 → 0.11.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 +16 -3
  3. data/app/controllers/rails_error_dashboard/errors_controller.rb +9 -0
  4. data/app/helpers/rails_error_dashboard/i18n_helper.rb +26 -0
  5. data/app/jobs/rails_error_dashboard/rack_attack_flush_job.rb +7 -3
  6. data/app/mailers/rails_error_dashboard/error_notification_mailer.rb +8 -1
  7. data/app/models/rails_error_dashboard/error_log.rb +1 -0
  8. data/app/models/rails_error_dashboard/rack_attack_event.rb +6 -2
  9. data/app/views/layouts/rails_error_dashboard.html.erb +85 -0
  10. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb +5 -0
  11. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb +1 -0
  12. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +8 -0
  13. data/app/views/rails_error_dashboard/errors/_sidebar_metadata.html.erb +9 -0
  14. data/app/views/rails_error_dashboard/errors/analytics.html.erb +58 -13
  15. data/app/views/rails_error_dashboard/errors/correlation.html.erb +4 -4
  16. data/app/views/rails_error_dashboard/errors/database_health_summary.html.erb +1 -1
  17. data/app/views/rails_error_dashboard/errors/index.html.erb +8 -1
  18. data/app/views/rails_error_dashboard/errors/overview.html.erb +2 -2
  19. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +1 -1
  20. data/app/views/rails_error_dashboard/errors/rack_attack_summary.html.erb +36 -3
  21. data/app/views/rails_error_dashboard/errors/settings.html.erb +2 -0
  22. data/config/locales/de.yml +22 -0
  23. data/config/locales/en.yml +24 -0
  24. data/config/locales/es.yml +21 -0
  25. data/config/locales/fr.yml +22 -0
  26. data/config/locales/it.yml +30 -1
  27. data/config/locales/ja.yml +19 -0
  28. data/config/locales/pl.yml +22 -0
  29. data/config/locales/pt-BR.yml +21 -0
  30. data/config/locales/ru.yml +21 -0
  31. data/config/locales/uk.yml +21 -0
  32. data/config/locales/zh-CN.yml +17 -0
  33. data/db/migrate/20260824000001_add_user_agent_to_rack_attack_events.rb +19 -0
  34. data/db/migrate/20260826000001_add_environment_to_error_logs.rb +26 -0
  35. data/lib/generators/rails_error_dashboard/install/install_generator.rb +12 -0
  36. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +11 -0
  37. data/lib/rails_error_dashboard/commands/backfill_environments.rb +58 -0
  38. data/lib/rails_error_dashboard/commands/find_or_increment_error.rb +55 -29
  39. data/lib/rails_error_dashboard/commands/flush_rack_attack_events.rb +12 -3
  40. data/lib/rails_error_dashboard/commands/flush_storm_counts.rb +40 -9
  41. data/lib/rails_error_dashboard/commands/log_error.rb +17 -0
  42. data/lib/rails_error_dashboard/configuration.rb +52 -0
  43. data/lib/rails_error_dashboard/engine.rb +7 -0
  44. data/lib/rails_error_dashboard/queries/analytics_stats.rb +9 -0
  45. data/lib/rails_error_dashboard/queries/errors_list.rb +8 -0
  46. data/lib/rails_error_dashboard/queries/filter_options.rb +9 -0
  47. data/lib/rails_error_dashboard/queries/rack_attack_summary.rb +31 -5
  48. data/lib/rails_error_dashboard/services/ai_agent_classifier.rb +154 -0
  49. data/lib/rails_error_dashboard/services/discord_payload_builder.rb +8 -0
  50. data/lib/rails_error_dashboard/services/error_broadcaster.rb +6 -2
  51. data/lib/rails_error_dashboard/services/issue_body_formatter.rb +1 -0
  52. data/lib/rails_error_dashboard/services/markdown_error_formatter.rb +1 -0
  53. data/lib/rails_error_dashboard/services/notification_throttler.rb +23 -0
  54. data/lib/rails_error_dashboard/services/pagerduty_payload_builder.rb +1 -0
  55. data/lib/rails_error_dashboard/services/rack_attack_tracker.rb +91 -9
  56. data/lib/rails_error_dashboard/services/slack_payload_builder.rb +9 -0
  57. data/lib/rails_error_dashboard/services/storm_protection/gate.rb +2 -0
  58. data/lib/rails_error_dashboard/services/webhook_payload_builder.rb +1 -0
  59. data/lib/rails_error_dashboard/subscribers/rack_attack_subscriber.rb +40 -2
  60. data/lib/rails_error_dashboard/version.rb +1 -1
  61. data/lib/rails_error_dashboard.rb +2 -0
  62. data/lib/tasks/rails_error_dashboard_tasks.rake +6 -0
  63. metadata +6 -2
@@ -49,7 +49,7 @@
49
49
  </div>
50
50
  <% else %>
51
51
  <div class="row mb-4">
52
- <div class="col-md-4">
52
+ <div class="col-md-3">
53
53
  <div class="card text-center">
54
54
  <div class="card-body">
55
55
  <div class="display-6 text-warning"><%= @unique_rules %></div>
@@ -57,7 +57,7 @@
57
57
  </div>
58
58
  </div>
59
59
  </div>
60
- <div class="col-md-4">
60
+ <div class="col-md-3">
61
61
  <div class="card text-center">
62
62
  <div class="card-body">
63
63
  <div class="display-6 text-danger"><%= @total_events %></div>
@@ -65,7 +65,7 @@
65
65
  </div>
66
66
  </div>
67
67
  </div>
68
- <div class="col-md-4">
68
+ <div class="col-md-3">
69
69
  <div class="card text-center">
70
70
  <div class="card-body">
71
71
  <div class="display-6 text-info"><%= @unique_ips %></div>
@@ -73,8 +73,27 @@
73
73
  </div>
74
74
  </div>
75
75
  </div>
76
+ <div class="col-md-3">
77
+ <div class="card text-center">
78
+ <div class="card-body">
79
+ <div class="display-6 text-primary"><%= @ai_events %></div>
80
+ <small class="text-muted"><%= red_t("red.errors.rack_attack_page.ai_events") %></small>
81
+ </div>
82
+ </div>
83
+ </div>
76
84
  </div>
77
85
 
86
+ <% if @overflow_count.to_i.positive? %>
87
+ <div class="alert alert-warning d-flex align-items-start" role="alert">
88
+ <i class="bi bi-exclamation-triangle me-2"></i>
89
+ <div>
90
+ <%= red_t("red.errors.rack_attack_page.overflow_notice_html",
91
+ count: @overflow_count,
92
+ option: content_tag(:code, "rack_attack_max_cache_size")) %>
93
+ </div>
94
+ </div>
95
+ <% end %>
96
+
78
97
  <div class="card mb-4">
79
98
  <div class="card-header d-flex justify-content-between align-items-center">
80
99
  <h5 class="mb-0">
@@ -94,6 +113,7 @@
94
113
  <th width="80"><%= red_t("red.errors.rack_attack_page.column_count") %></th>
95
114
  <th width="80"><%= red_t("red.errors.rack_attack_page.column_ips") %></th>
96
115
  <th><%= red_t("red.errors.rack_attack_page.column_top_path") %></th>
116
+ <th width="160"><%= red_t("red.errors.rack_attack_page.column_top_agent") %></th>
97
117
  <th width="140"><%= red_t("red.errors.pages.column_last_seen") %></th>
98
118
  </tr>
99
119
  </thead>
@@ -115,6 +135,19 @@
115
135
  <td><strong><%= event[:count] %></strong></td>
116
136
  <td><%= event[:unique_ips] %></td>
117
137
  <td><code><%= event[:top_path] %></code></td>
138
+ <td>
139
+ <% if event[:top_agent].present? %>
140
+ <%# AI agents are highlighted because "which agent" is the
141
+ question IP counts cannot answer — one agent is a fleet. %>
142
+ <span class="badge <%= event[:ai_count].to_i.positive? ? "bg-primary" : "bg-light text-dark" %>"
143
+ title="<%= event[:top_agent] %>"><%= truncate(event[:top_agent], length: 22) %></span>
144
+ <% if event[:unique_agents].to_i > 1 %>
145
+ <small class="text-muted">+<%= event[:unique_agents].to_i - 1 %></small>
146
+ <% end %>
147
+ <% else %>
148
+ <span class="text-muted">&mdash;</span>
149
+ <% end %>
150
+ </td>
118
151
  <td><%= local_time_ago(event[:last_seen]) %></td>
119
152
  </tr>
120
153
  <% end %>
@@ -19,6 +19,7 @@
19
19
  color: "info",
20
20
  settings: {
21
21
  application_name: { type: :application_name },
22
+ environment: { type: :string },
22
23
  database: { type: :database_name },
23
24
  use_separate_database: { type: :boolean }
24
25
  }
@@ -45,6 +46,7 @@
45
46
  icon: "bi-bell",
46
47
  color: "info",
47
48
  settings: {
49
+ notification_environments: { type: :array },
48
50
  enable_slack_notifications: { type: :boolean },
49
51
  slack_webhook_url: { type: :url, show_if: :enable_slack_notifications },
50
52
  enable_email_notifications: { type: :boolean },
@@ -144,6 +144,7 @@ de:
144
144
  any: Beliebiger Schweregrad
145
145
  all_apps: Alle Anwendungen
146
146
  all_platforms: Alle Plattformen
147
+ all_environments: Alle Umgebungen
147
148
  all_types: Alle Typen
148
149
  all_timeframes: Gesamter Zeitraum
149
150
  all_frequencies: Alle Häufigkeiten
@@ -172,6 +173,7 @@ de:
172
173
  search: 'Suche: %{value}'
173
174
  application: 'Anwendung: %{value}'
174
175
  platform: 'Plattform: %{value}'
176
+ environment: 'Umgebung: %{value}'
175
177
  error_type: 'Typ: %{value}'
176
178
  severity: 'Schweregrad: %{value}'
177
179
  timeframe: 'Zeitraum: %{value}'
@@ -187,6 +189,7 @@ de:
187
189
  last_seen: Zuletzt gesehen
188
190
  application: Anwendung
189
191
  platform: Plattform
192
+ environment: Umgebung
190
193
  select_all: Alle Fehler auswählen
191
194
  batch:
192
195
  selected:
@@ -625,6 +628,7 @@ de:
625
628
  low: NIEDRIG
626
629
  platform: Plattform
627
630
  view_all_platform: Alle %{platform}-Fehler ansehen
631
+ view_all_environment: Alle Fehler aus %{environment} ansehen
628
632
  user: Benutzer
629
633
  view_user_errors: Alle Fehler dieses Benutzers ansehen
630
634
  user_id: 'ID: %{id}'
@@ -833,12 +837,17 @@ de:
833
837
  unique_rules: Eindeutige Regeln
834
838
  total_events: Ereignisse gesamt
835
839
  unique_ips: Eindeutige IPs
840
+ ai_events: KI-Agent-Anfragen
836
841
  all_title: Rate-Limit-Ereignisse nach Regel
837
842
  column_rule: Regel
838
843
  column_type: Typ
839
844
  column_count: Anzahl
840
845
  column_ips: IPs
841
846
  column_top_path: Häufigster Pfad
847
+ column_top_agent: Häufigster Agent
848
+ overflow_notice_html: "%{count} Ereignisse konnten keiner Regel zugeordnet
849
+ werden, da der Puffer des Trackers voll war. Erhöhen Sie %{option}, um mehr
850
+ zu erfassen."
842
851
  match_type:
843
852
  blocklist: blocklist
844
853
  throttle: throttle
@@ -1066,6 +1075,10 @@ de:
1066
1075
  sampling_rate: Anteil der erfassten Fehler
1067
1076
  application_name: Name dieser Anwendung (wird automatisch erkannt, wenn nicht
1068
1077
  gesetzt)
1078
+ environment: Umgebung, der Fehler zugeordnet werden (Rails.env, falls nicht
1079
+ gesetzt)
1080
+ notification_environments: Nur für diese Umgebungen benachrichtigen (alle,
1081
+ falls nicht gesetzt)
1069
1082
  database: Aktive Datenbank für Fehlerprotokolle
1070
1083
  use_separate_database: Eigene Datenbank für Fehlerprotokolle verwenden
1071
1084
  user_model: Modellname für Benutzerzuordnungen (wird automatisch erkannt,
@@ -1233,11 +1246,14 @@ de:
1233
1246
  unknown_application: Unbekannt
1234
1247
  error_alert:
1235
1248
  subject: "\U0001F6A8 [%{application}] %{error_type}: %{message}"
1249
+ subject_with_environment: "\U0001F6A8 [%{application} · %{environment}] %{error_type}:
1250
+ %{message}"
1236
1251
  heading: "\U0001F6A8 Fehlermeldung"
1237
1252
  labels:
1238
1253
  application: Anwendung
1239
1254
  error_type: Fehlertyp
1240
1255
  platform: Plattform
1256
+ environment: Umgebung
1241
1257
  occurred_at: Aufgetreten am
1242
1258
  user_id: Benutzer-ID
1243
1259
  ip_address: IP-Adresse
@@ -1303,6 +1319,7 @@ de:
1303
1319
  application: Anwendung
1304
1320
  error_type: Fehlertyp
1305
1321
  platform: Plattform
1322
+ environment: Umgebung
1306
1323
  occurred: Aufgetreten
1307
1324
  message: Meldung
1308
1325
  user: Benutzer
@@ -1637,6 +1654,10 @@ de:
1637
1654
  platform_chart:
1638
1655
  title: Fehler nach Plattform
1639
1656
  quick_links: 'Schnellzugriff:'
1657
+ environment_chart:
1658
+ title: Fehler nach Umgebung
1659
+ quick_links: 'Schnellzugriff:'
1660
+ unknown: Unbekannt
1640
1661
  type_chart:
1641
1662
  title: Top 10 Fehlertypen
1642
1663
  hour_chart:
@@ -2003,5 +2024,6 @@ de:
2003
2024
  axis_count: Anzahl
2004
2025
  axis_number_of_errors: Anzahl der Fehler
2005
2026
  axis_hours: Stunden
2027
+ suffix_hours: " Stunden"
2006
2028
  series_total_errors: Fehler gesamt
2007
2029
  series_hours_to_resolve: Stunden bis zur Behebung
@@ -249,6 +249,7 @@ en:
249
249
  # noun — languages differ on agreement between the two.
250
250
  all_apps: "All Apps"
251
251
  all_platforms: "All Platforms"
252
+ all_environments: "All Environments"
252
253
  all_types: "All Types"
253
254
  all_timeframes: "All Time"
254
255
  all_frequencies: "All Frequencies"
@@ -290,6 +291,7 @@ en:
290
291
  search: "Search: %{value}"
291
292
  application: "App: %{value}"
292
293
  platform: "Platform: %{value}"
294
+ environment: "Environment: %{value}"
293
295
  error_type: "Type: %{value}"
294
296
  severity: "Severity: %{value}"
295
297
  timeframe: "Timeframe: %{value}"
@@ -306,6 +308,7 @@ en:
306
308
  last_seen: "Last seen"
307
309
  application: "App"
308
310
  platform: "Platform"
311
+ environment: "Environment"
309
312
  select_all: "Select all errors"
310
313
 
311
314
  batch:
@@ -876,6 +879,8 @@ en:
876
879
  platform: "Platform"
877
880
  # %{platform} is a platform name (iOS, Android, Web) and is not translated.
878
881
  view_all_platform: "View all %{platform} errors"
882
+ # %{environment} is an environment name (production, staging, uat) and is not translated.
883
+ view_all_environment: "View all %{environment} errors"
879
884
 
880
885
  user: "User"
881
886
  view_user_errors: "View all errors for this user"
@@ -1172,12 +1177,16 @@ en:
1172
1177
  unique_rules: "Unique Rules"
1173
1178
  total_events: "Total Events"
1174
1179
  unique_ips: "Unique IPs"
1180
+ ai_events: "AI Agent Requests"
1175
1181
  all_title: "Rate Limit Events by Rule"
1176
1182
  column_rule: "Rule"
1177
1183
  column_type: "Type"
1178
1184
  column_count: "Count"
1179
1185
  column_ips: "IPs"
1180
1186
  column_top_path: "Top Path"
1187
+ column_top_agent: "Top Agent"
1188
+ overflow_notice_html: >-
1189
+ %{count} events could not be attributed to a rule because the tracker's buffer was full. Raise %{option} to capture more.
1181
1190
  # Rack Attack match types. These are machine values the view also
1182
1191
  # compares by string equality, so the display is a lookup and the
1183
1192
  # comparison keeps the English literal.
@@ -1480,6 +1489,8 @@ en:
1480
1489
  max_backtrace_lines: "Stack trace depth limit"
1481
1490
  sampling_rate: "Percentage of errors captured"
1482
1491
  application_name: "Name of this application (auto-detected if not set)"
1492
+ environment: "Environment errors are attributed to (Rails.env if not set)"
1493
+ notification_environments: "Only notify for these environments (all if not set)"
1483
1494
  database: "Active database for error logs"
1484
1495
  use_separate_database: "Use dedicated DB for error logs"
1485
1496
  user_model: "Model name for user associations (auto-detected if not set)"
@@ -1698,11 +1709,15 @@ en:
1698
1709
  # an exception class name and %{message} is its message — both are
1699
1710
  # verbatim error content and are not translated.
1700
1711
  subject: "🚨 [%{application}] %{error_type}: %{message}"
1712
+ # Used instead of `subject` when the error carries an environment.
1713
+ # %{environment} is an environment name and is not translated.
1714
+ subject_with_environment: "🚨 [%{application} · %{environment}] %{error_type}: %{message}"
1701
1715
  heading: "🚨 Error Alert"
1702
1716
  labels:
1703
1717
  application: "Application"
1704
1718
  error_type: "Error Type"
1705
1719
  platform: "Platform"
1720
+ environment: "Environment"
1706
1721
  occurred_at: "Occurred At"
1707
1722
  user_id: "User ID"
1708
1723
  ip_address: "IP Address"
@@ -1802,6 +1817,7 @@ en:
1802
1817
  application: "Application"
1803
1818
  error_type: "Error Type"
1804
1819
  platform: "Platform"
1820
+ environment: "Environment"
1805
1821
  occurred: "Occurred"
1806
1822
  message: "Message"
1807
1823
  user: "User"
@@ -2211,6 +2227,11 @@ en:
2211
2227
  platform_chart:
2212
2228
  title: "Errors by Platform"
2213
2229
  quick_links: "Quick Links:"
2230
+ environment_chart:
2231
+ title: "Errors by Environment"
2232
+ quick_links: "Quick Links:"
2233
+ # Label for errors captured before the environment column existed.
2234
+ unknown: "Unknown"
2214
2235
 
2215
2236
  type_chart:
2216
2237
  title: "Top 10 Error Types"
@@ -2715,5 +2736,8 @@ en:
2715
2736
  axis_count: "Count"
2716
2737
  axis_number_of_errors: "Number of Errors"
2717
2738
  axis_hours: "Hours"
2739
+ # Chartkick concatenates this after a number on the MTTR charts, so it
2740
+ # carries its own leading space and is a bare unit, not a sentence.
2741
+ suffix_hours: " hours"
2718
2742
  series_total_errors: "Total Errors"
2719
2743
  series_hours_to_resolve: "Hours to Resolve"
@@ -147,6 +147,7 @@ es:
147
147
  any: Cualquier gravedad
148
148
  all_apps: Todas las aplicaciones
149
149
  all_platforms: Todas las plataformas
150
+ all_environments: Todos los entornos
150
151
  all_types: Todos los tipos
151
152
  all_timeframes: Todo el periodo
152
153
  all_frequencies: Todas las frecuencias
@@ -175,6 +176,7 @@ es:
175
176
  search: 'Búsqueda: %{value}'
176
177
  application: 'Aplicación: %{value}'
177
178
  platform: 'Plataforma: %{value}'
179
+ environment: 'Entorno: %{value}'
178
180
  error_type: 'Tipo: %{value}'
179
181
  severity: 'Gravedad: %{value}'
180
182
  timeframe: 'Periodo: %{value}'
@@ -190,6 +192,7 @@ es:
190
192
  last_seen: Última aparición
191
193
  application: Aplicación
192
194
  platform: Plataforma
195
+ environment: Entorno
193
196
  select_all: Seleccionar todos los errores
194
197
  batch:
195
198
  selected:
@@ -652,6 +655,7 @@ es:
652
655
  low: BAJA
653
656
  platform: Plataforma
654
657
  view_all_platform: Ver todos los errores de %{platform}
658
+ view_all_environment: Ver todos los errores de %{environment}
655
659
  user: Usuario
656
660
  view_user_errors: Ver todos los errores de este usuario
657
661
  user_id: 'ID: %{id}'
@@ -862,12 +866,17 @@ es:
862
866
  unique_rules: Reglas únicas
863
867
  total_events: Total de eventos
864
868
  unique_ips: IP únicas
869
+ ai_events: Solicitudes de agentes de IA
865
870
  all_title: Eventos de límite de tasa por regla
866
871
  column_rule: Regla
867
872
  column_type: Tipo
868
873
  column_count: Cantidad
869
874
  column_ips: IP
870
875
  column_top_path: Ruta principal
876
+ column_top_agent: Agente principal
877
+ overflow_notice_html: No se pudieron atribuir %{count} eventos a ninguna regla
878
+ porque el búfer del rastreador estaba lleno. Aumente %{option} para capturar
879
+ más.
871
880
  match_type:
872
881
  blocklist: blocklist
873
882
  throttle: throttle
@@ -1108,6 +1117,9 @@ es:
1108
1117
  sampling_rate: Porcentaje de errores capturados
1109
1118
  application_name: Nombre de esta aplicación (se detecta automáticamente si
1110
1119
  no se define)
1120
+ environment: Entorno al que se atribuyen los errores (Rails.env si no se define)
1121
+ notification_environments: Notificar solo para estos entornos (todos si no
1122
+ se define)
1111
1123
  database: Base de datos activa para los registros de errores
1112
1124
  use_separate_database: Usar una base de datos dedicada para los registros
1113
1125
  de errores
@@ -1283,11 +1295,14 @@ es:
1283
1295
  unknown_application: Desconocida
1284
1296
  error_alert:
1285
1297
  subject: "\U0001F6A8 [%{application}] %{error_type}: %{message}"
1298
+ subject_with_environment: "\U0001F6A8 [%{application} · %{environment}] %{error_type}:
1299
+ %{message}"
1286
1300
  heading: "\U0001F6A8 Alerta de error"
1287
1301
  labels:
1288
1302
  application: Aplicación
1289
1303
  error_type: Tipo de error
1290
1304
  platform: Plataforma
1305
+ environment: Entorno
1291
1306
  occurred_at: Ocurrió el
1292
1307
  user_id: ID de usuario
1293
1308
  ip_address: Dirección IP
@@ -1356,6 +1371,7 @@ es:
1356
1371
  application: Aplicación
1357
1372
  error_type: Tipo de error
1358
1373
  platform: Plataforma
1374
+ environment: Entorno
1359
1375
  occurred: Ocurrió
1360
1376
  message: Mensaje
1361
1377
  user: Usuario
@@ -1692,6 +1708,10 @@ es:
1692
1708
  platform_chart:
1693
1709
  title: Errores por plataforma
1694
1710
  quick_links: 'Enlaces rápidos:'
1711
+ environment_chart:
1712
+ title: Errores por entorno
1713
+ quick_links: 'Enlaces rápidos:'
1714
+ unknown: Desconocido
1695
1715
  type_chart:
1696
1716
  title: Los 10 tipos de error más frecuentes
1697
1717
  hour_chart:
@@ -2075,5 +2095,6 @@ es:
2075
2095
  axis_count: Cantidad
2076
2096
  axis_number_of_errors: Número de errores
2077
2097
  axis_hours: Horas
2098
+ suffix_hours: " horas"
2078
2099
  series_total_errors: Total de errores
2079
2100
  series_hours_to_resolve: Horas hasta la resolución
@@ -147,6 +147,7 @@ fr:
147
147
  any: Toutes gravités
148
148
  all_apps: Toutes les applications
149
149
  all_platforms: Toutes les plateformes
150
+ all_environments: Tous les environnements
150
151
  all_types: Tous les types
151
152
  all_timeframes: Toute la période
152
153
  all_frequencies: Toutes les fréquences
@@ -175,6 +176,7 @@ fr:
175
176
  search: 'Recherche : %{value}'
176
177
  application: 'Application : %{value}'
177
178
  platform: 'Plateforme : %{value}'
179
+ environment: 'Environnement : %{value}'
178
180
  error_type: 'Type : %{value}'
179
181
  severity: 'Gravité : %{value}'
180
182
  timeframe: 'Période : %{value}'
@@ -190,6 +192,7 @@ fr:
190
192
  last_seen: Dernière occurrence
191
193
  application: Application
192
194
  platform: Plateforme
195
+ environment: Environnement
193
196
  select_all: Sélectionner toutes les erreurs
194
197
  batch:
195
198
  selected:
@@ -651,6 +654,7 @@ fr:
651
654
  low: FAIBLE
652
655
  platform: Plateforme
653
656
  view_all_platform: Voir toutes les erreurs %{platform}
657
+ view_all_environment: Voir toutes les erreurs de %{environment}
654
658
  user: Utilisateur
655
659
  view_user_errors: Voir toutes les erreurs de cet utilisateur
656
660
  user_id: 'ID : %{id}'
@@ -861,12 +865,17 @@ fr:
861
865
  unique_rules: Règles uniques
862
866
  total_events: Total des événements
863
867
  unique_ips: IP uniques
868
+ ai_events: Requêtes d'agents IA
864
869
  all_title: Événements de limitation de débit par règle
865
870
  column_rule: Règle
866
871
  column_type: Type
867
872
  column_count: Nombre
868
873
  column_ips: IP
869
874
  column_top_path: Chemin principal
875
+ column_top_agent: Agent principal
876
+ overflow_notice_html: "%{count} événements n'ont pas pu être attribués à une
877
+ règle car la mémoire tampon du traceur était pleine. Augmentez %{option}
878
+ pour en capturer davantage."
870
879
  match_type:
871
880
  blocklist: blocklist
872
881
  throttle: throttle
@@ -1109,6 +1118,10 @@ fr:
1109
1118
  sampling_rate: Pourcentage d'erreurs capturées
1110
1119
  application_name: Nom de cette application (détecté automatiquement si non
1111
1120
  défini)
1121
+ environment: Environnement auquel les erreurs sont attribuées (Rails.env si
1122
+ non défini)
1123
+ notification_environments: Ne notifier que pour ces environnements (tous si
1124
+ non défini)
1112
1125
  database: Base de données active pour les journaux d'erreurs
1113
1126
  use_separate_database: Utiliser une base de données dédiée aux journaux d'erreurs
1114
1127
  user_model: Nom du modèle pour les associations utilisateur (détecté automatiquement
@@ -1281,11 +1294,14 @@ fr:
1281
1294
  unknown_application: Inconnue
1282
1295
  error_alert:
1283
1296
  subject: "\U0001F6A8 [%{application}] %{error_type} : %{message}"
1297
+ subject_with_environment: "\U0001F6A8 [%{application} · %{environment}] %{error_type}
1298
+ : %{message}"
1284
1299
  heading: "\U0001F6A8 Alerte d'erreur"
1285
1300
  labels:
1286
1301
  application: Application
1287
1302
  error_type: Type d'erreur
1288
1303
  platform: Plateforme
1304
+ environment: Environnement
1289
1305
  occurred_at: Survenue le
1290
1306
  user_id: ID utilisateur
1291
1307
  ip_address: Adresse IP
@@ -1355,6 +1371,7 @@ fr:
1355
1371
  application: Application
1356
1372
  error_type: Type d'erreur
1357
1373
  platform: Plateforme
1374
+ environment: Environnement
1358
1375
  occurred: Survenue
1359
1376
  message: Message
1360
1377
  user: Utilisateur
@@ -1694,6 +1711,10 @@ fr:
1694
1711
  platform_chart:
1695
1712
  title: Erreurs par plateforme
1696
1713
  quick_links: 'Liens rapides :'
1714
+ environment_chart:
1715
+ title: Erreurs par environnement
1716
+ quick_links: 'Liens rapides :'
1717
+ unknown: Inconnu
1697
1718
  type_chart:
1698
1719
  title: Top 10 des types d'erreurs
1699
1720
  hour_chart:
@@ -2078,5 +2099,6 @@ fr:
2078
2099
  axis_count: Nombre
2079
2100
  axis_number_of_errors: Nombre d'erreurs
2080
2101
  axis_hours: Heures
2102
+ suffix_hours: " heures"
2081
2103
  series_total_errors: Total des erreurs
2082
2104
  series_hours_to_resolve: Heures avant résolution
@@ -1,4 +1,11 @@
1
- ---
1
+ # RED dashboard translations — it
2
+ #
3
+ # MACHINE-TRANSLATED AND NOT REVIEWED BY A NATIVE SPEAKER.
4
+ # See docs/guides/TRANSLATIONS.md. Corrections are welcome, and a one-key
5
+ # pull request is a perfectly good pull request.
6
+ #
7
+ # Structure is derived from en.yml, which is authoritative. Do not add keys
8
+ # here that do not exist there — run bin/i18n-check after editing.
2
9
  it:
3
10
  red:
4
11
  common:
@@ -139,6 +146,7 @@ it:
139
146
  any: Qualsiasi gravità
140
147
  all_apps: Tutte le app
141
148
  all_platforms: Tutte le piattaforme
149
+ all_environments: Tutti gli ambienti
142
150
  all_types: Tutti i tipi
143
151
  all_timeframes: Da sempre
144
152
  all_frequencies: Tutte le frequenze
@@ -167,6 +175,7 @@ it:
167
175
  search: 'Ricerca: %{value}'
168
176
  application: 'App: %{value}'
169
177
  platform: 'Piattaforma: %{value}'
178
+ environment: 'Ambiente: %{value}'
170
179
  error_type: 'Tipo: %{value}'
171
180
  severity: 'Gravità: %{value}'
172
181
  timeframe: 'Periodo: %{value}'
@@ -182,6 +191,7 @@ it:
182
191
  last_seen: Ultima occorrenza
183
192
  application: App
184
193
  platform: Piattaforma
194
+ environment: Ambiente
185
195
  select_all: Seleziona tutti gli errori
186
196
  batch:
187
197
  selected:
@@ -637,6 +647,7 @@ it:
637
647
  low: BASSO
638
648
  platform: Piattaforma
639
649
  view_all_platform: Vedi tutti gli errori di %{platform}
650
+ view_all_environment: Vedi tutti gli errori di %{environment}
640
651
  user: Utente
641
652
  view_user_errors: Vedi tutti gli errori di questo utente
642
653
  user_id: 'ID: %{id}'
@@ -847,12 +858,17 @@ it:
847
858
  unique_rules: Regole uniche
848
859
  total_events: Eventi totali
849
860
  unique_ips: IP unici
861
+ ai_events: Richieste di agenti IA
850
862
  all_title: Eventi di limite di richieste per regola
851
863
  column_rule: Regola
852
864
  column_type: Tipo
853
865
  column_count: Conteggio
854
866
  column_ips: Indirizzi IP
855
867
  column_top_path: Percorso principale
868
+ column_top_agent: Agente principale
869
+ overflow_notice_html: "%{count} eventi non sono stati attribuiti a nessuna
870
+ regola perché il buffer del tracker era pieno. Aumenta %{option} per acquisirne
871
+ di più."
856
872
  match_type:
857
873
  blocklist: blocklist
858
874
  throttle: throttle
@@ -1092,6 +1108,10 @@ it:
1092
1108
  sampling_rate: Percentuale di errori acquisiti
1093
1109
  application_name: Nome di questa applicazione (rilevato automaticamente se
1094
1110
  non impostato)
1111
+ environment: Ambiente a cui vengono attribuiti gli errori (Rails.env se non
1112
+ impostato)
1113
+ notification_environments: Notifica solo per questi ambienti (tutti se non
1114
+ impostato)
1095
1115
  database: Database attivo per i registri degli errori
1096
1116
  use_separate_database: Usa un DB dedicato per i registri degli errori
1097
1117
  user_model: Nome del modello per le associazioni con gli utenti (rilevato
@@ -1264,11 +1284,14 @@ it:
1264
1284
  unknown_application: Sconosciuta
1265
1285
  error_alert:
1266
1286
  subject: "\U0001F6A8 [%{application}] %{error_type}: %{message}"
1287
+ subject_with_environment: "\U0001F6A8 [%{application} · %{environment}] %{error_type}:
1288
+ %{message}"
1267
1289
  heading: "\U0001F6A8 Avviso di errore"
1268
1290
  labels:
1269
1291
  application: Applicazione
1270
1292
  error_type: Tipo di errore
1271
1293
  platform: Piattaforma
1294
+ environment: Ambiente
1272
1295
  occurred_at: Data e ora
1273
1296
  user_id: ID utente
1274
1297
  ip_address: Indirizzo IP
@@ -1337,6 +1360,7 @@ it:
1337
1360
  application: Applicazione
1338
1361
  error_type: Tipo di errore
1339
1362
  platform: Piattaforma
1363
+ environment: Ambiente
1340
1364
  occurred: Verificatosi
1341
1365
  message: Messaggio
1342
1366
  user: Utente
@@ -1672,6 +1696,10 @@ it:
1672
1696
  platform_chart:
1673
1697
  title: Errori per piattaforma
1674
1698
  quick_links: 'Collegamenti rapidi:'
1699
+ environment_chart:
1700
+ title: Errori per ambiente
1701
+ quick_links: 'Collegamenti rapidi:'
1702
+ unknown: Sconosciuto
1675
1703
  type_chart:
1676
1704
  title: I 10 tipi di errore più frequenti
1677
1705
  hour_chart:
@@ -2056,5 +2084,6 @@ it:
2056
2084
  axis_count: Conteggio
2057
2085
  axis_number_of_errors: Numero di errori
2058
2086
  axis_hours: Ore
2087
+ suffix_hours: " ore"
2059
2088
  series_total_errors: Errori totali
2060
2089
  series_hours_to_resolve: Ore per la risoluzione