pgbus 0.17.1 → 0.17.3

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 (156) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/README.md +83 -13
  4. data/Rakefile +26 -0
  5. data/app/assets/javascripts/pgbus/stream_source_element.js +34 -2
  6. data/app/assets/javascripts/pgbus/stream_source_element.min.js +6 -0
  7. data/app/assets/javascripts/pgbus/stream_source_element.min.js.map +1 -0
  8. data/app/controllers/concerns/pgbus/job_listing.rb +37 -0
  9. data/app/controllers/concerns/pgbus/process_listing.rb +17 -0
  10. data/app/controllers/pgbus/application_controller.rb +5 -2
  11. data/app/controllers/pgbus/batches_controller.rb +4 -1
  12. data/app/controllers/pgbus/dashboard_controller.rb +20 -6
  13. data/app/controllers/pgbus/dead_letter_controller.rb +27 -3
  14. data/app/controllers/pgbus/events_controller.rb +52 -3
  15. data/app/controllers/pgbus/frontends_controller.rb +25 -11
  16. data/app/controllers/pgbus/insights_controller.rb +19 -1
  17. data/app/controllers/pgbus/jobs_controller.rb +45 -26
  18. data/app/controllers/pgbus/locks_controller.rb +7 -2
  19. data/app/controllers/pgbus/outbox_controller.rb +4 -1
  20. data/app/controllers/pgbus/processes_controller.rb +3 -1
  21. data/app/controllers/pgbus/queues_controller.rb +16 -4
  22. data/app/controllers/pgbus/recurring_tasks_controller.rb +5 -7
  23. data/app/frontend/pgbus/application.min.js +2 -0
  24. data/app/frontend/pgbus/application.min.js.map +1 -0
  25. data/app/frontend/pgbus/modules/charts.js +137 -77
  26. data/app/frontend/pgbus/modules/charts.min.js +2 -0
  27. data/app/frontend/pgbus/modules/charts.min.js.map +1 -0
  28. data/app/frontend/pgbus/style.css +1 -1
  29. data/app/frontend/pgbus/tailwind.css +18 -0
  30. data/app/frontend/pgbus/vendor/turbo.min.js +54 -0
  31. data/app/frontend/pgbus/vendor/turbo.min.js.map +1 -0
  32. data/app/helpers/pgbus/application_helper.rb +155 -113
  33. data/app/helpers/pgbus/button_helper.rb +88 -0
  34. data/app/helpers/pgbus/dashboard_helper.rb +157 -0
  35. data/app/helpers/pgbus/events_helper.rb +40 -0
  36. data/app/helpers/pgbus/insights_helper.rb +39 -0
  37. data/app/helpers/pgbus/processes_helper.rb +79 -0
  38. data/app/views/layouts/pgbus/application.html.erb +0 -1
  39. data/app/views/pgbus/batches/_batches_table.html.erb +16 -13
  40. data/app/views/pgbus/batches/show.html.erb +3 -4
  41. data/app/views/pgbus/dashboard/_processes_table.html.erb +11 -11
  42. data/app/views/pgbus/dashboard/_queue_health.html.erb +42 -51
  43. data/app/views/pgbus/dashboard/_queues_table.html.erb +18 -16
  44. data/app/views/pgbus/dashboard/_recent_failures.html.erb +16 -12
  45. data/app/views/pgbus/dashboard/_stats_cards.html.erb +70 -36
  46. data/app/views/pgbus/dashboard/show.html.erb +1 -1
  47. data/app/views/pgbus/dead_letter/_error.html.erb +13 -0
  48. data/app/views/pgbus/dead_letter/_messages_table.html.erb +37 -96
  49. data/app/views/pgbus/dead_letter/_row.html.erb +75 -0
  50. data/app/views/pgbus/dead_letter/index.html.erb +6 -9
  51. data/app/views/pgbus/dead_letter/show.html.erb +37 -21
  52. data/app/views/pgbus/events/_list.html.erb +55 -0
  53. data/app/views/pgbus/events/_processed_table.html.erb +45 -0
  54. data/app/views/pgbus/events/_replay.html.erb +10 -0
  55. data/app/views/pgbus/events/_row.html.erb +162 -0
  56. data/app/views/pgbus/events/_tabs.html.erb +13 -0
  57. data/app/views/pgbus/events/index.html.erb +27 -48
  58. data/app/views/pgbus/events/show.html.erb +25 -7
  59. data/app/views/pgbus/insights/_chart_card.html.erb +21 -0
  60. data/app/views/pgbus/insights/_latency_table.html.erb +20 -0
  61. data/app/views/pgbus/insights/_status_table.html.erb +19 -0
  62. data/app/views/pgbus/insights/_throughput_table.html.erb +18 -0
  63. data/app/views/pgbus/insights/show.html.erb +83 -100
  64. data/app/views/pgbus/jobs/_list.html.erb +64 -0
  65. data/app/views/pgbus/jobs/_row.html.erb +107 -0
  66. data/app/views/pgbus/jobs/_tabs.html.erb +14 -0
  67. data/app/views/pgbus/jobs/index.html.erb +10 -10
  68. data/app/views/pgbus/jobs/show.html.erb +18 -20
  69. data/app/views/pgbus/locks/_concurrency.html.erb +25 -23
  70. data/app/views/pgbus/locks/_uniqueness.html.erb +20 -22
  71. data/app/views/pgbus/outbox/index.html.erb +30 -27
  72. data/app/views/pgbus/processes/_processes_table.html.erb +6 -25
  73. data/app/views/pgbus/processes/_row.html.erb +48 -0
  74. data/app/views/pgbus/processes/_status.html.erb +4 -0
  75. data/app/views/pgbus/queues/_queues_list.html.erb +28 -32
  76. data/app/views/pgbus/queues/show.html.erb +69 -118
  77. data/app/views/pgbus/recurring_tasks/_tasks_table.html.erb +75 -76
  78. data/app/views/pgbus/recurring_tasks/index.html.erb +1 -1
  79. data/app/views/pgbus/recurring_tasks/show.html.erb +45 -51
  80. data/app/views/pgbus/shared/_empty_row.html.erb +2 -0
  81. data/app/views/pgbus/shared/_pager.html.erb +34 -0
  82. data/config/i18n-tasks.yml +11 -2
  83. data/config/locales/da.yml +405 -113
  84. data/config/locales/de.yml +405 -113
  85. data/config/locales/en.yml +405 -113
  86. data/config/locales/es.yml +404 -112
  87. data/config/locales/fi.yml +404 -112
  88. data/config/locales/fr.yml +406 -114
  89. data/config/locales/it.yml +405 -113
  90. data/config/locales/ja.yml +405 -113
  91. data/config/locales/nb.yml +405 -113
  92. data/config/locales/nl.yml +405 -113
  93. data/config/locales/pt.yml +406 -114
  94. data/config/locales/sv.yml +404 -112
  95. data/config/routes.rb +1 -1
  96. data/lib/generators/pgbus/add_presence_generator.rb +2 -1
  97. data/lib/generators/pgbus/add_presence_seats_generator.rb +45 -0
  98. data/lib/generators/pgbus/templates/add_presence.rb.erb +32 -7
  99. data/lib/generators/pgbus/templates/add_presence_seats.rb.erb +38 -0
  100. data/lib/generators/pgbus/templates/initializer.rb.erb +4 -0
  101. data/lib/pgbus/active_job/executor.rb +16 -6
  102. data/lib/pgbus/cli/dlq.rb +32 -5
  103. data/lib/pgbus/client.rb +4 -2
  104. data/lib/pgbus/configuration/presence_settings.rb +103 -0
  105. data/lib/pgbus/configuration.rb +51 -2
  106. data/lib/pgbus/dead_letter_header.rb +129 -0
  107. data/lib/pgbus/doctor.rb +8 -4
  108. data/lib/pgbus/engine.rb +13 -7
  109. data/lib/pgbus/event_bus/handler.rb +18 -11
  110. data/lib/pgbus/event_bus/registry.rb +6 -0
  111. data/lib/pgbus/failed_event_recorder.rb +34 -0
  112. data/lib/pgbus/generators/migration_detector.rb +9 -1
  113. data/lib/pgbus/instrumentation.rb +2 -1
  114. data/lib/pgbus/mcp/base_tool.rb +25 -0
  115. data/lib/pgbus/mcp/tools/concurrency_tool.rb +23 -4
  116. data/lib/pgbus/mcp/tools/dlq_detail_tool.rb +4 -2
  117. data/lib/pgbus/mcp/tools/dlq_tool.rb +10 -4
  118. data/lib/pgbus/mcp/tools/locks_tool.rb +23 -5
  119. data/lib/pgbus/mcp/tools/recurring_tool.rb +33 -4
  120. data/lib/pgbus/outbox/poller.rb +1 -1
  121. data/lib/pgbus/process/consumer.rb +53 -3
  122. data/lib/pgbus/process/dispatcher.rb +1 -1
  123. data/lib/pgbus/process/supervisor.rb +32 -11
  124. data/lib/pgbus/process/worker.rb +45 -8
  125. data/lib/pgbus/recurring/scheduler.rb +2 -1
  126. data/lib/pgbus/streams/presence.rb +317 -81
  127. data/lib/pgbus/version.rb +1 -1
  128. data/lib/pgbus/web/data_source/dashboard_signals.rb +170 -0
  129. data/lib/pgbus/web/data_source/dead_letter.rb +142 -0
  130. data/lib/pgbus/web/data_source/event_list.rb +161 -0
  131. data/lib/pgbus/web/data_source/job_list.rb +323 -0
  132. data/lib/pgbus/web/data_source/list_counts.rb +80 -0
  133. data/lib/pgbus/web/data_source/process_list.rb +69 -0
  134. data/lib/pgbus/web/data_source/queue_summary.rb +122 -0
  135. data/lib/pgbus/web/data_source.rb +132 -254
  136. data/lib/pgbus/web/dead_letter_reason.rb +81 -0
  137. data/lib/pgbus/web/event_state.rb +71 -0
  138. data/lib/pgbus/web/health_app.rb +7 -3
  139. data/lib/pgbus/web/health_verdict.rb +78 -0
  140. data/lib/pgbus/web/insights_charts.rb +84 -0
  141. data/lib/pgbus/web/job_state.rb +111 -0
  142. data/lib/pgbus/web/process_activity.rb +97 -0
  143. data/lib/pgbus/web/process_state.rb +187 -0
  144. data/lib/pgbus/web/queue_summary.rb +104 -0
  145. data/lib/pgbus/web/stream_app.rb +18 -6
  146. data/lib/pgbus/web/streamer/connection.rb +7 -1
  147. data/lib/pgbus/web/streamer/falcon_connection.rb +7 -1
  148. data/lib/pgbus/web/streamer/heartbeat.rb +9 -3
  149. data/lib/pgbus/web/streamer/instance.rb +2 -1
  150. data/lib/pgbus/web/streamer/presence_tracker.rb +155 -0
  151. data/lib/pgbus/web/streamer/stream_event_dispatcher.rb +8 -37
  152. data/lib/pgbus/web/time_format.rb +128 -0
  153. metadata +55 -4
  154. data/app/views/pgbus/events/_pending_table.html.erb +0 -169
  155. data/app/views/pgbus/jobs/_enqueued_table.html.erb +0 -118
  156. data/app/views/pgbus/jobs/_failed_table.html.erb +0 -76
@@ -41,6 +41,7 @@ pt:
41
41
  title: Processos Ativos
42
42
  queue_health:
43
43
  dead_tuples: Tuplas mortas
44
+ empty: Ainda não há tabelas de fila para medir
44
45
  headers:
45
46
  bloat: Bloat
46
47
  dead: Mortas
@@ -60,14 +61,34 @@ pt:
60
61
  one: "%{count} tabela precisa de vacuum"
61
62
  other: "%{count} tabelas precisam de vacuum"
62
63
  title: Saúde das Filas
64
+ words:
65
+ bloat:
66
+ critical: "%{ratio} em %{table} — as leituras estão a abrandar; execute o vacuum agora (crítico acima de %{critical}, avisa acima de %{warn})"
67
+ none: Ainda nada para medir
68
+ ok: "%{ratio} em %{table} — normal (avisa acima de %{warn}, crítico acima de %{critical})"
69
+ warn: "%{ratio} em %{table} — vacuum necessário (avisa acima de %{warn}, crítico acima de %{critical})"
70
+ dead_tuples:
71
+ ok: Normal — avisa acima de %{limit} linhas mortas
72
+ warn: Acima de %{limit} — o autovacuum está atrasado; a tabela abaixo mostra onde
73
+ transaction:
74
+ critical: Mais de %{critical} — o vacuum não consegue recuperar linhas até ela terminar; encontre-a em pg_stat_activity (avisa em %{warn}; o veredito de saúde passa a degraded após %{verdict})
75
+ none: Nenhuma transação aberta — o vacuum pode recuperar todas as linhas mortas (avisa em %{warn}, alerta em %{critical}; o veredito de saúde passa a degraded após %{verdict})
76
+ ok: Normal — avisa em %{warn}, alerta em %{critical}; o veredito de saúde passa a degraded após %{verdict}
77
+ warn: Mais de %{warn} — uma transação longa impede o vacuum de recuperar linhas (alerta em %{critical}; o veredito de saúde passa a degraded após %{verdict})
78
+ vacuum:
79
+ critical: Mais de %{critical} — o autovacuum não está a chegar a estas tabelas; verifique as suas configurações (avisa após %{warn})
80
+ ok: Normal — avisa após %{warn}, crítico após %{critical}
81
+ unknown: Nunca foi feito vacuum, ou as estatísticas não estão disponíveis
82
+ warn: Mais de %{warn} — o autovacuum pode estar atrasado (crítico após %{critical})
63
83
  worst_bloat: Pior Bloat
64
84
  queues_table:
65
85
  empty: Nenhuma fila encontrada
66
86
  headers:
67
87
  depth: Profundidade
68
- oldest_claimable: Mais antigo disponível (s)
88
+ oldest_claimable: Mais antigo disponível
69
89
  parked: Adiados
70
90
  queue: Fila
91
+ status: Status
71
92
  total: Total
72
93
  visible: Visível
73
94
  title: Filas
@@ -75,7 +96,9 @@ pt:
75
96
  recent_failures:
76
97
  empty: Nenhuma falha
77
98
  headers:
99
+ attempt: Tentativa
78
100
  error: Erro
101
+ job: Job
79
102
  queue: Fila
80
103
  when: Quando
81
104
  title: Falhas Recentes
@@ -83,19 +106,72 @@ pt:
83
106
  show:
84
107
  title: Painel
85
108
  stats_cards:
109
+ dead_lettered: Mensagens mortas
110
+ dlq_newest_html: 'mais recente: %{error_class} em %{job} %{ago}'
111
+ dlq_newest_legacy_html: 'mais recente: %{job} %{ago} — nenhum motivo registrado'
112
+ dlq_newest_no_error_html: 'mais recente: %{job} %{ago} — nenhum erro registrado'
113
+ dlq_none: Nenhuma mensagem morta
114
+ dlq_see_why: abra a página de mensagens mortas para ver por que cada uma morreu
86
115
  enqueued: Enfileirado
87
- failed_dlq: Falhou / DLQ
88
- failed_dlq_labels: Falhados / Dead Lettered
116
+ enqueued_detail: "%{claimable} disponíveis agora · %{waiting} agendados, em execução ou em nova tentativa"
117
+ enqueued_paused:
118
+ one: "%{count} em filas pausadas"
119
+ other: "%{count} em filas pausadas"
89
120
  parked_jobs: Trabalhos estacionados
90
121
  parked_jobs_oldest: mais antigo %{age}
91
122
  processes: Processos
123
+ processes_detail: "%{healthy} saudáveis · %{stalled} parados · %{stale} obsoletos"
124
+ processes_none: Nada está em execução — nenhum job está a ser reivindicado
125
+ processes_stale: os processos obsoletos pararam de enviar batimentos; os seus jobs em curso voltam a executar quando o visibility timeout expirar
92
126
  queues: Filas
127
+ queues_detail: "%{paused} pausadas · %{dlq} de mensagens mortas"
128
+ queues_undrained:
129
+ one: "%{count} contém jobs que nada esvazia"
130
+ other: "%{count} contêm jobs que nada esvazia"
93
131
  recurring: Recorrente
132
+ recurring_detail: Tarefas que o agendador enfileira conforme o seu horário
133
+ retrying: Em nova tentativa
134
+ retrying_due:
135
+ one: "%{count} a vencer agora"
136
+ other: "%{count} a vencer agora"
137
+ retrying_newest: erro mais recente %{error_class}
138
+ retrying_next_html: próxima tentativa %{time}
139
+ retrying_none: Nada em nova tentativa
94
140
  throughput: Taxa de transferência
95
- throughput_unit: msgs/s
96
- view_tasks: Ver tarefas
97
- visible: visível
141
+ throughput_detail: jobs/min nos últimos %{minutes} min
142
+ throughput_unavailable: requer estatísticas de jobs (rails g pgbus:add_job_stats)
143
+ verdict:
144
+ links:
145
+ dlq: Mensagens mortas
146
+ processes: Processos
147
+ look_at: 'Veja:'
148
+ meaning:
149
+ degraded: Algo precisa de atenção, mas os jobs continuam a fluir. /readyz continua a responder ready.
150
+ ok: Todas as filas com trabalho estão a ser esvaziadas e todos os processos enviam batimentos. /readyz responde ready.
151
+ stalled: Há jobs à espera e nada os está a pegar. /readyz responde not ready (503).
152
+ statuses:
153
+ degraded: DEGRADED
154
+ ok: OK
155
+ stalled: STALLED
156
+ title: 'Saúde: %{status}'
157
+ unavailable: Veredito de saúde indisponível — não foi possível ler as verificações em que se baseia; consulte o log
98
158
  dead_letter:
159
+ detail:
160
+ backtrace: Backtrace (primeiras linhas)
161
+ died: 'Morreu:'
162
+ dlq: 'Fila de mensagens mortas:'
163
+ error_from_attempt: Erro da tentativa %{attempt}; as tentativas %{from}–%{to} não registraram erro.
164
+ source: 'Movido por:'
165
+ sources:
166
+ consumer: consumidor de eventos
167
+ worker: worker de jobs
168
+ why: Por que morreu
169
+ filters:
170
+ all: Todas
171
+ clear_error_class: Limpar filtro
172
+ error_class: 'Erro: %{error_class}'
173
+ filter_error_class: Mostrar apenas %{error_class}
174
+ label: Filtrar mensagens mortas
99
175
  index:
100
176
  discard_all: Descartar Tudo
101
177
  discard_all_confirm: Descartar permanentemente todas as mensagens DLQ?
@@ -115,11 +191,13 @@ pt:
115
191
  empty: A fila de mensagens mortas está vazia
116
192
  full_json_payload: Carga JSON completa
117
193
  headers:
118
- enqueued: Enfileirado
194
+ actions: Ações
195
+ attempts: Tentativas
196
+ died: Morreu
119
197
  id: ID
120
- job_class: Classe do Trabalho
121
- reads: Leituras
122
- source_queue: Fila de Origem
198
+ job: Job
199
+ reason: Motivo
200
+ source_queue: Fila de origem
123
201
  headers_section: Cabeçalhos
124
202
  job_id: 'ID do Trabalho:'
125
203
  metadata: Metadados
@@ -131,6 +209,16 @@ pt:
131
209
  visible_at: 'Visível em:'
132
210
  retry: Tentar novamente
133
211
  total_label: mensagens na fila de mensagens mortas
212
+ view: Ver
213
+ reasons:
214
+ error_earlier_attempt_html: 'Tentativas esgotadas. Último erro registrado, da tentativa %{error_attempt}: %{error_class}: %{error_message}'
215
+ error_html: 'Tentativas esgotadas. Último erro: %{error_class}: %{error_message}'
216
+ event_no_error_html: O handler falhou em %{attempts} entregas (máx. %{max}) — nenhum erro do handler foi registrado
217
+ no_error_recorded_html: Excedeu %{max} tentativas após %{attempts} leituras — nenhum erro foi registrado; cada tentativa com falha travou antes de poder reportar
218
+ not_recorded_html: Motivo não registrado (movido para a DLQ antes do pgbus %{version})
219
+ retried_before:
220
+ one: Já reenviado da DLQ uma vez.
221
+ other: Já reenviado da DLQ %{count} vezes.
134
222
  show:
135
223
  back: Voltar para DLQ
136
224
  context: Contexto
@@ -138,8 +226,10 @@ pt:
138
226
  discard_confirm: Descartar permanentemente?
139
227
  headers: Cabeçalhos
140
228
  labels:
229
+ attempts: Tentativas
230
+ died: Morreu
231
+ dlq: Fila de mensagens mortas
141
232
  enqueued_at: Enfileirado em
142
- read_count: Contagem de leituras
143
233
  source_queue: Fila de origem
144
234
  visibility_timeout: Tempo limite de visibilidade
145
235
  not_found: Mensagem não encontrada
@@ -163,6 +253,7 @@ pt:
163
253
  mark_handled_failed: Não foi possível marcar o evento como tratado.
164
254
  marked_handled: Evento marcado como tratado.
165
255
  none_selected: Nenhum evento selecionado.
256
+ payload_redacted: 'Não guardado: o payload ainda contém valores ocultados ([FILTERED]) que substituiriam os reais.'
166
257
  payload_update_failed: Não foi possível atualizar o payload. Verifique se o JSON é válido.
167
258
  payload_updated: Payload atualizado e evento reenfileirado.
168
259
  replay_failed: Evento não encontrado ou não pôde ser reproduzido.
@@ -170,56 +261,118 @@ pt:
170
261
  reroute_failed: Não foi possível redirecionar o evento.
171
262
  rerouted: Evento redirecionado para o manipulador alvo.
172
263
  index:
173
- discard_selected: Descartar Selecionados
174
- discard_selected_confirm: Descartar eventos selecionados?
175
- pending_empty: Nenhum evento pendente
176
- pending_headers:
177
- enqueued: Enfileirado
178
- handler_queue: Fila do Manipulador
179
- id: ID
180
- reads: Leituras
181
- routing_key: Chave de Roteamento
182
264
  pending_title: Eventos Pendentes
183
- processed_empty: Nenhum evento processado ainda
184
- processed_headers:
185
- event_id: ID do evento
186
- handler: Manipulador
187
- processed_at: Processado em
188
265
  processed_title: Eventos processados
266
+ subscribers:
267
+ covered: Processado por um consumer em execução
268
+ uncovered: Nenhum consumer em execução cobre este padrão
269
+ unknown: Cobertura de consumers desconhecida
270
+ view_pending: Ver pendentes
189
271
  subscribers_empty: Nenhum assinante registrado
190
272
  subscribers_headers:
273
+ consumer: Consumer
191
274
  handler: Manipulador
192
275
  pattern: Padrão
276
+ pending: Pendentes
193
277
  queue: Fila
194
278
  subscribers_title: Assinantes registrados
195
279
  title: Eventos
196
- pending_table:
197
- arguments: Payload
280
+ list:
198
281
  context: Contexto
199
282
  discard: Descartar
200
283
  discard_confirm: Descartar este evento? Ele será arquivado.
284
+ discard_failure_confirm: Descartar este evento com falha? A mensagem já não está na fila.
285
+ discard_selected: Descartar Selecionados
286
+ discard_selected_confirm: Descartar eventos selecionados?
201
287
  edit_payload: Editar e Tentar Novamente
202
288
  edit_payload_confirm: Atualizar payload e reenfileirar este evento?
203
289
  edit_payload_label: 'Payload JSON:'
290
+ empty:
291
+ all: Nenhum evento pendente
292
+ ready: Nenhum evento aguardando processamento
293
+ retrying: Nenhum evento aguardando nova tentativa
294
+ running: Nenhum evento em processamento
295
+ scheduled: Nenhum evento agendado
204
296
  event_id: 'ID do Evento:'
205
297
  full_json_payload: Payload JSON Completo
298
+ headers:
299
+ actions: Ações
300
+ attempts: Tentativas
301
+ event: Evento
302
+ handler: Manipulador
303
+ id: ID
304
+ reason: Próxima execução / Motivo
305
+ state: Estado
206
306
  headers_section: Cabeçalhos
207
307
  mark_handled: Marcar como Tratado
208
- mark_handled_confirm: Marcar este evento como tratado? Ele será arquivado e ignorado na reprodução.
308
+ mark_handled_confirm: Marcar este evento como processado? A mensagem é arquivada e o handler não o executa.
209
309
  metadata: Metadados
210
310
  metadata_labels:
311
+ enqueued: 'Enfileirado:'
211
312
  last_read: 'Última leitura:'
313
+ published: 'Publicado:'
212
314
  read_count: 'Contagem de leituras:'
213
315
  visible_at: 'Visível em:'
316
+ payload: Payload
317
+ reasons:
318
+ handling_html: Em processamento por %{handler} — obtido %{ago} · o lease expira %{time}
319
+ lease_expired_html: Lease expirado (o consumer provavelmente morreu) — reentregando a %{handler}, tentativa %{attempt}
320
+ no_consumer_for_queue_html: Nenhum consumer em execução assina %{pattern} (%{handler})
321
+ no_consumers_html: Nenhum consumer saudável em execução
322
+ orphaned_html: Falhou com %{error} em %{handler} — a mensagem já não está na fila
323
+ paused_html: Fila pausada
324
+ retrying_dlq_html: "%{handler} tentativa %{attempt}/%{max} falhou: %{error} — a próxima leitura move-o para a DLQ"
325
+ retrying_due_html: "%{handler} tentativa %{attempt}/%{max} falhou: %{error} — próxima tentativa agora"
326
+ retrying_html: "%{handler} tentativa %{attempt}/%{max} falhou: %{error} — próxima tentativa %{time}"
327
+ scheduled_html: Agendado — processado por %{handler} %{time}
328
+ waiting_html: 'Aguardando — %{count} à frente · próximo: %{handler}'
329
+ waiting_unknown_html: Aguardando %{handler}
214
330
  reroute: Redirecionar
215
331
  reroute_confirm: Redirecionar este evento para um manipulador diferente?
216
332
  reroute_label: 'Manipulador alvo:'
333
+ states:
334
+ ready: Pronto
335
+ retrying: Repetindo
336
+ running: Em processamento
337
+ scheduled: Agendado
338
+ tabs:
339
+ all: Todos
340
+ ready: Prontos
341
+ retrying: Repetindo
342
+ running: Em processamento
343
+ scheduled: Agendados
344
+ tabs_label: Estados dos eventos
345
+ view_failure: Ver falha
346
+ processed:
347
+ empty: Nenhum evento processado ainda
348
+ headers:
349
+ actions: Ações
350
+ event_id: ID do evento
351
+ handler: Manipulador
352
+ reason: Motivo
353
+ state: Estado
354
+ reasons:
355
+ abandoned_html: O claim ficou em silêncio %{ago} — a próxima entrega executa o handler de novo
356
+ completed_html: Concluído %{ago}
357
+ completed_legacy_html: Registado %{ago} (claim de fase única; atualize com pgbus:add_processed_event_completion)
358
+ handling_html: Em processamento — claim renovado %{ago}
359
+ replay: Reproduzir
360
+ replay_confirm: Reentregar este evento ao seu handler com um novo ID de evento? O handler é executado de novo.
361
+ replay_unavailable:
362
+ no_handler: O handler já não está registado
363
+ not_archived: Já não está no arquivo
364
+ states:
365
+ abandoned: Em silêncio
366
+ completed: Concluído
367
+ handling: Em processamento
217
368
  show:
218
369
  back: Voltar para eventos
219
370
  labels:
371
+ completed_at: Concluído em
220
372
  event_id: ID do evento
221
373
  handler: Manipulador
222
374
  processed_at: Processado em
375
+ state: Estado
223
376
  not_found: Evento não encontrado
224
377
  title: Evento %{event_id}
225
378
  helpers:
@@ -231,6 +384,7 @@ pt:
231
384
  bulk_select_row: Selecionar %{id}
232
385
  bulk_selected: selecionado
233
386
  pagination:
387
+ label: Paginação
234
388
  next: Próximo
235
389
  previous: Anterior
236
390
  showing: Mostrando %{from}–%{to} de %{total}
@@ -245,24 +399,50 @@ pt:
245
399
  healthy: Saudável
246
400
  stale: Obsoleto
247
401
  stalled: Bloqueado
402
+ time:
403
+ absolute_format: "%Y-%m-%d %H:%M:%S %Z"
404
+ clock_format: "%H:%M"
405
+ future: em %{distance}
406
+ now: agora
407
+ past: há %{distance}
408
+ range:
409
+ days:
410
+ one: "%{count} dia"
411
+ other: "%{count} dias"
412
+ hours:
413
+ one: "%{count} hora"
414
+ other: "%{count} horas"
415
+ minutes:
416
+ one: "%{count} minuto"
417
+ other: "%{count} minutos"
418
+ units:
419
+ days: "%{count}d"
420
+ hours: "%{count}h"
421
+ milliseconds: "%{count}ms"
422
+ minutes: "%{count}min"
423
+ seconds: "%{count}s"
248
424
  insights:
249
425
  show:
250
426
  charts:
251
- failed_to_load: Falha ao carregar dados do gráfico
252
- latency: Latência da Fila (ms)
427
+ captions:
428
+ latency: Os jobs esperaram em média %{avg} até um worker os pegar, p95 %{p95}
429
+ status: "%{success} concluídos, %{failed} falharam, %{dead_lettered} mortos"
430
+ throughput_html: "%{total} jobs nos últimos %{range}, pico de %{peak} jobs/min %{at}"
431
+ data_table: Tabela de dados
432
+ latency: Latência da Fila
253
433
  latency_avg: Média
254
434
  latency_p95: P95
255
435
  no_data: Sem dados ainda
256
436
  series_name: Tarefas/min
257
437
  status_distribution: Distribuição de status
258
- throughput: Taxa de transferência (tarefas/min)
438
+ throughput: Taxa de transferência
259
439
  description_html: Métricas de desempenho de trabalho para os últimos %{range}
260
440
  latency_by_queue:
261
441
  empty: Ainda não há dados de latência
262
442
  headers:
263
- avg: Média (ms)
443
+ avg: Média
264
444
  count: Contagem
265
- p95: P95 (ms)
445
+ p95: P95
266
446
  queue: Fila
267
447
  title: Latência por Fila
268
448
  live_streams:
@@ -282,6 +462,10 @@ pt:
282
462
  job_class: Classe da tarefa
283
463
  max: Máximo
284
464
  title: Classes de Trabalho Mais Lentas (duração média)
465
+ statuses:
466
+ dead_lettered: Morto
467
+ failed: Falhou
468
+ success: Concluído
285
469
  streams:
286
470
  summary:
287
471
  active: Ativo
@@ -310,6 +494,20 @@ pt:
310
494
  p99_latency: Latência P99
311
495
  succeeded: Bem-sucedido
312
496
  total_jobs: Total de Trabalhos
497
+ tables:
498
+ captions:
499
+ latency_minute: Latência da fila por minuto
500
+ latency_step: Latência da fila por %{step}
501
+ status: Jobs por status final
502
+ throughput_minute: Jobs por minuto
503
+ throughput_step: Jobs por %{step}
504
+ headers:
505
+ avg: Média
506
+ from: De
507
+ highest_p95: Maior p95
508
+ jobs: Jobs
509
+ share: Parcela
510
+ status: Status
313
511
  time_ranges:
314
512
  1h: 1h
315
513
  24h: 24h
@@ -317,60 +515,87 @@ pt:
317
515
  7d: 7d
318
516
  title: Insights
319
517
  jobs:
320
- enqueued_table:
518
+ index:
519
+ discard_all: Descartar Todos
520
+ discard_all_confirm: Descartar todos os trabalhos falhados?
521
+ discard_all_enqueued_notice: Descartados %{count} trabalhos na fila e bloqueios liberados.
522
+ discard_selected: Descartar Selecionados
523
+ discard_selected_confirm: Descartar itens selecionados?
524
+ discarded_selected:
525
+ one: 1 item selecionado descartado.
526
+ other: "%{count} itens selecionados descartados."
527
+ none_selected: Nenhum item selecionado.
528
+ retry_all: Tentar Novamente Todos
529
+ retry_all_confirm: Tentar novamente todos os trabalhos falhados?
530
+ title: Trabalhos
531
+ list:
321
532
  arguments: Argumentos
322
533
  discard: Descartar
323
- discard_all: Descartar todos
324
- discard_all_confirm: Descartar todos os trabalhos na fila e liberar seus bloqueios? Esta ação não pode ser desfeita.
325
- discard_confirm: Descartar esta mensagem?
326
- empty: Nenhum trabalho enfileirado
534
+ discard_all_enqueued: Descartar todos os enfileirados
535
+ discard_all_enqueued_confirm: Descartar todos os trabalhos na fila e liberar seus bloqueios? Esta ação não pode ser desfeita.
536
+ discard_confirm: Descartar este trabalho?
537
+ empty:
538
+ all: Nenhum job
539
+ blocked: Nenhum job bloqueado por um limite de concorrência
540
+ ready: Nenhum job aguardando execução
541
+ retrying: Nenhum job aguardando nova tentativa
542
+ running: Nenhum job em execução
543
+ scheduled: Nenhum job agendado
327
544
  full_json_payload: Carga JSON completa
328
545
  headers:
329
- enqueued: Enfileirado
546
+ actions: Ações
547
+ attempts: Tentativas
330
548
  id: ID
331
- job_class: Classe do Trabalho
549
+ job: Job
332
550
  queue: Fila
333
- reads: Leituras
551
+ reason: Próxima execução / Motivo
552
+ state: Estado
334
553
  headers_section: Cabeçalhos
335
554
  job_id: 'ID do Trabalho:'
336
555
  metadata: Metadados
337
556
  metadata_labels:
557
+ concurrency_key: 'Chave de concorrência:'
558
+ enqueued: 'Enfileirado:'
338
559
  last_read: 'Última leitura:'
339
560
  locale: 'Localidade:'
340
561
  priority: 'Prioridade:'
341
- queue: 'Fila:'
342
562
  scheduled: 'Agendado:'
343
563
  timezone: 'Fuso horário:'
344
564
  visible_at: 'Visível em:'
345
- retry: Tentar novamente
346
- retry_confirm: Redefinir tempo de visibilidade e tentar novamente?
347
- title: Trabalhos Enfileirados
348
- failed_table:
349
- discard: Descartar
350
- discard_confirm: Descartar este trabalho?
351
- empty: Nenhum trabalho falhou
352
- headers:
353
- actions: Ações
354
- error: Erro
355
- failed: Falhou
356
- id: ID
357
- queue: Fila
358
- retries: Tentativas
565
+ reasons:
566
+ blocked_html: Aguardando um slot de concorrência em %{key} (ocupados %{held}/%{limit}) · estacionado %{ago}
567
+ blocked_no_slots_html: Aguardando um slot de concorrência em %{key} · estacionado %{ago}
568
+ lease_expired_html: Concessão expirada (o worker provavelmente morreu) — reentregando, tentativa %{attempt}
569
+ no_workers_html: Nenhum worker saudável em execução
570
+ not_drained_html: Nenhum worker processa esta fila
571
+ orphaned_html: Falhou com %{error} — a mensagem não está mais na fila
572
+ paused_html: Fila pausada
573
+ retrying_dlq_html: 'A tentativa %{attempt}/%{max} falhou: %{error} — a próxima leitura o move para a DLQ'
574
+ retrying_due_html: 'A tentativa %{attempt}/%{max} falhou: %{error} — próxima tentativa agora'
575
+ retrying_html: 'A tentativa %{attempt}/%{max} falhou: %{error} — próxima tentativa %{time}'
576
+ running_html: Coletado %{ago} · a concessão expira %{time}
577
+ scheduled_html: Agendado — executa %{time}
578
+ waiting_html: Aguardando — %{count} à frente
579
+ waiting_priority_html: Aguardando — %{count} à frente nesta prioridade
580
+ waiting_unknown_html: Aguardando ser coletado
359
581
  retry: Tentar Novamente
360
- title: Trabalhos Falhados
361
- index:
362
- discard_all: Descartar Todos
363
- discard_all_confirm: Descartar todos os trabalhos falhados?
364
- discard_all_enqueued_notice: Descartados %{count} trabalhos na fila e bloqueios liberados.
365
- discard_selected: Descartar Selecionados
366
- discard_selected_confirm: Descartar itens selecionados?
367
- discarded_selected:
368
- one: 1 item selecionado descartado.
369
- other: "%{count} itens selecionados descartados."
370
- none_selected: Nenhum item selecionado.
371
- retry_all: Tentar Novamente Todos
372
- retry_all_confirm: Tentar novamente todos os trabalhos falhados?
373
- title: Trabalhos
582
+ retry_confirm: Redefinir tempo de visibilidade e tentar novamente?
583
+ states:
584
+ blocked: Bloqueado
585
+ ready: Pronto
586
+ retrying: Repetindo
587
+ running: Em execução
588
+ scheduled: Agendado
589
+ tabs:
590
+ all: Todos
591
+ blocked: Bloqueados
592
+ ready: Prontos
593
+ retrying: Repetindo
594
+ running: Em execução
595
+ scheduled: Agendados
596
+ tabs_label: Estados dos jobs
597
+ view_failure: Ver falha
598
+ view_locks: Ver bloqueios
374
599
  show:
375
600
  back: Voltar para Trabalhos
376
601
  backtrace: Rastreamento de Pilha
@@ -423,6 +648,7 @@ pt:
423
648
  other: Descartar os %{count} trabalhos estacionados atrás desta chave? Nunca serão executados.
424
649
  empty: Nenhuma chave de concorrência em uso
425
650
  headers:
651
+ actions: Ações
426
652
  in_use: Em uso
427
653
  key: Chave
428
654
  lease: Concessão
@@ -456,6 +682,7 @@ pt:
456
682
  discard_selected_confirm: Descartar bloqueios selecionados?
457
683
  empty: Nenhum bloqueio ativo
458
684
  headers:
685
+ actions: Ações
459
686
  age: Idade
460
687
  lock_key: Chave de Bloqueio
461
688
  msg_id: ID da mensagem
@@ -483,8 +710,6 @@ pt:
483
710
  pending: Pendente
484
711
  published: Publicado
485
712
  stats:
486
- no_age: "—"
487
- oldest_age: "%{seconds}s"
488
713
  oldest_unpublished: Mais antigo não publicado
489
714
  total: Total
490
715
  unpublished: Não publicado
@@ -493,18 +718,76 @@ pt:
493
718
  index:
494
719
  title: Processos
495
720
  processes_table:
721
+ capsule: cápsula %{capsule} · processo %{process}
496
722
  empty: Nenhum processo em execução
497
723
  headers:
498
- hostname: Nome do host
499
- kind: Tipo
500
- last_heartbeat: Último Batimento
501
- metadata: Metadados
502
- pid: PID
724
+ activity: Atividade
725
+ heartbeat: Batimento
726
+ process: Processo
727
+ recycle: Reciclagem
503
728
  status: Status
504
- rates:
505
- dequeued: retirados
506
- failed: falharam
507
- processed: processados
729
+ no_raw_metadata: Nenhum outro metadado
730
+ raw_metadata: Outros metadados
731
+ started: Iniciado
732
+ under_supervisor: sob o supervisor %{pid}
733
+ uptime: ativo há %{duration}
734
+ state:
735
+ activity:
736
+ buffered: "%{number} em buffer"
737
+ busy_slots: "%{busy}/%{capacity} slots ocupados"
738
+ busy_threads: "%{busy}/%{capacity} threads ocupadas"
739
+ consumes: Consome %{topics}
740
+ drains: Esvazia %{queues}
741
+ drains_all: Esvazia todas as filas
742
+ failed_rate: "%{rate} falhas/s"
743
+ handled: "%{number} tratados"
744
+ maintenance: Executa manutenção a cada %{interval} (jobs agendados, processos mortos, arquivos)
745
+ outbox: Publica entradas do outbox
746
+ rate: "%{rate} jobs/s"
747
+ schedule:
748
+ one: Executa %{count} tarefa recorrente, verifica a cada %{interval}
749
+ other: Executa %{count} tarefas recorrentes, verifica a cada %{interval}
750
+ slots:
751
+ one: "%{count} slot"
752
+ other: "%{count} slots"
753
+ supervises: Supervisiona %{children}
754
+ supervises_none: Não supervisiona processos neste host
755
+ threads:
756
+ one: "%{count} thread"
757
+ other: "%{count} threads"
758
+ kinds:
759
+ consumer:
760
+ one: "%{count} consumidor"
761
+ other: "%{count} consumidores"
762
+ dispatcher:
763
+ one: dispatcher
764
+ other: "%{count} dispatchers"
765
+ outbox_poller:
766
+ one: poller do outbox
767
+ other: "%{count} pollers do outbox"
768
+ scheduler:
769
+ one: agendador
770
+ other: "%{count} agendadores"
771
+ worker:
772
+ one: "%{count} worker"
773
+ other: "%{count} workers"
774
+ next:
775
+ stale_reaped: provavelmente morto; removido na próxima varredura do dispatcher (em até %{within})
776
+ stale_unreaped: provavelmente morto; nenhum dispatcher vivo para removê-lo
777
+ stalled_maintenance: jobs agendados, limpeza de processos mortos e compactação de arquivos não avançam
778
+ stalled_schedule: tarefas recorrentes não estão sendo enfileiradas
779
+ stalled_standalone: nenhum supervisor para reiniciá-lo
780
+ stalled_supervised: o watchdog do supervisor o reinicia
781
+ reasons:
782
+ healthy_detection_off_html: Batimento %{ago} (limite %{limit}) · detecção de travamento desligada
783
+ healthy_heartbeat_html: Batimento %{ago} (limite %{limit})
784
+ healthy_loop_html: Laço avançou %{ago} (limite %{limit})
785
+ stale_html: Sem batimento há %{age} (limite %{limit})
786
+ stalled_html: Laço avançou pela última vez %{ago} (limite %{limit})
787
+ recycle:
788
+ jobs: "%{done} / %{limit} jobs"
789
+ lifetime: ativo há %{uptime} / %{limit}
790
+ memory: "%{used} / %{limit} MB"
508
791
  queues:
509
792
  destroy:
510
793
  success: Fila %{name} excluída.
@@ -517,59 +800,70 @@ pt:
517
800
  headers:
518
801
  actions: Ações
519
802
  depth: Profundidade
520
- newest: Mais novo (s)
521
- oldest_claimable: Mais antigo disponível (s)
803
+ newest: Mais novo
804
+ oldest_claimable: Mais antigo disponível
522
805
  parked: Adiados
523
806
  queue: Fila
524
807
  total_ever: Total de todos os tempos
525
808
  visible: Visível
526
809
  pause: Pausar
527
810
  pause_confirm: Pausar processamento por %{name}?
528
- paused: Pausado
529
811
  purge: Limpar
530
812
  purge_confirm: Limpar todas as mensagens de %{name}?
531
813
  resume: Retomar
532
814
  show:
533
- arguments: Argumentos
534
815
  back: Voltar às filas
535
816
  delete_confirm: Excluir permanentemente esta fila? Esta ação não pode ser desfeita.
536
817
  delete_queue: Excluir fila
537
- depth: 'Profundidade:'
538
- discard: Descartar
539
- discard_confirm: Descartar esta mensagem?
540
- empty: Fila está vazia
541
- full_json_payload: Carga JSON completa
542
- headers:
543
- enqueued: Enfileirado
544
- id: ID
545
- job_class: Classe do Trabalho
546
- reads: Leituras
547
- vt: VT
548
- headers_section: Cabeçalhos
549
- job_id: 'ID do Trabalho:'
818
+ dlq_link: Tente novamente ou descarte-as na página Dead Letter
819
+ dlq_pointer:
820
+ one: Fila de mensagens mortas de %{logical} — %{count} mensagem.
821
+ other: Fila de mensagens mortas de %{logical} — %{count} mensagens.
550
822
  message_discard_failed: Não foi possível descartar a mensagem.
551
823
  message_discarded: Mensagem descartada.
552
824
  message_retried: Visibilidade da mensagem redefinida.
553
825
  message_retry_failed: Não foi possível tentar novamente a mensagem.
554
- metadata: Metadados
555
- metadata_labels:
556
- last_read: 'Última leitura:'
557
- locale: 'Localidade:'
558
- priority: 'Prioridade:'
559
- queue: 'Fila:'
560
- scheduled: 'Agendado:'
561
- timezone: 'Fuso horário:'
562
- visible_at: 'Visível em:'
563
- oldest: 'Mais antigo:'
564
- oldest_claimable: 'Mais antigo disponível:'
565
- parked: 'Adiados:'
826
+ metrics:
827
+ claimable: Disponíveis agora
828
+ depth: Profundidade
829
+ oldest: Mais antigo
830
+ oldest_claimable: Mais antigo disponível
831
+ parked: Estacionados
832
+ total: Total histórico
833
+ other_levels: 'Outros níveis de prioridade:'
566
834
  pause: Pausar
567
835
  pause_confirm: Pausar processamento?
568
836
  purge_confirm: Limpar todas as mensagens?
569
837
  purge_queue: Limpar fila
570
838
  resume: Retomar
571
- retry: Tentar novamente
572
- retry_confirm: Redefinir tempo de visibilidade e tentar novamente?
839
+ summary:
840
+ backlog_html: "%{visible} disponíveis agora, o mais antigo espera há %{age} · %{parked} estacionados (agendados ou em nova tentativa)"
841
+ backlog_parked_only_html: Nada disponível agora · %{parked} estacionados (agendados ou em nova tentativa)
842
+ dlq_html: 'Fila de mensagens mortas de %{logical}: os jobs chegam aqui após %{max} tentativas falhadas'
843
+ drained_by_html:
844
+ one: Esvaziada por %{capsules} (%{count} worker saudável)
845
+ other: Esvaziada por %{capsules} (%{count} workers saudáveis)
846
+ drained_live_html:
847
+ one: Esvaziada por %{count} worker saudável que escuta esta fila
848
+ other: Esvaziada por %{count} workers saudáveis que escutam esta fila
849
+ drained_wildcard_html:
850
+ one: Esvaziada por uma cápsula de workers curinga (%{count} worker saudável)
851
+ other: Esvaziada por uma cápsula de workers curinga (%{count} workers saudáveis)
852
+ empty_html: Nada à espera
853
+ handler_html: Fila de handler de eventos — esvaziada pelos consumidores (%{count} saudáveis)
854
+ no_consumers_html:
855
+ one: Fila de handler de eventos sem consumidor saudável — %{count} evento espera
856
+ other: Fila de handler de eventos sem consumidor saudável — %{count} eventos esperam
857
+ no_workers_html:
858
+ one: Nenhum worker saudável em execução — %{count} job está disponível mas ninguém o pega
859
+ other: Nenhum worker saudável em execução — %{count} jobs estão disponíveis mas ninguém os pega
860
+ not_drained_html: Nenhuma cápsula de workers esvazia esta fila — os jobs esperam até que uma seja configurada
861
+ paused_circuit_breaker_html: 'Pausada automaticamente %{ago} após %{failures} falhas consecutivas — retoma %{time} (disparo #%{trip})'
862
+ paused_operator_html: Pausada %{ago} — %{reason}
863
+ paused_operator_no_reason_html: Pausada %{ago} por um operador
864
+ priority_level_html: Nível de prioridade %{level} de %{logical}
865
+ stream_html: Fila de stream — entregue por peek, não esvaziada pelos workers
866
+ summary_label: Resumo da fila
573
867
  table_health:
574
868
  headers:
575
869
  bloat: Bloat
@@ -579,8 +873,6 @@ pt:
579
873
  table: Tabela
580
874
  oldest_txn: 'Transação aberta mais antiga:'
581
875
  title: Saúde das Tabelas
582
- total: 'Total:'
583
- visible: 'Visível:'
584
876
  recurring_tasks:
585
877
  index:
586
878
  task_count: