pgbus 0.17.1 → 0.17.2

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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/README.md +48 -13
  4. data/app/controllers/concerns/pgbus/job_listing.rb +37 -0
  5. data/app/controllers/concerns/pgbus/process_listing.rb +17 -0
  6. data/app/controllers/pgbus/application_controller.rb +5 -2
  7. data/app/controllers/pgbus/batches_controller.rb +4 -1
  8. data/app/controllers/pgbus/dashboard_controller.rb +20 -6
  9. data/app/controllers/pgbus/dead_letter_controller.rb +27 -3
  10. data/app/controllers/pgbus/events_controller.rb +52 -3
  11. data/app/controllers/pgbus/insights_controller.rb +19 -1
  12. data/app/controllers/pgbus/jobs_controller.rb +45 -26
  13. data/app/controllers/pgbus/locks_controller.rb +7 -2
  14. data/app/controllers/pgbus/outbox_controller.rb +4 -1
  15. data/app/controllers/pgbus/processes_controller.rb +3 -1
  16. data/app/controllers/pgbus/queues_controller.rb +16 -4
  17. data/app/controllers/pgbus/recurring_tasks_controller.rb +5 -7
  18. data/app/frontend/pgbus/modules/charts.js +119 -77
  19. data/app/frontend/pgbus/style.css +1 -1
  20. data/app/frontend/pgbus/tailwind.css +18 -0
  21. data/app/helpers/pgbus/application_helper.rb +155 -113
  22. data/app/helpers/pgbus/button_helper.rb +88 -0
  23. data/app/helpers/pgbus/dashboard_helper.rb +157 -0
  24. data/app/helpers/pgbus/events_helper.rb +40 -0
  25. data/app/helpers/pgbus/insights_helper.rb +39 -0
  26. data/app/helpers/pgbus/processes_helper.rb +79 -0
  27. data/app/views/pgbus/batches/_batches_table.html.erb +16 -13
  28. data/app/views/pgbus/batches/show.html.erb +3 -4
  29. data/app/views/pgbus/dashboard/_processes_table.html.erb +11 -11
  30. data/app/views/pgbus/dashboard/_queue_health.html.erb +42 -51
  31. data/app/views/pgbus/dashboard/_queues_table.html.erb +18 -16
  32. data/app/views/pgbus/dashboard/_recent_failures.html.erb +16 -12
  33. data/app/views/pgbus/dashboard/_stats_cards.html.erb +70 -36
  34. data/app/views/pgbus/dashboard/show.html.erb +1 -1
  35. data/app/views/pgbus/dead_letter/_error.html.erb +13 -0
  36. data/app/views/pgbus/dead_letter/_messages_table.html.erb +37 -96
  37. data/app/views/pgbus/dead_letter/_row.html.erb +75 -0
  38. data/app/views/pgbus/dead_letter/index.html.erb +6 -9
  39. data/app/views/pgbus/dead_letter/show.html.erb +37 -21
  40. data/app/views/pgbus/events/_list.html.erb +55 -0
  41. data/app/views/pgbus/events/_processed_table.html.erb +45 -0
  42. data/app/views/pgbus/events/_replay.html.erb +10 -0
  43. data/app/views/pgbus/events/_row.html.erb +162 -0
  44. data/app/views/pgbus/events/_tabs.html.erb +13 -0
  45. data/app/views/pgbus/events/index.html.erb +27 -48
  46. data/app/views/pgbus/events/show.html.erb +25 -7
  47. data/app/views/pgbus/insights/_chart_card.html.erb +21 -0
  48. data/app/views/pgbus/insights/_latency_table.html.erb +20 -0
  49. data/app/views/pgbus/insights/_status_table.html.erb +19 -0
  50. data/app/views/pgbus/insights/_throughput_table.html.erb +18 -0
  51. data/app/views/pgbus/insights/show.html.erb +83 -100
  52. data/app/views/pgbus/jobs/_list.html.erb +64 -0
  53. data/app/views/pgbus/jobs/_row.html.erb +107 -0
  54. data/app/views/pgbus/jobs/_tabs.html.erb +14 -0
  55. data/app/views/pgbus/jobs/index.html.erb +10 -10
  56. data/app/views/pgbus/jobs/show.html.erb +18 -20
  57. data/app/views/pgbus/locks/_concurrency.html.erb +25 -23
  58. data/app/views/pgbus/locks/_uniqueness.html.erb +20 -22
  59. data/app/views/pgbus/outbox/index.html.erb +30 -27
  60. data/app/views/pgbus/processes/_processes_table.html.erb +6 -25
  61. data/app/views/pgbus/processes/_row.html.erb +48 -0
  62. data/app/views/pgbus/processes/_status.html.erb +4 -0
  63. data/app/views/pgbus/queues/_queues_list.html.erb +28 -32
  64. data/app/views/pgbus/queues/show.html.erb +69 -118
  65. data/app/views/pgbus/recurring_tasks/_tasks_table.html.erb +75 -76
  66. data/app/views/pgbus/recurring_tasks/index.html.erb +1 -1
  67. data/app/views/pgbus/recurring_tasks/show.html.erb +45 -51
  68. data/app/views/pgbus/shared/_empty_row.html.erb +2 -0
  69. data/app/views/pgbus/shared/_pager.html.erb +34 -0
  70. data/config/i18n-tasks.yml +11 -2
  71. data/config/locales/da.yml +405 -113
  72. data/config/locales/de.yml +405 -113
  73. data/config/locales/en.yml +405 -113
  74. data/config/locales/es.yml +404 -112
  75. data/config/locales/fi.yml +404 -112
  76. data/config/locales/fr.yml +406 -114
  77. data/config/locales/it.yml +405 -113
  78. data/config/locales/ja.yml +405 -113
  79. data/config/locales/nb.yml +405 -113
  80. data/config/locales/nl.yml +405 -113
  81. data/config/locales/pt.yml +406 -114
  82. data/config/locales/sv.yml +404 -112
  83. data/lib/generators/pgbus/templates/initializer.rb.erb +4 -0
  84. data/lib/pgbus/active_job/executor.rb +16 -6
  85. data/lib/pgbus/cli/dlq.rb +32 -5
  86. data/lib/pgbus/client.rb +4 -2
  87. data/lib/pgbus/configuration.rb +47 -2
  88. data/lib/pgbus/dead_letter_header.rb +129 -0
  89. data/lib/pgbus/doctor.rb +8 -4
  90. data/lib/pgbus/event_bus/handler.rb +18 -11
  91. data/lib/pgbus/event_bus/registry.rb +6 -0
  92. data/lib/pgbus/failed_event_recorder.rb +34 -0
  93. data/lib/pgbus/instrumentation.rb +2 -1
  94. data/lib/pgbus/mcp/base_tool.rb +25 -0
  95. data/lib/pgbus/mcp/tools/concurrency_tool.rb +23 -4
  96. data/lib/pgbus/mcp/tools/dlq_detail_tool.rb +4 -2
  97. data/lib/pgbus/mcp/tools/dlq_tool.rb +10 -4
  98. data/lib/pgbus/mcp/tools/locks_tool.rb +23 -5
  99. data/lib/pgbus/mcp/tools/recurring_tool.rb +33 -4
  100. data/lib/pgbus/outbox/poller.rb +1 -1
  101. data/lib/pgbus/process/consumer.rb +53 -3
  102. data/lib/pgbus/process/dispatcher.rb +1 -1
  103. data/lib/pgbus/process/supervisor.rb +32 -11
  104. data/lib/pgbus/process/worker.rb +45 -8
  105. data/lib/pgbus/recurring/scheduler.rb +2 -1
  106. data/lib/pgbus/version.rb +1 -1
  107. data/lib/pgbus/web/data_source/dashboard_signals.rb +170 -0
  108. data/lib/pgbus/web/data_source/dead_letter.rb +142 -0
  109. data/lib/pgbus/web/data_source/event_list.rb +161 -0
  110. data/lib/pgbus/web/data_source/job_list.rb +323 -0
  111. data/lib/pgbus/web/data_source/list_counts.rb +80 -0
  112. data/lib/pgbus/web/data_source/process_list.rb +69 -0
  113. data/lib/pgbus/web/data_source/queue_summary.rb +122 -0
  114. data/lib/pgbus/web/data_source.rb +132 -254
  115. data/lib/pgbus/web/dead_letter_reason.rb +81 -0
  116. data/lib/pgbus/web/event_state.rb +71 -0
  117. data/lib/pgbus/web/health_app.rb +7 -3
  118. data/lib/pgbus/web/health_verdict.rb +78 -0
  119. data/lib/pgbus/web/insights_charts.rb +84 -0
  120. data/lib/pgbus/web/job_state.rb +111 -0
  121. data/lib/pgbus/web/process_activity.rb +97 -0
  122. data/lib/pgbus/web/process_state.rb +187 -0
  123. data/lib/pgbus/web/queue_summary.rb +104 -0
  124. data/lib/pgbus/web/time_format.rb +128 -0
  125. metadata +43 -4
  126. data/app/views/pgbus/events/_pending_table.html.erb +0 -169
  127. data/app/views/pgbus/jobs/_enqueued_table.html.erb +0 -118
  128. data/app/views/pgbus/jobs/_failed_table.html.erb +0 -76
@@ -41,6 +41,7 @@ it:
41
41
  title: Processi attivi
42
42
  queue_health:
43
43
  dead_tuples: Tuple morte
44
+ empty: Ancora nessuna tabella di coda da misurare
44
45
  headers:
45
46
  bloat: Bloat
46
47
  dead: Morte
@@ -60,14 +61,34 @@ it:
60
61
  one: "%{count} tabella necessita di vacuum"
61
62
  other: "%{count} tabelle necessitano di vacuum"
62
63
  title: Salute delle Code
64
+ words:
65
+ bloat:
66
+ critical: "%{ratio} su %{table} — le letture rallentano; esegui subito il vacuum (critico oltre %{critical}, avviso oltre %{warn})"
67
+ none: Ancora nulla da misurare
68
+ ok: "%{ratio} su %{table} — ok (avviso oltre %{warn}, critico oltre %{critical})"
69
+ warn: "%{ratio} su %{table} — vacuum necessario (avviso oltre %{warn}, critico oltre %{critical})"
70
+ dead_tuples:
71
+ ok: Ok — avviso oltre %{limit} righe morte
72
+ warn: Oltre %{limit} — l'autovacuum è in ritardo; la tabella qui sotto mostra dove
73
+ transaction:
74
+ critical: Oltre %{critical} — il vacuum non può recuperare righe finché non termina; trovala in pg_stat_activity (avviso a %{warn}; il verdetto di salute peggiora dopo %{verdict})
75
+ none: Nessuna transazione aperta — il vacuum può recuperare ogni riga morta (avviso a %{warn}, allarme a %{critical}; il verdetto di salute peggiora dopo %{verdict})
76
+ ok: Ok — avviso a %{warn}, allarme a %{critical}; il verdetto di salute peggiora dopo %{verdict}
77
+ warn: Oltre %{warn} — una transazione lunga impedisce al vacuum di recuperare righe (allarme a %{critical}; il verdetto di salute peggiora dopo %{verdict})
78
+ vacuum:
79
+ critical: Oltre %{critical} — l'autovacuum non raggiunge queste tabelle; controlla le sue impostazioni (avviso dopo %{warn})
80
+ ok: Ok — avviso dopo %{warn}, critico dopo %{critical}
81
+ unknown: Mai sottoposta a vacuum, oppure le statistiche non sono disponibili
82
+ warn: Oltre %{warn} — l'autovacuum potrebbe essere in ritardo (critico dopo %{critical})
63
83
  worst_bloat: Peggior Bloat
64
84
  queues_table:
65
85
  empty: Nessuna coda trovata
66
86
  headers:
67
87
  depth: Profondità
68
- oldest_claimable: Più vecchio disponibile (s)
88
+ oldest_claimable: Più vecchio disponibile
69
89
  parked: Posticipati
70
90
  queue: Coda
91
+ status: Stato
71
92
  total: Totale
72
93
  visible: Visibile
73
94
  title: Code
@@ -75,7 +96,9 @@ it:
75
96
  recent_failures:
76
97
  empty: Nessun errore
77
98
  headers:
99
+ attempt: Tentativo
78
100
  error: Errore
101
+ job: Job
79
102
  queue: Coda
80
103
  when: Quando
81
104
  title: Errori recenti
@@ -83,19 +106,72 @@ it:
83
106
  show:
84
107
  title: Cruscotto
85
108
  stats_cards:
109
+ dead_lettered: In dead-letter
110
+ dlq_newest_html: 'più recente: %{error_class} in %{job} %{ago}'
111
+ dlq_newest_legacy_html: 'più recente: %{job} %{ago} — nessun motivo registrato'
112
+ dlq_newest_no_error_html: 'più recente: %{job} %{ago} — nessun errore registrato'
113
+ dlq_none: Nulla in dead-letter
114
+ dlq_see_why: apri la pagina dead-letter per vedere perché ciascuno è morto
86
115
  enqueued: In coda
87
- failed_dlq: Falliti / DLQ
88
- failed_dlq_labels: Falliti / Dead Lettered
116
+ enqueued_detail: "%{claimable} disponibili ora · %{waiting} pianificati, in esecuzione o in ripetizione"
117
+ enqueued_paused:
118
+ one: "%{count} in code in pausa"
119
+ other: "%{count} in code in pausa"
89
120
  parked_jobs: Job parcheggiati
90
121
  parked_jobs_oldest: il più vecchio %{age}
91
122
  processes: Processi
123
+ processes_detail: "%{healthy} sani · %{stalled} bloccati · %{stale} obsoleti"
124
+ processes_none: Nulla è in esecuzione — nessun job viene preso in carico
125
+ processes_stale: i processi obsoleti hanno smesso di inviare l'heartbeat; i loro job in corso vengono rieseguiti alla scadenza del visibility timeout
92
126
  queues: Code
127
+ queues_detail: "%{paused} in pausa · %{dlq} in dead-letter"
128
+ queues_undrained:
129
+ one: "%{count} contiene job che nessuno svuota"
130
+ other: "%{count} contengono job che nessuno svuota"
93
131
  recurring: Ricorrente
132
+ recurring_detail: Attività che lo scheduler mette in coda secondo la pianificazione
133
+ retrying: In ripetizione
134
+ retrying_due:
135
+ one: "%{count} da eseguire ora"
136
+ other: "%{count} da eseguire ora"
137
+ retrying_newest: errore più recente %{error_class}
138
+ retrying_next_html: prossimo tentativo %{time}
139
+ retrying_none: Nulla è in ripetizione
94
140
  throughput: Throughput
95
- throughput_unit: msg/s
96
- view_tasks: Visualizza attività
97
- visible: visibile
141
+ throughput_detail: lavori/min negli ultimi %{minutes} min
142
+ throughput_unavailable: richiede le statistiche dei job (rails g pgbus:add_job_stats)
143
+ verdict:
144
+ links:
145
+ dlq: Dead letter
146
+ processes: Processi
147
+ look_at: 'Da controllare:'
148
+ meaning:
149
+ degraded: Qualcosa richiede attenzione, ma i job scorrono ancora. /readyz risponde ancora pronto.
150
+ ok: Ogni coda con lavoro in sospeso viene svuotata e ogni processo invia l'heartbeat. /readyz risponde pronto.
151
+ stalled: Ci sono job in attesa e nessuno li prende in carico. /readyz risponde non pronto (503).
152
+ statuses:
153
+ degraded: DEGRADED
154
+ ok: OK
155
+ stalled: STALLED
156
+ title: 'Salute: %{status}'
157
+ unavailable: Verdetto di salute non disponibile — non è stato possibile leggere i controlli su cui si basa; vedi il log
98
158
  dead_letter:
159
+ detail:
160
+ backtrace: Backtrace (prime righe)
161
+ died: 'Morto:'
162
+ dlq: 'Coda dei messaggi morti:'
163
+ error_from_attempt: Errore dal tentativo %{attempt}; i tentativi %{from}–%{to} non hanno registrato errori.
164
+ source: 'Spostato da:'
165
+ sources:
166
+ consumer: consumer di eventi
167
+ worker: worker di job
168
+ why: Perché è morto
169
+ filters:
170
+ all: Tutte
171
+ clear_error_class: Rimuovi filtro
172
+ error_class: 'Errore: %{error_class}'
173
+ filter_error_class: Mostra solo %{error_class}
174
+ label: Filtra i messaggi morti
99
175
  index:
100
176
  discard_all: Scarta tutto
101
177
  discard_all_confirm: Scartare definitivamente tutti i messaggi DLQ?
@@ -115,11 +191,13 @@ it:
115
191
  empty: La coda di lettere morte è vuota
116
192
  full_json_payload: Payload JSON completo
117
193
  headers:
118
- enqueued: In coda
194
+ actions: Azioni
195
+ attempts: Tentativi
196
+ died: Morto
119
197
  id: ID
120
- job_class: Classe lavoro
121
- reads: Letture
122
- source_queue: Coda sorgente
198
+ job: Job
199
+ reason: Motivo
200
+ source_queue: Coda di origine
123
201
  headers_section: Intestazioni
124
202
  job_id: 'ID lavoro:'
125
203
  metadata: Metadati
@@ -131,6 +209,16 @@ it:
131
209
  visible_at: 'Visibile alle:'
132
210
  retry: Riprova
133
211
  total_label: messaggi nella coda dei messaggi non recapitati
212
+ view: Vedi
213
+ reasons:
214
+ error_earlier_attempt_html: 'Tentativi esauriti. Ultimo errore registrato, dal tentativo %{error_attempt}: %{error_class}: %{error_message}'
215
+ error_html: 'Tentativi esauriti. Ultimo errore: %{error_class}: %{error_message}'
216
+ event_no_error_html: L'handler è fallito su %{attempts} consegne (max %{max}) — nessun errore dell'handler registrato
217
+ no_error_recorded_html: Superati %{max} tentativi dopo %{attempts} letture — nessun errore registrato; ogni tentativo fallito si è interrotto prima di poterlo segnalare
218
+ not_recorded_html: Motivo non registrato (spostato nella DLQ prima di pgbus %{version})
219
+ retried_before:
220
+ one: Già riprovato dalla DLQ una volta.
221
+ other: Già riprovato dalla DLQ %{count} volte.
134
222
  show:
135
223
  back: Torna a DLQ
136
224
  context: Contesto
@@ -138,8 +226,10 @@ it:
138
226
  discard_confirm: Scartare definitivamente?
139
227
  headers: Intestazioni
140
228
  labels:
229
+ attempts: Tentativi
230
+ died: Morto
231
+ dlq: Coda dei messaggi morti
141
232
  enqueued_at: Inserito alle
142
- read_count: Conteggio letture
143
233
  source_queue: Coda di origine
144
234
  visibility_timeout: Timeout di visibilità
145
235
  not_found: Messaggio non trovato
@@ -163,6 +253,7 @@ it:
163
253
  mark_handled_failed: Impossibile contrassegnare l'evento come gestito.
164
254
  marked_handled: Evento contrassegnato come gestito.
165
255
  none_selected: Nessun evento selezionato.
256
+ payload_redacted: 'Non salvato: il payload contiene ancora valori oscurati ([FILTERED]) che sostituirebbero quelli reali.'
166
257
  payload_update_failed: Impossibile aggiornare il payload. Verifica che il JSON sia valido.
167
258
  payload_updated: Payload aggiornato ed evento reinserito in coda.
168
259
  replay_failed: Evento non trovato o non riproducibile.
@@ -170,56 +261,118 @@ it:
170
261
  reroute_failed: Impossibile reindirizzare l'evento.
171
262
  rerouted: Evento reindirizzato al gestore di destinazione.
172
263
  index:
173
- discard_selected: Scarta selezionati
174
- discard_selected_confirm: Scartare gli eventi selezionati?
175
- pending_empty: Nessun evento in sospeso
176
- pending_headers:
177
- enqueued: In coda
178
- handler_queue: Coda del gestore
179
- id: ID
180
- reads: Letture
181
- routing_key: Chiave di routing
182
264
  pending_title: Eventi in sospeso
183
- processed_empty: Nessun evento elaborato ancora
184
- processed_headers:
185
- event_id: ID evento
186
- handler: Gestore
187
- processed_at: Elaborato alle
188
265
  processed_title: Eventi elaborati
266
+ subscribers:
267
+ covered: Elaborato da un consumer in esecuzione
268
+ uncovered: Nessun consumer in esecuzione copre questo pattern
269
+ unknown: Copertura dei consumer sconosciuta
270
+ view_pending: Mostra in attesa
189
271
  subscribers_empty: Nessun iscritto registrato
190
272
  subscribers_headers:
273
+ consumer: Consumer
191
274
  handler: Gestore
192
275
  pattern: Modello
276
+ pending: In attesa
193
277
  queue: Coda
194
278
  subscribers_title: Iscritti registrati
195
279
  title: Eventi
196
- pending_table:
197
- arguments: Payload
280
+ list:
198
281
  context: Contesto
199
282
  discard: Scarta
200
283
  discard_confirm: Scartare questo evento? Verrà archiviato.
284
+ discard_failure_confirm: Scartare questo evento fallito? Il suo messaggio non è più nella coda.
285
+ discard_selected: Scarta selezionati
286
+ discard_selected_confirm: Scartare gli eventi selezionati?
201
287
  edit_payload: Modifica e riprova
202
288
  edit_payload_confirm: Aggiornare il payload e reinserire questo evento in coda?
203
289
  edit_payload_label: 'Payload JSON:'
290
+ empty:
291
+ all: Nessun evento in sospeso
292
+ ready: Nessun evento in attesa di essere gestito
293
+ retrying: Nessun evento in attesa di un nuovo tentativo
294
+ running: Nessun evento in gestione
295
+ scheduled: Nessun evento pianificato
204
296
  event_id: 'ID evento:'
205
297
  full_json_payload: Payload JSON completo
298
+ headers:
299
+ actions: Azioni
300
+ attempts: Tentativi
301
+ event: Evento
302
+ handler: Gestore
303
+ id: ID
304
+ reason: Prossima esecuzione / Motivo
305
+ state: Stato
206
306
  headers_section: Intestazioni
207
307
  mark_handled: Contrassegna come gestito
208
- mark_handled_confirm: Contrassegnare questo evento come gestito? Verrà archiviato e saltato durante la riproduzione.
308
+ mark_handled_confirm: Segnare questo evento come gestito? Il messaggio viene archiviato e l'handler non lo esegue.
209
309
  metadata: Metadati
210
310
  metadata_labels:
311
+ enqueued: 'Accodato:'
211
312
  last_read: 'Ultima lettura:'
313
+ published: 'Pubblicato:'
212
314
  read_count: 'Conteggio letture:'
213
315
  visible_at: 'Visibile il:'
316
+ payload: Payload
317
+ reasons:
318
+ handling_html: In gestione da %{handler} — prelevato %{ago} · il lease scade %{time}
319
+ lease_expired_html: Lease scaduto (il consumer è probabilmente morto) — nuova consegna a %{handler}, tentativo %{attempt}
320
+ no_consumer_for_queue_html: Nessun consumer in esecuzione è iscritto a %{pattern} (%{handler})
321
+ no_consumers_html: Nessun consumer sano in esecuzione
322
+ orphaned_html: Fallito con %{error} in %{handler} — il messaggio non è più nella coda
323
+ paused_html: Coda in pausa
324
+ retrying_dlq_html: "%{handler} tentativo %{attempt}/%{max} fallito: %{error} — la prossima lettura lo sposta nella DLQ"
325
+ retrying_due_html: "%{handler} tentativo %{attempt}/%{max} fallito: %{error} — prossimo tentativo ora"
326
+ retrying_html: "%{handler} tentativo %{attempt}/%{max} fallito: %{error} — prossimo tentativo %{time}"
327
+ scheduled_html: Pianificato — gestito da %{handler} %{time}
328
+ waiting_html: 'In attesa — %{count} davanti · prossimo: %{handler}'
329
+ waiting_unknown_html: In attesa di %{handler}
214
330
  reroute: Reindirizza
215
331
  reroute_confirm: Reindirizzare questo evento a un gestore diverso?
216
332
  reroute_label: 'Gestore di destinazione:'
333
+ states:
334
+ ready: Pronto
335
+ retrying: In ripetizione
336
+ running: In gestione
337
+ scheduled: Pianificato
338
+ tabs:
339
+ all: Tutti
340
+ ready: Pronti
341
+ retrying: In ripetizione
342
+ running: In gestione
343
+ scheduled: Pianificati
344
+ tabs_label: Stati degli eventi
345
+ view_failure: Vedi errore
346
+ processed:
347
+ empty: Nessun evento elaborato ancora
348
+ headers:
349
+ actions: Azioni
350
+ event_id: ID evento
351
+ handler: Gestore
352
+ reason: Motivo
353
+ state: Stato
354
+ reasons:
355
+ abandoned_html: Il claim è rimasto in silenzio %{ago} — la prossima consegna riesegue l'handler
356
+ completed_html: Completato %{ago}
357
+ completed_legacy_html: Registrato %{ago} (claim a fase singola; aggiorna con pgbus:add_processed_event_completion)
358
+ handling_html: In gestione — claim aggiornato %{ago}
359
+ replay: Riproduci
360
+ replay_confirm: Riconsegnare questo evento al suo handler con un nuovo ID evento? L'handler viene eseguito di nuovo.
361
+ replay_unavailable:
362
+ no_handler: Handler non più registrato
363
+ not_archived: Non più nell'archivio
364
+ states:
365
+ abandoned: Silente
366
+ completed: Completato
367
+ handling: In gestione
217
368
  show:
218
369
  back: Torna agli eventi
219
370
  labels:
371
+ completed_at: Completato il
220
372
  event_id: ID evento
221
373
  handler: Gestore
222
374
  processed_at: Elaborato alle
375
+ state: Stato
223
376
  not_found: Evento non trovato
224
377
  title: Evento %{event_id}
225
378
  helpers:
@@ -231,6 +384,7 @@ it:
231
384
  bulk_select_row: Seleziona %{id}
232
385
  bulk_selected: selezionato
233
386
  pagination:
387
+ label: Paginazione
234
388
  next: Avanti
235
389
  previous: Indietro
236
390
  showing: Visualizzazione %{from}–%{to} di %{total}
@@ -245,24 +399,50 @@ it:
245
399
  healthy: Sano
246
400
  stale: Obsoleto
247
401
  stalled: Bloccato
402
+ time:
403
+ absolute_format: "%Y-%m-%d %H:%M:%S %Z"
404
+ clock_format: "%H:%M"
405
+ future: tra %{distance}
406
+ now: ora
407
+ past: "%{distance} fa"
408
+ range:
409
+ days:
410
+ one: "%{count} giorno"
411
+ other: "%{count} giorni"
412
+ hours:
413
+ one: "%{count} ora"
414
+ other: "%{count} ore"
415
+ minutes:
416
+ one: "%{count} minuto"
417
+ other: "%{count} minuti"
418
+ units:
419
+ days: "%{count}g"
420
+ hours: "%{count}h"
421
+ milliseconds: "%{count}ms"
422
+ minutes: "%{count}m"
423
+ seconds: "%{count}s"
248
424
  insights:
249
425
  show:
250
426
  charts:
251
- failed_to_load: Impossibile caricare i dati del grafico
252
- latency: Latenza in coda (ms)
427
+ captions:
428
+ latency: I job hanno atteso in media %{avg} prima che un worker li prendesse in carico, p95 %{p95}
429
+ status: "%{success} riusciti, %{failed} falliti, %{dead_lettered} in dead-letter"
430
+ throughput_html: "%{total} lavori negli ultimi %{range}, picco di %{peak} lavori/min %{at}"
431
+ data_table: Tabella dati
432
+ latency: Latenza in coda
253
433
  latency_avg: Media
254
434
  latency_p95: P95
255
435
  no_data: Nessun dato ancora
256
436
  series_name: Lavori/min
257
437
  status_distribution: Distribuzione stato
258
- throughput: Throughput (lavori/min)
438
+ throughput: Throughput
259
439
  description_html: Metriche di rendimento lavorativo per gli ultimi %{range}
260
440
  latency_by_queue:
261
441
  empty: Nessun dato di latenza disponibile
262
442
  headers:
263
- avg: Media (ms)
443
+ avg: Media
264
444
  count: Conteggio
265
- p95: P95 (ms)
445
+ p95: P95
266
446
  queue: Coda
267
447
  title: Latenza per coda
268
448
  live_streams:
@@ -282,6 +462,10 @@ it:
282
462
  job_class: Classe lavoro
283
463
  max: Massimo
284
464
  title: Classi di Lavoro Più Lente (durata media)
465
+ statuses:
466
+ dead_lettered: In dead-letter
467
+ failed: Falliti
468
+ success: Riusciti
285
469
  streams:
286
470
  summary:
287
471
  active: Attivo
@@ -310,6 +494,20 @@ it:
310
494
  p99_latency: Latenza P99
311
495
  succeeded: Riusciti
312
496
  total_jobs: Totale Lavori
497
+ tables:
498
+ captions:
499
+ latency_minute: Latenza in coda al minuto
500
+ latency_step: Latenza in coda per %{step}
501
+ status: Job per stato finale
502
+ throughput_minute: Job al minuto
503
+ throughput_step: Job per %{step}
504
+ headers:
505
+ avg: Media
506
+ from: Da
507
+ highest_p95: P95 massimo
508
+ jobs: Job
509
+ share: Quota
510
+ status: Stato
313
511
  time_ranges:
314
512
  1h: 1h
315
513
  24h: 24h
@@ -317,60 +515,87 @@ it:
317
515
  7d: 7g
318
516
  title: Approfondimenti
319
517
  jobs:
320
- enqueued_table:
518
+ index:
519
+ discard_all: Scarta Tutto
520
+ discard_all_confirm: Scartare tutti i lavori falliti?
521
+ discard_all_enqueued_notice: Scartati %{count} lavori in coda e rilasciati i relativi blocchi.
522
+ discard_selected: Scarta selezionati
523
+ discard_selected_confirm: Scartare gli elementi selezionati?
524
+ discarded_selected:
525
+ one: 1 elemento selezionato scartato.
526
+ other: "%{count} elementi selezionati scartati."
527
+ none_selected: Nessun elemento selezionato.
528
+ retry_all: Riprova Tutto
529
+ retry_all_confirm: Riprova tutti i lavori falliti?
530
+ title: Lavori
531
+ list:
321
532
  arguments: Argomenti
322
533
  discard: Scarta
323
- discard_all: Scarta tutti
324
- discard_all_confirm: Scartare tutti i lavori in coda e rilasciare i relativi blocchi? Questa azione non può essere annullata.
325
- discard_confirm: Scartare questo messaggio?
326
- empty: Nessun lavoro in coda
534
+ discard_all_enqueued: Scarta tutti quelli in coda
535
+ discard_all_enqueued_confirm: Scartare tutti i lavori in coda e rilasciare i relativi blocchi? Questa azione non può essere annullata.
536
+ discard_confirm: Scartare questo lavoro?
537
+ empty:
538
+ all: Nessun job
539
+ blocked: Nessun job bloccato da un limite di concorrenza
540
+ ready: Nessun job in attesa di esecuzione
541
+ retrying: Nessun job in attesa di ripetizione
542
+ running: Nessun job in esecuzione
543
+ scheduled: Nessun job pianificato
327
544
  full_json_payload: Payload JSON completo
328
545
  headers:
329
- enqueued: In coda
546
+ actions: Azioni
547
+ attempts: Tentativi
330
548
  id: ID
331
- job_class: Classe Lavoro
549
+ job: Job
332
550
  queue: Coda
333
- reads: Letture
551
+ reason: Prossima esecuzione / Motivo
552
+ state: Stato
334
553
  headers_section: Intestazioni
335
554
  job_id: 'ID Lavoro:'
336
555
  metadata: Metadati
337
556
  metadata_labels:
557
+ concurrency_key: 'Chiave di concorrenza:'
558
+ enqueued: 'Accodato:'
338
559
  last_read: 'Ultima lettura:'
339
560
  locale: 'Locale:'
340
561
  priority: 'Priorità:'
341
- queue: 'Coda:'
342
562
  scheduled: 'Programmato:'
343
563
  timezone: 'Fuso orario:'
344
564
  visible_at: 'Visibile alle:'
565
+ reasons:
566
+ blocked_html: In attesa di uno slot di concorrenza su %{key} (occupati %{held}/%{limit}) · parcheggiato %{ago}
567
+ blocked_no_slots_html: In attesa di uno slot di concorrenza su %{key} · parcheggiato %{ago}
568
+ lease_expired_html: Lease scaduto (probabilmente il worker è terminato) — riconsegna, tentativo %{attempt}
569
+ no_workers_html: Nessun worker integro in esecuzione
570
+ not_drained_html: Nessun worker elabora questa coda
571
+ orphaned_html: Fallito con %{error} — il messaggio non è più nella coda
572
+ paused_html: Coda in pausa
573
+ retrying_dlq_html: 'Tentativo %{attempt}/%{max} fallito: %{error} — la prossima lettura lo sposta nella DLQ'
574
+ retrying_due_html: 'Tentativo %{attempt}/%{max} fallito: %{error} — prossimo tentativo ora'
575
+ retrying_html: 'Tentativo %{attempt}/%{max} fallito: %{error} — prossimo tentativo %{time}'
576
+ running_html: Prelevato %{ago} · il lease scade %{time}
577
+ scheduled_html: Pianificato — viene eseguito %{time}
578
+ waiting_html: In attesa — %{count} davanti
579
+ waiting_priority_html: In attesa — %{count} davanti con questa priorità
580
+ waiting_unknown_html: In attesa di essere prelevato
345
581
  retry: Riprova
346
582
  retry_confirm: Reimpostare il timeout di visibilità e riprovare?
347
- title: Lavori in coda
348
- failed_table:
349
- discard: Scarta
350
- discard_confirm: Scartare questo lavoro?
351
- empty: Nessun lavoro fallito
352
- headers:
353
- actions: Azioni
354
- error: Errore
355
- failed: Fallito
356
- id: ID
357
- queue: Coda
358
- retries: Tentativi
359
- retry: Riprova
360
- title: Lavori Falliti
361
- index:
362
- discard_all: Scarta Tutto
363
- discard_all_confirm: Scartare tutti i lavori falliti?
364
- discard_all_enqueued_notice: Scartati %{count} lavori in coda e rilasciati i relativi blocchi.
365
- discard_selected: Scarta selezionati
366
- discard_selected_confirm: Scartare gli elementi selezionati?
367
- discarded_selected:
368
- one: 1 elemento selezionato scartato.
369
- other: "%{count} elementi selezionati scartati."
370
- none_selected: Nessun elemento selezionato.
371
- retry_all: Riprova Tutto
372
- retry_all_confirm: Riprova tutti i lavori falliti?
373
- title: Lavori
583
+ states:
584
+ blocked: Bloccato
585
+ ready: Pronto
586
+ retrying: In ripetizione
587
+ running: In esecuzione
588
+ scheduled: Pianificato
589
+ tabs:
590
+ all: Tutti
591
+ blocked: Bloccati
592
+ ready: Pronti
593
+ retrying: In ripetizione
594
+ running: In esecuzione
595
+ scheduled: Pianificati
596
+ tabs_label: Stati dei job
597
+ view_failure: Vedi errore
598
+ view_locks: Vedi i lock
374
599
  show:
375
600
  back: Torna ai Lavori
376
601
  backtrace: Traccia dello stack
@@ -423,6 +648,7 @@ it:
423
648
  other: Scartare i %{count} job parcheggiati dietro questa chiave? Non verranno mai eseguiti.
424
649
  empty: Nessuna chiave di concorrenza in uso
425
650
  headers:
651
+ actions: Azioni
426
652
  in_use: In uso
427
653
  key: Chiave
428
654
  lease: Lease
@@ -456,6 +682,7 @@ it:
456
682
  discard_selected_confirm: Scartare i blocchi selezionati?
457
683
  empty: Nessun blocco attivo
458
684
  headers:
685
+ actions: Azioni
459
686
  age: Età
460
687
  lock_key: Chiave di blocco
461
688
  msg_id: ID messaggio
@@ -483,8 +710,6 @@ it:
483
710
  pending: In sospeso
484
711
  published: Pubblicato
485
712
  stats:
486
- no_age: "—"
487
- oldest_age: "%{seconds}s"
488
713
  oldest_unpublished: Più vecchio non pubblicato
489
714
  total: Totale
490
715
  unpublished: Non pubblicato
@@ -493,18 +718,76 @@ it:
493
718
  index:
494
719
  title: Processi
495
720
  processes_table:
721
+ capsule: capsula %{capsule} · processo %{process}
496
722
  empty: Nessun processo in esecuzione
497
723
  headers:
498
- hostname: Nome host
499
- kind: Tipo
500
- last_heartbeat: Ultimo segnale di vita
501
- metadata: Metadati
502
- pid: PID
724
+ activity: Attività
725
+ heartbeat: Heartbeat
726
+ process: Processo
727
+ recycle: Riciclo
503
728
  status: Stato
504
- rates:
505
- dequeued: prelevati
506
- failed: falliti
507
- processed: elaborati
729
+ no_raw_metadata: Nessun altro metadato
730
+ raw_metadata: Altri metadati
731
+ started: Avviato
732
+ under_supervisor: sotto il supervisor %{pid}
733
+ uptime: attivo da %{duration}
734
+ state:
735
+ activity:
736
+ buffered: "%{number} in buffer"
737
+ busy_slots: "%{busy}/%{capacity} slot occupati"
738
+ busy_threads: "%{busy}/%{capacity} thread occupati"
739
+ consumes: Consuma %{topics}
740
+ drains: Svuota %{queues}
741
+ drains_all: Svuota tutte le code
742
+ failed_rate: "%{rate} falliti/s"
743
+ handled: "%{number} gestiti"
744
+ maintenance: Esegue la manutenzione ogni %{interval} (job pianificati, processi morti, archivi)
745
+ outbox: Pubblica le voci dell'outbox
746
+ rate: "%{rate} job/s"
747
+ schedule:
748
+ one: Esegue %{count} attività ricorrente, controlla ogni %{interval}
749
+ other: Esegue %{count} attività ricorrenti, controlla ogni %{interval}
750
+ slots:
751
+ one: "%{count} slot"
752
+ other: "%{count} slot"
753
+ supervises: Supervisiona %{children}
754
+ supervises_none: Non supervisiona processi su questo host
755
+ threads:
756
+ one: "%{count} thread"
757
+ other: "%{count} thread"
758
+ kinds:
759
+ consumer:
760
+ one: "%{count} consumer"
761
+ other: "%{count} consumer"
762
+ dispatcher:
763
+ one: dispatcher
764
+ other: "%{count} dispatcher"
765
+ outbox_poller:
766
+ one: poller dell'outbox
767
+ other: "%{count} poller dell'outbox"
768
+ scheduler:
769
+ one: scheduler
770
+ other: "%{count} scheduler"
771
+ worker:
772
+ one: "%{count} worker"
773
+ other: "%{count} worker"
774
+ next:
775
+ stale_reaped: probabilmente morto; rimosso al prossimo passaggio del dispatcher (entro %{within})
776
+ stale_unreaped: probabilmente morto; nessun dispatcher attivo per rimuoverlo
777
+ stalled_maintenance: job pianificati, pulizia dei processi morti e compattazione degli archivi non avanzano
778
+ stalled_schedule: le attività ricorrenti non vengono accodate
779
+ stalled_standalone: nessun supervisor per riavviarlo
780
+ stalled_supervised: il watchdog del supervisor lo riavvia
781
+ reasons:
782
+ healthy_detection_off_html: Heartbeat %{ago} (limite %{limit}) · rilevamento blocchi disattivato
783
+ healthy_heartbeat_html: Heartbeat %{ago} (limite %{limit})
784
+ healthy_loop_html: Ciclo avanzato %{ago} (limite %{limit})
785
+ stale_html: Nessun heartbeat da %{age} (limite %{limit})
786
+ stalled_html: Ciclo avanzato l'ultima volta %{ago} (limite %{limit})
787
+ recycle:
788
+ jobs: "%{done} / %{limit} job"
789
+ lifetime: attivo da %{uptime} / %{limit}
790
+ memory: "%{used} / %{limit} MB"
508
791
  queues:
509
792
  destroy:
510
793
  success: Coda %{name} eliminata.
@@ -517,59 +800,70 @@ it:
517
800
  headers:
518
801
  actions: Azioni
519
802
  depth: Profondità
520
- newest: Più recente (s)
521
- oldest_claimable: Più vecchio disponibile (s)
803
+ newest: Più recente
804
+ oldest_claimable: Più vecchio disponibile
522
805
  parked: Posticipati
523
806
  queue: Coda
524
807
  total_ever: Totale mai
525
808
  visible: Visibile
526
809
  pause: Pausa
527
810
  pause_confirm: Mettere in pausa l'elaborazione per %{name}?
528
- paused: In pausa
529
811
  purge: Pulisci
530
812
  purge_confirm: Eliminare tutti i messaggi da %{name}?
531
813
  resume: Riprendi
532
814
  show:
533
- arguments: Argomenti
534
815
  back: Torna alle code
535
816
  delete_confirm: Eliminare permanentemente questa coda? Questa azione non può essere annullata.
536
817
  delete_queue: Elimina coda
537
- depth: 'Profondità:'
538
- discard: Scarta
539
- discard_confirm: Scartare questo messaggio?
540
- empty: La coda è vuota
541
- full_json_payload: Payload JSON completo
542
- headers:
543
- enqueued: In coda
544
- id: ID
545
- job_class: Classe Lavoro
546
- reads: Letture
547
- vt: VT
548
- headers_section: Intestazioni
549
- job_id: 'ID Lavoro:'
818
+ dlq_link: Riprovali o scartali nella pagina Dead Letter
819
+ dlq_pointer:
820
+ one: Coda dei messaggi morti di %{logical} — %{count} messaggio.
821
+ other: Coda dei messaggi morti di %{logical} — %{count} messaggi.
550
822
  message_discard_failed: Impossibile scartare il messaggio.
551
823
  message_discarded: Messaggio scartato.
552
824
  message_retried: Visibilità del messaggio reimpostata.
553
825
  message_retry_failed: Impossibile riprovare il messaggio.
554
- metadata: Metadati
555
- metadata_labels:
556
- last_read: 'Ultima lettura:'
557
- locale: 'Locale:'
558
- priority: 'Priorità:'
559
- queue: 'Coda:'
560
- scheduled: 'Programmato:'
561
- timezone: 'Fuso orario:'
562
- visible_at: 'Visibile alle:'
563
- oldest: 'Più vecchio:'
564
- oldest_claimable: 'Più vecchio disponibile:'
565
- parked: 'Posticipati:'
826
+ metrics:
827
+ claimable: Prelevabili ora
828
+ depth: Profondità
829
+ oldest: Più vecchio
830
+ oldest_claimable: Più vecchio prelevabile
831
+ parked: Parcheggiati
832
+ total: Totale storico
833
+ other_levels: 'Altri livelli di priorità:'
566
834
  pause: Pausa
567
835
  pause_confirm: Mettere in pausa l'elaborazione?
568
836
  purge_confirm: Eliminare tutti i messaggi?
569
837
  purge_queue: Pulisci coda
570
838
  resume: Riprendi
571
- retry: Riprova
572
- retry_confirm: Reimpostare il timeout di visibilità e riprovare?
839
+ summary:
840
+ backlog_html: "%{visible} prelevabili ora, il più vecchio attende da %{age} · %{parked} parcheggiati (pianificati o in nuovo tentativo)"
841
+ backlog_parked_only_html: Niente di prelevabile ora · %{parked} parcheggiati (pianificati o in nuovo tentativo)
842
+ dlq_html: 'Coda dei messaggi morti di %{logical}: i job arrivano qui dopo %{max} tentativi falliti'
843
+ drained_by_html:
844
+ one: Svuotata da %{capsules} (%{count} worker sano)
845
+ other: Svuotata da %{capsules} (%{count} worker sani)
846
+ drained_live_html:
847
+ one: Svuotata da %{count} worker sano in ascolto su questa coda
848
+ other: Svuotata da %{count} worker sani in ascolto su questa coda
849
+ drained_wildcard_html:
850
+ one: Svuotata da una capsula di worker jolly (%{count} worker sano)
851
+ other: Svuotata da una capsula di worker jolly (%{count} worker sani)
852
+ empty_html: Niente in attesa
853
+ handler_html: Coda del gestore di eventi — svuotata dai consumer (%{count} sani)
854
+ no_consumers_html:
855
+ one: Coda del gestore di eventi senza consumer sano — %{count} evento in attesa
856
+ other: Coda del gestore di eventi senza consumer sano — %{count} eventi in attesa
857
+ no_workers_html:
858
+ one: Nessun worker sano in esecuzione — %{count} job è prelevabile ma nessuno lo preleva
859
+ other: Nessun worker sano in esecuzione — %{count} job sono prelevabili ma nessuno li preleva
860
+ not_drained_html: Nessuna capsula di worker svuota questa coda — i job attendono finché non ne viene configurata una
861
+ paused_circuit_breaker_html: Messa in pausa automaticamente %{ago} dopo %{failures} errori consecutivi — riprende %{time} (intervento n.%{trip})
862
+ paused_operator_html: In pausa %{ago} — %{reason}
863
+ paused_operator_no_reason_html: Messa in pausa %{ago} da un operatore
864
+ priority_level_html: Livello di priorità %{level} di %{logical}
865
+ stream_html: Coda di stream — consegnata tramite peek, non svuotata dai worker
866
+ summary_label: Riepilogo della coda
573
867
  table_health:
574
868
  headers:
575
869
  bloat: Bloat
@@ -579,8 +873,6 @@ it:
579
873
  table: Tabella
580
874
  oldest_txn: 'Transazione aperta più vecchia:'
581
875
  title: Salute delle Tabelle
582
- total: 'Totale:'
583
- visible: 'Visibile:'
584
876
  recurring_tasks:
585
877
  index:
586
878
  task_count: