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 @@ da:
41
41
  title: Aktive processer
42
42
  queue_health:
43
43
  dead_tuples: Døde tupler
44
+ empty: Ingen køtabeller at måle endnu
44
45
  headers:
45
46
  bloat: Bloat
46
47
  dead: Døde
@@ -60,14 +61,34 @@ da:
60
61
  one: "%{count} tabel har brug for vacuum"
61
62
  other: "%{count} tabeller har brug for vacuum"
62
63
  title: Køhelbred
64
+ words:
65
+ bloat:
66
+ critical: "%{ratio} på %{table} — læsninger bliver langsommere; kør vacuum nu (kritisk over %{critical}, advarer over %{warn})"
67
+ none: Intet at måle endnu
68
+ ok: "%{ratio} på %{table} — fint (advarer over %{warn}, kritisk over %{critical})"
69
+ warn: "%{ratio} på %{table} — vacuum påkrævet (advarer over %{warn}, kritisk over %{critical})"
70
+ dead_tuples:
71
+ ok: Fint — advarer over %{limit} døde rækker
72
+ warn: Over %{limit} — autovacuum er bagud; tabellen nedenfor viser hvor
73
+ transaction:
74
+ critical: Over %{critical} — vacuum kan ikke frigøre rækker, før den slutter; find den i pg_stat_activity (advarer ved %{warn}; helbredsvurderingen forringes efter %{verdict})
75
+ none: Ingen åben transaktion — vacuum kan frigøre alle døde rækker (advarer ved %{warn}, alarmerer ved %{critical}; helbredsvurderingen forringes efter %{verdict})
76
+ ok: Fint — advarer ved %{warn}, alarmerer ved %{critical}; helbredsvurderingen forringes efter %{verdict}
77
+ warn: Over %{warn} — en lang transaktion forhindrer vacuum i at frigøre rækker (alarmerer ved %{critical}; helbredsvurderingen forringes efter %{verdict})
78
+ vacuum:
79
+ critical: Over %{critical} — autovacuum når ikke disse tabeller; tjek dens indstillinger (advarer efter %{warn})
80
+ ok: Fint — advarer efter %{warn}, kritisk efter %{critical}
81
+ unknown: Aldrig vacuumet, eller statistikken er utilgængelig
82
+ warn: Over %{warn} — autovacuum halter muligvis bagud (kritisk efter %{critical})
63
83
  worst_bloat: Værste Bloat
64
84
  queues_table:
65
85
  empty: Ingen køer fundet
66
86
  headers:
67
87
  depth: Dybde
68
- oldest_claimable: Ældste tilgængelig (s)
88
+ oldest_claimable: Ældste tilgængelig
69
89
  parked: Parkeret
70
90
  queue: Kø
91
+ status: Status
71
92
  total: Total
72
93
  visible: Synlig
73
94
  title: Køer
@@ -75,7 +96,9 @@ da:
75
96
  recent_failures:
76
97
  empty: Ingen fejl
77
98
  headers:
99
+ attempt: Forsøg
78
100
  error: Fejl
101
+ job: Job
79
102
  queue: Kø
80
103
  when: Hvornår
81
104
  title: Seneste fejl
@@ -83,19 +106,72 @@ da:
83
106
  show:
84
107
  title: Dashboard
85
108
  stats_cards:
109
+ dead_lettered: Dead-lettered
110
+ dlq_newest_html: 'nyeste: %{error_class} i %{job} %{ago}'
111
+ dlq_newest_legacy_html: 'nyeste: %{job} %{ago} — ingen årsag registreret'
112
+ dlq_newest_no_error_html: 'nyeste: %{job} %{ago} — ingen fejl registreret'
113
+ dlq_none: Intet er dead-lettered
114
+ dlq_see_why: åbn dead letter-siden for at se, hvorfor hver døde
86
115
  enqueued: Sat i kø
87
- failed_dlq: Mislykkedes / DLQ
88
- failed_dlq_labels: Fejlet / Dead Lettered
116
+ enqueued_detail: "%{claimable} kan hentes nu · %{waiting} planlagt, kørende eller prøver igen"
117
+ enqueued_paused:
118
+ one: "%{count} i køer sat på pause"
119
+ other: "%{count} i køer sat på pause"
89
120
  parked_jobs: Parkerede job
90
121
  parked_jobs_oldest: ældst %{age}
91
122
  processes: Processer
123
+ processes_detail: "%{healthy} sunde · %{stalled} gået i stå · %{stale} forældede"
124
+ processes_none: Intet kører — ingen jobs bliver hentet
125
+ processes_stale: forældede processer er holdt op med at sende heartbeat; deres igangværende jobs kører igen, når deres visibility timeout udløber
92
126
  queues: Køer
127
+ queues_detail: "%{paused} sat på pause · %{dlq} dead letter"
128
+ queues_undrained:
129
+ one: "%{count} har jobs, som intet tømmer"
130
+ other: "%{count} har jobs, som intet tømmer"
93
131
  recurring: Gentagende
132
+ recurring_detail: Opgaver, som scheduleren sætter i kø efter deres tidsplan
133
+ retrying: Prøver igen
134
+ retrying_due:
135
+ one: "%{count} forfalder nu"
136
+ other: "%{count} forfalder nu"
137
+ retrying_newest: nyeste fejl %{error_class}
138
+ retrying_next_html: næste forsøg %{time}
139
+ retrying_none: Intet prøver igen
94
140
  throughput: Gennemløb
95
- throughput_unit: besk/s
96
- view_tasks: Se opgaver
97
- visible: synlig
141
+ throughput_detail: job/min de seneste %{minutes} min
142
+ throughput_unavailable: kræver jobstatistik (rails g pgbus:add_job_stats)
143
+ verdict:
144
+ links:
145
+ dlq: Dead letters
146
+ processes: Processer
147
+ look_at: 'Se på:'
148
+ meaning:
149
+ degraded: Noget kræver opmærksomhed, men jobs flyder stadig. /readyz svarer stadig klar.
150
+ ok: Alle køer med arbejde bliver tømt, og alle processer sender heartbeat. /readyz svarer klar.
151
+ stalled: Jobs venter, og intet henter dem. /readyz svarer ikke klar (503).
152
+ statuses:
153
+ degraded: DEGRADED
154
+ ok: OK
155
+ stalled: STALLED
156
+ title: 'Helbred: %{status}'
157
+ unavailable: Helbredsvurdering utilgængelig — kontrollerne bag den kunne ikke læses; se loggen
98
158
  dead_letter:
159
+ detail:
160
+ backtrace: Backtrace (første linjer)
161
+ died: 'Død:'
162
+ dlq: 'Dead letter-kø:'
163
+ error_from_attempt: Fejl fra forsøg %{attempt}; forsøg %{from}–%{to} registrerede ingen fejl.
164
+ source: 'Flyttet af:'
165
+ sources:
166
+ consumer: event-consumer
167
+ worker: job-worker
168
+ why: Hvorfor den døde
169
+ filters:
170
+ all: Alle
171
+ clear_error_class: Ryd filter
172
+ error_class: 'Fejl: %{error_class}'
173
+ filter_error_class: Vis kun %{error_class}
174
+ label: Filtrér dead letters
99
175
  index:
100
176
  discard_all: Kassér alle
101
177
  discard_all_confirm: Slet permanent alle DLQ-beskeder?
@@ -115,10 +191,12 @@ da:
115
191
  empty: Dead letter queue er tom
116
192
  full_json_payload: Fuld JSON-payload
117
193
  headers:
118
- enqueued: Sat i kø
194
+ actions: Handlinger
195
+ attempts: Forsøg
196
+ died: Død
119
197
  id: ID
120
- job_class: Jobklasse
121
- reads: Læsninger
198
+ job: Job
199
+ reason: Årsag
122
200
  source_queue: Kildekø
123
201
  headers_section: Headers
124
202
  job_id: 'Job ID:'
@@ -131,6 +209,16 @@ da:
131
209
  visible_at: 'Synlig ved:'
132
210
  retry: Forsøg igen
133
211
  total_label: beskeder i dead letter-kø
212
+ view: Vis
213
+ reasons:
214
+ error_earlier_attempt_html: 'Genforsøg opbrugt. Seneste registrerede fejl, fra forsøg %{error_attempt}: %{error_class}: %{error_message}'
215
+ error_html: 'Genforsøg opbrugt. Seneste fejl: %{error_class}: %{error_message}'
216
+ event_no_error_html: Handleren fejlede ved %{attempts} leveringer (maks. %{max}) — ingen handler-fejl blev registreret
217
+ no_error_recorded_html: Overskred %{max} genforsøg efter %{attempts} læsninger — ingen fejl blev registreret; hvert fejlende forsøg crashede, før det kunne rapportere
218
+ not_recorded_html: Årsag ikke registreret (flyttet til DLQ før pgbus %{version})
219
+ retried_before:
220
+ one: Genforsøgt fra DLQ én gang før.
221
+ other: Genforsøgt fra DLQ %{count} gange før.
134
222
  show:
135
223
  back: Tilbage til DLQ
136
224
  context: Kontekst
@@ -138,8 +226,10 @@ da:
138
226
  discard_confirm: Slet permanent?
139
227
  headers: Overskrifter
140
228
  labels:
229
+ attempts: Forsøg
230
+ died: Død
231
+ dlq: Dead letter-kø
141
232
  enqueued_at: Indsat kl.
142
- read_count: Antal læsninger
143
233
  source_queue: Kildekø
144
234
  visibility_timeout: Synlighedstimeout
145
235
  not_found: Besked ikke fundet
@@ -163,6 +253,7 @@ da:
163
253
  mark_handled_failed: Kunne ikke markere begivenhed som håndteret.
164
254
  marked_handled: Begivenhed markeret som håndteret.
165
255
  none_selected: Ingen begivenheder valgt.
256
+ payload_redacted: 'Ikke gemt: payloaden indeholder stadig redigerede ([FILTERED]) værdier, som ville erstatte de rigtige.'
166
257
  payload_update_failed: Kunne ikke opdatere payload. Tjek at JSON er gyldig.
167
258
  payload_updated: Payload opdateret og begivenhed genindkøet.
168
259
  replay_failed: Begivenhed ikke fundet eller kunne ikke afspilles.
@@ -170,56 +261,118 @@ da:
170
261
  reroute_failed: Kunne ikke omdirigere begivenhed.
171
262
  rerouted: Begivenhed omdirigeret til målhandler.
172
263
  index:
173
- discard_selected: Forkast valgte
174
- discard_selected_confirm: Forkast valgte begivenheder?
175
- pending_empty: Ingen ventende begivenheder
176
- pending_headers:
177
- enqueued: Indkøet
178
- handler_queue: Handler-kø
179
- id: ID
180
- reads: Læsninger
181
- routing_key: Routing-nøgle
182
264
  pending_title: Ventende begivenheder
183
- processed_empty: Ingen begivenheder behandlet endnu
184
- processed_headers:
185
- event_id: Begivenheds-ID
186
- handler: Håndterer
187
- processed_at: Behandlet kl.
188
265
  processed_title: Behandlede begivenheder
266
+ subscribers:
267
+ covered: Drænes af en kørende consumer
268
+ uncovered: Ingen kørende consumer dækker dette mønster
269
+ unknown: Consumer-dækning ukendt
270
+ view_pending: Vis ventende
189
271
  subscribers_empty: Ingen abonnenter registreret
190
272
  subscribers_headers:
273
+ consumer: Consumer
191
274
  handler: Håndterer
192
275
  pattern: Mønster
276
+ pending: Ventende
193
277
  queue: Kø
194
278
  subscribers_title: Registrerede abonnenter
195
279
  title: Begivenheder
196
- pending_table:
197
- arguments: Payload
280
+ list:
198
281
  context: Kontekst
199
282
  discard: Forkast
200
283
  discard_confirm: Forkast denne begivenhed? Den vil blive arkiveret.
284
+ discard_failure_confirm: Kassér denne fejlede hændelse? Dens besked er ikke længere i køen.
285
+ discard_selected: Forkast valgte
286
+ discard_selected_confirm: Forkast valgte begivenheder?
201
287
  edit_payload: Rediger & prøv igen
202
288
  edit_payload_confirm: Opdater payload og genindkø denne begivenhed?
203
289
  edit_payload_label: 'JSON Payload:'
290
+ empty:
291
+ all: Ingen ventende begivenheder
292
+ ready: Ingen hændelser venter på at blive håndteret
293
+ retrying: Ingen hændelser venter på nyt forsøg
294
+ running: Ingen hændelser håndteres
295
+ scheduled: Ingen planlagte hændelser
204
296
  event_id: 'Begivenheds-ID:'
205
297
  full_json_payload: Fuld JSON Payload
298
+ headers:
299
+ actions: Handlinger
300
+ attempts: Forsøg
301
+ event: Hændelse
302
+ handler: Håndterer
303
+ id: ID
304
+ reason: Næste kørsel / Årsag
305
+ state: Tilstand
206
306
  headers_section: Headers
207
307
  mark_handled: Marker som håndteret
208
- mark_handled_confirm: Marker denne begivenhed som håndteret? Den vil blive arkiveret og sprunget over ved afspilning.
308
+ mark_handled_confirm: Markér denne hændelse som håndteret? Beskeden arkiveres, og handleren kører den ikke.
209
309
  metadata: Metadata
210
310
  metadata_labels:
311
+ enqueued: 'Sat i kø:'
211
312
  last_read: 'Sist læst:'
313
+ published: 'Udgivet:'
212
314
  read_count: 'Læseantal:'
213
315
  visible_at: 'Synlig fra:'
316
+ payload: Payload
317
+ reasons:
318
+ handling_html: Håndteres af %{handler} — hentet %{ago} · lease udløber %{time}
319
+ lease_expired_html: Lease udløbet (consumer døde sandsynligvis) — leveres igen til %{handler}, forsøg %{attempt}
320
+ no_consumer_for_queue_html: Ingen kørende consumer abonnerer på %{pattern} (%{handler})
321
+ no_consumers_html: Ingen sund consumer kører
322
+ orphaned_html: Fejlede med %{error} i %{handler} — beskeden er ikke længere i køen
323
+ paused_html: Køen er sat på pause
324
+ retrying_dlq_html: "%{handler} forsøg %{attempt}/%{max} fejlede: %{error} — næste læsning flytter den til DLQ"
325
+ retrying_due_html: "%{handler} forsøg %{attempt}/%{max} fejlede: %{error} — næste forsøg nu"
326
+ retrying_html: "%{handler} forsøg %{attempt}/%{max} fejlede: %{error} — næste forsøg %{time}"
327
+ scheduled_html: Planlagt — håndteres af %{handler} %{time}
328
+ waiting_html: 'Venter — %{count} foran · næste: %{handler}'
329
+ waiting_unknown_html: Venter på %{handler}
214
330
  reroute: Omdiriger
215
331
  reroute_confirm: Omdiriger denne begivenhed til en anden handler?
216
332
  reroute_label: 'Målhandler:'
333
+ states:
334
+ ready: Klar
335
+ retrying: Prøver igen
336
+ running: Håndteres
337
+ scheduled: Planlagt
338
+ tabs:
339
+ all: Alle
340
+ ready: Klar
341
+ retrying: Prøver igen
342
+ running: Håndteres
343
+ scheduled: Planlagt
344
+ tabs_label: Hændelsestilstande
345
+ view_failure: Vis fejl
346
+ processed:
347
+ empty: Ingen begivenheder behandlet endnu
348
+ headers:
349
+ actions: Handlinger
350
+ event_id: Begivenheds-ID
351
+ handler: Håndterer
352
+ reason: Årsag
353
+ state: Tilstand
354
+ reasons:
355
+ abandoned_html: Claim blev tavs %{ago} — næste levering kører handleren igen
356
+ completed_html: Fuldført %{ago}
357
+ completed_legacy_html: Registreret %{ago} (enkeltfase-claim; opgradér med pgbus:add_processed_event_completion)
358
+ handling_html: Håndteres — claim opdateret %{ago}
359
+ replay: Afspil igen
360
+ replay_confirm: Lever denne hændelse til sin handler igen under et nyt hændelses-ID? Handleren kører igen.
361
+ replay_unavailable:
362
+ no_handler: Handleren er ikke længere registreret
363
+ not_archived: Ikke længere i arkivet
364
+ states:
365
+ abandoned: Tavs
366
+ completed: Fuldført
367
+ handling: Håndteres
217
368
  show:
218
369
  back: Tilbage til begivenheder
219
370
  labels:
371
+ completed_at: Fuldført
220
372
  event_id: Begivenheds-ID
221
373
  handler: Håndterer
222
374
  processed_at: Behandlet kl.
375
+ state: Tilstand
223
376
  not_found: Begivenhed ikke fundet
224
377
  title: Begivenhed %{event_id}
225
378
  helpers:
@@ -231,6 +384,7 @@ da:
231
384
  bulk_select_row: Vælg %{id}
232
385
  bulk_selected: valgt
233
386
  pagination:
387
+ label: Sideinddeling
234
388
  next: Næste
235
389
  previous: Forrige
236
390
  showing: Viser %{from}–%{to} af %{total}
@@ -245,24 +399,50 @@ da:
245
399
  healthy: Sund
246
400
  stale: Forældet
247
401
  stalled: Gået i stå
402
+ time:
403
+ absolute_format: "%Y-%m-%d %H:%M:%S %Z"
404
+ clock_format: "%H:%M"
405
+ future: om %{distance}
406
+ now: nu
407
+ past: "%{distance} siden"
408
+ range:
409
+ days:
410
+ one: "%{count} dag"
411
+ other: "%{count} dage"
412
+ hours:
413
+ one: "%{count} time"
414
+ other: "%{count} timer"
415
+ minutes:
416
+ one: "%{count} minut"
417
+ other: "%{count} minutter"
418
+ units:
419
+ days: "%{count}d"
420
+ hours: "%{count}t"
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: Kunne ikke indlæse diagramdata
252
- latency: Køforsinkelse (ms)
427
+ captions:
428
+ latency: Jobs ventede i gennemsnit %{avg}, før en worker tog dem, p95 %{p95}
429
+ status: "%{success} gennemført, %{failed} fejlet, %{dead_lettered} dead-lettered"
430
+ throughput_html: "%{total} job de seneste %{range}, top %{peak} job/min %{at}"
431
+ data_table: Datatabel
432
+ latency: Køforsinkelse
253
433
  latency_avg: Gns.
254
434
  latency_p95: P95
255
435
  no_data: Ingen data endnu
256
436
  series_name: Job/min
257
437
  status_distribution: Statusfordeling
258
- throughput: Gennemstrømning (job/min)
438
+ throughput: Gennemstrømning
259
439
  description_html: Jobpræstationsmålinger for de sidste %{range}
260
440
  latency_by_queue:
261
441
  empty: Ingen forsinkelsesdata endnu
262
442
  headers:
263
- avg: Gns. (ms)
443
+ avg: Gns.
264
444
  count: Antal
265
- p95: P95 (ms)
445
+ p95: P95
266
446
  queue: Kø
267
447
  title: Forsinkelse efter kø
268
448
  live_streams:
@@ -282,6 +462,10 @@ da:
282
462
  job_class: Jobklasse
283
463
  max: Max
284
464
  title: Langsommeste jobklasser (gennemsnitlig varighed)
465
+ statuses:
466
+ dead_lettered: Dead-lettered
467
+ failed: Fejlet
468
+ success: Gennemført
285
469
  streams:
286
470
  summary:
287
471
  active: Aktiv
@@ -310,6 +494,20 @@ da:
310
494
  p99_latency: P99 forsinkelse
311
495
  succeeded: Succesfuld
312
496
  total_jobs: Totale job
497
+ tables:
498
+ captions:
499
+ latency_minute: Køforsinkelse pr. minut
500
+ latency_step: Køforsinkelse pr. %{step}
501
+ status: Job efter slutstatus
502
+ throughput_minute: Job pr. minut
503
+ throughput_step: Job pr. %{step}
504
+ headers:
505
+ avg: Gns.
506
+ from: Fra
507
+ highest_p95: Højeste p95
508
+ jobs: Job
509
+ share: Andel
510
+ status: Status
313
511
  time_ranges:
314
512
  1h: 1t
315
513
  24h: 24t
@@ -317,60 +515,87 @@ da:
317
515
  7d: 7d
318
516
  title: Indsigter
319
517
  jobs:
320
- enqueued_table:
518
+ index:
519
+ discard_all: Kassér alle
520
+ discard_all_confirm: Kassér alle mislykkede job?
521
+ discard_all_enqueued_notice: Kasserede %{count} ventende jobs og frigav deres låse.
522
+ discard_selected: Kassér valgte
523
+ discard_selected_confirm: Kassér valgte elementer?
524
+ discarded_selected:
525
+ one: Kasserede 1 valgt element.
526
+ other: Kasserede %{count} valgte elementer.
527
+ none_selected: Ingen elementer valgt.
528
+ retry_all: Forsøg alle igen
529
+ retry_all_confirm: Forsøg alle mislykkede job igen?
530
+ title: Job
531
+ list:
321
532
  arguments: Argumenter
322
533
  discard: Kassér
323
- discard_all: Kassér alle
324
- discard_all_confirm: Kassér alle ventende jobs og frigiv deres låse? Dette kan ikke fortrydes.
325
- discard_confirm: Kassér denne besked?
326
- empty: Ingen job i kø
534
+ discard_all_enqueued: Kassér alle i kø
535
+ discard_all_enqueued_confirm: Kassér alle ventende jobs og frigiv deres låse? Dette kan ikke fortrydes.
536
+ discard_confirm: Kassér dette job?
537
+ empty:
538
+ all: Ingen jobs
539
+ blocked: Ingen jobs blokeret af en samtidighedsgrænse
540
+ ready: Ingen jobs venter på at køre
541
+ retrying: Ingen jobs venter på et nyt forsøg
542
+ running: Ingen jobs kører
543
+ scheduled: Ingen planlagte jobs
327
544
  full_json_payload: Fuld JSON-payload
328
545
  headers:
329
- enqueued: I kø
546
+ actions: Handlinger
547
+ attempts: Forsøg
330
548
  id: ID
331
- job_class: Jobklasse
549
+ job: Job
332
550
  queue: Kø
333
- reads: Læsninger
551
+ reason: Næste kørsel / Årsag
552
+ state: Tilstand
334
553
  headers_section: Headers
335
554
  job_id: 'Job ID:'
336
555
  metadata: Metadata
337
556
  metadata_labels:
557
+ concurrency_key: 'Samtidighedsnøgle:'
558
+ enqueued: 'Sat i kø:'
338
559
  last_read: 'Sidste læsning:'
339
560
  locale: 'Locale:'
340
561
  priority: 'Prioritet:'
341
- queue: 'Kø:'
342
562
  scheduled: 'Planlagt:'
343
563
  timezone: 'Tidszone:'
344
564
  visible_at: 'Synlig fra:'
345
- retry: Prøv igen
346
- retry_confirm: Nulstil synlighedstimeout og prøv igen?
347
- title: Job i kø
348
- failed_table:
349
- discard: Kassér
350
- discard_confirm: Kassér dette job?
351
- empty: Ingen mislykkede job
352
- headers:
353
- actions: Handlinger
354
- error: Fejl
355
- failed: Mislykkedes
356
- id: ID
357
- queue: Kø
358
- retries: Forsøg
565
+ reasons:
566
+ blocked_html: Venter på en samtidighedsplads på %{key} (optaget %{held}/%{limit}) · parkeret %{ago}
567
+ blocked_no_slots_html: Venter på en samtidighedsplads på %{key} · parkeret %{ago}
568
+ lease_expired_html: Lease udløbet (worker er sandsynligvis død) — leveres igen, forsøg %{attempt}
569
+ no_workers_html: Ingen sund worker kører
570
+ not_drained_html: Ingen worker tømmer denne kø
571
+ orphaned_html: Fejlede med %{error} — beskeden er ikke længere i køen
572
+ paused_html: Køen er sat på pause
573
+ retrying_dlq_html: 'Forsøg %{attempt}/%{max} fejlede: %{error} — næste læsning flytter den til DLQ'
574
+ retrying_due_html: 'Forsøg %{attempt}/%{max} fejlede: %{error} — næste forsøg nu'
575
+ retrying_html: 'Forsøg %{attempt}/%{max} fejlede: %{error} — næste forsøg %{time}'
576
+ running_html: Hentet %{ago} · lease udløber %{time}
577
+ scheduled_html: Planlagt — kører %{time}
578
+ waiting_html: Venter — %{count} foran
579
+ waiting_priority_html: Venter — %{count} foran med denne prioritet
580
+ waiting_unknown_html: Venter på at blive hentet
359
581
  retry: Forsøg igen
360
- title: Mislykkede job
361
- index:
362
- discard_all: Kassér alle
363
- discard_all_confirm: Kassér alle mislykkede job?
364
- discard_all_enqueued_notice: Kasserede %{count} ventende jobs og frigav deres låse.
365
- discard_selected: Kassér valgte
366
- discard_selected_confirm: Kassér valgte elementer?
367
- discarded_selected:
368
- one: Kasserede 1 valgt element.
369
- other: Kasserede %{count} valgte elementer.
370
- none_selected: Ingen elementer valgt.
371
- retry_all: Forsøg alle igen
372
- retry_all_confirm: Forsøg alle mislykkede job igen?
373
- title: Job
582
+ retry_confirm: Nulstil synlighedstimeout og prøv igen?
583
+ states:
584
+ blocked: Blokeret
585
+ ready: Klar
586
+ retrying: Prøver igen
587
+ running: Kører
588
+ scheduled: Planlagt
589
+ tabs:
590
+ all: Alle
591
+ blocked: Blokeret
592
+ ready: Klar
593
+ retrying: Prøver igen
594
+ running: Kører
595
+ scheduled: Planlagt
596
+ tabs_label: Jobtilstande
597
+ view_failure: Vis fejl
598
+ view_locks: Vis låse
374
599
  show:
375
600
  back: Tilbage til job
376
601
  backtrace: Stacktrace
@@ -423,6 +648,7 @@ da:
423
648
  other: Kassér de %{count} job der er parkeret bag denne nøgle? De vil aldrig køre.
424
649
  empty: Ingen samtidighedsnøgler i brug
425
650
  headers:
651
+ actions: Handlinger
426
652
  in_use: I brug
427
653
  key: Nøgle
428
654
  lease: Lease
@@ -456,6 +682,7 @@ da:
456
682
  discard_selected_confirm: Vil du kassere valgte låse?
457
683
  empty: Ingen aktive låse
458
684
  headers:
685
+ actions: Handlinger
459
686
  age: Alder
460
687
  lock_key: Låsenøgle
461
688
  msg_id: Besked-ID
@@ -483,8 +710,6 @@ da:
483
710
  pending: Afventer
484
711
  published: Publiceret
485
712
  stats:
486
- no_age: "—"
487
- oldest_age: "%{seconds}s"
488
713
  oldest_unpublished: Ældste upublicerede
489
714
  total: Total
490
715
  unpublished: Upubliceret
@@ -493,18 +718,76 @@ da:
493
718
  index:
494
719
  title: Processer
495
720
  processes_table:
721
+ capsule: capsule %{capsule} · proces %{process}
496
722
  empty: Ingen processer kører
497
723
  headers:
498
- hostname: Værtsnavn
499
- kind: Type
500
- last_heartbeat: Sidste Heartbeat
501
- metadata: Metadata
502
- pid: PID
724
+ activity: Aktivitet
725
+ heartbeat: Heartbeat
726
+ process: Proces
727
+ recycle: Genbrug
503
728
  status: Status
504
- rates:
505
- dequeued: hentet
506
- failed: mislykkedes
507
- processed: behandlet
729
+ no_raw_metadata: Ingen andre metadata
730
+ raw_metadata: Andre metadata
731
+ started: Startet
732
+ under_supervisor: under supervisor %{pid}
733
+ uptime: oppe %{duration}
734
+ state:
735
+ activity:
736
+ buffered: "%{number} i buffer"
737
+ busy_slots: "%{busy}/%{capacity} slots optaget"
738
+ busy_threads: "%{busy}/%{capacity} tråde optaget"
739
+ consumes: Forbruger %{topics}
740
+ drains: Tømmer %{queues}
741
+ drains_all: Tømmer alle køer
742
+ failed_rate: "%{rate} fejlede/s"
743
+ handled: "%{number} håndteret"
744
+ maintenance: Kører vedligehold hvert %{interval} (planlagte jobs, døde processer, arkiver)
745
+ outbox: Publicerer outbox-poster
746
+ rate: "%{rate} jobs/s"
747
+ schedule:
748
+ one: Kører %{count} tilbagevendende opgave, tjekker hvert %{interval}
749
+ other: Kører %{count} tilbagevendende opgaver, tjekker hvert %{interval}
750
+ slots:
751
+ one: "%{count} slot"
752
+ other: "%{count} slots"
753
+ supervises: Overvåger %{children}
754
+ supervises_none: Overvåger ingen processer på denne vært
755
+ threads:
756
+ one: "%{count} tråd"
757
+ other: "%{count} tråde"
758
+ kinds:
759
+ consumer:
760
+ one: "%{count} consumer"
761
+ other: "%{count} consumers"
762
+ dispatcher:
763
+ one: dispatcher
764
+ other: "%{count} dispatchers"
765
+ outbox_poller:
766
+ one: outbox-poller
767
+ other: "%{count} outbox-pollere"
768
+ scheduler:
769
+ one: scheduler
770
+ other: "%{count} schedulere"
771
+ worker:
772
+ one: "%{count} worker"
773
+ other: "%{count} workers"
774
+ next:
775
+ stale_reaped: sandsynligvis død; fjernes ved dispatcherens næste oprydning (inden for %{within})
776
+ stale_unreaped: sandsynligvis død; ingen levende dispatcher til at fjerne den
777
+ stalled_maintenance: planlagte jobs, oprydning af døde processer og arkivkomprimering står stille
778
+ stalled_schedule: tilbagevendende opgaver sættes ikke i kø
779
+ stalled_standalone: ingen supervisor til at genstarte den
780
+ stalled_supervised: supervisorens watchdog genstarter den
781
+ reasons:
782
+ healthy_detection_off_html: Heartbeat %{ago} (grænse %{limit}) · stop-detektion slået fra
783
+ healthy_heartbeat_html: Heartbeat %{ago} (grænse %{limit})
784
+ healthy_loop_html: Løkken tikkede %{ago} (grænse %{limit})
785
+ stale_html: Intet heartbeat i %{age} (grænse %{limit})
786
+ stalled_html: Løkken tikkede sidst %{ago} (grænse %{limit})
787
+ recycle:
788
+ jobs: "%{done} / %{limit} jobs"
789
+ lifetime: oppe %{uptime} / %{limit}
790
+ memory: "%{used} / %{limit} MB"
508
791
  queues:
509
792
  destroy:
510
793
  success: Køen %{name} slettet.
@@ -517,59 +800,70 @@ da:
517
800
  headers:
518
801
  actions: Handlinger
519
802
  depth: Dybde
520
- newest: Nyeste (s)
521
- oldest_claimable: Ældste tilgængelig (s)
803
+ newest: Nyeste
804
+ oldest_claimable: Ældste tilgængelig
522
805
  parked: Parkeret
523
806
  queue: Kø
524
807
  total_ever: Total nogensinde
525
808
  visible: Synlig
526
809
  pause: Pause
527
810
  pause_confirm: Pause behandling i %{name}?
528
- paused: Pauset
529
811
  purge: Rens
530
812
  purge_confirm: Rens alle beskeder fra %{name}?
531
813
  resume: Genoptag
532
814
  show:
533
- arguments: Argumenter
534
815
  back: Tilbage til køer
535
816
  delete_confirm: Slet denne kø permanent? Dette kan ikke fortrydes.
536
817
  delete_queue: Slet kø
537
- depth: 'Dybde:'
538
- discard: Kassér
539
- discard_confirm: Kassér denne besked?
540
- empty: Køen er tom
541
- full_json_payload: Fuld JSON-payload
542
- headers:
543
- enqueued: Sat i kø
544
- id: ID
545
- job_class: Jobklasse
546
- reads: Læsninger
547
- vt: VT
548
- headers_section: Headers
549
- job_id: 'Job ID:'
818
+ dlq_link: Prøv igen eller kassér dem på Dead Letter-siden
819
+ dlq_pointer:
820
+ one: Dead letter-kø for %{logical} — %{count} besked.
821
+ other: Dead letter-kø for %{logical} — %{count} beskeder.
550
822
  message_discard_failed: Kunne ikke kassere besked.
551
823
  message_discarded: Besked kasseret.
552
824
  message_retried: Beskedens synlighed nulstillet.
553
825
  message_retry_failed: Kunne ikke prøve besked igen.
554
- metadata: Metadata
555
- metadata_labels:
556
- last_read: 'Sidst læst:'
557
- locale: 'Locale:'
558
- priority: 'Prioritet:'
559
- queue: 'Kø:'
560
- scheduled: 'Planlagt:'
561
- timezone: 'Tidszone:'
562
- visible_at: 'Synlig fra:'
563
- oldest: 'Ældste:'
564
- oldest_claimable: 'Ældste tilgængelig:'
565
- parked: 'Parkeret:'
826
+ metrics:
827
+ claimable: Klar nu
828
+ depth: Dybde
829
+ oldest: Ældste
830
+ oldest_claimable: Ældste klar
831
+ parked: Parkeret
832
+ total: Total nogensinde
833
+ other_levels: 'Andre prioritetsniveauer:'
566
834
  pause: Pause
567
835
  pause_confirm: Pause behandling?
568
836
  purge_confirm: Rens alle beskeder?
569
837
  purge_queue: Rens kø
570
838
  resume: Genoptag
571
- retry: Prøv igen
572
- retry_confirm: Nulstil synlighedstimeout og prøv igen?
839
+ summary:
840
+ backlog_html: "%{visible} klar til afhentning nu, ældste har ventet %{age} · %{parked} parkeret (planlagt eller genforsøg)"
841
+ backlog_parked_only_html: Intet klar til afhentning nu · %{parked} parkeret (planlagt eller genforsøg)
842
+ dlq_html: 'Dead letter-kø for %{logical}: job havner her efter %{max} mislykkede forsøg'
843
+ drained_by_html:
844
+ one: Tømmes af %{capsules} (%{count} sund worker)
845
+ other: Tømmes af %{capsules} (%{count} sunde workers)
846
+ drained_live_html:
847
+ one: Tømmes af %{count} sund worker, der lytter på denne kø
848
+ other: Tømmes af %{count} sunde workers, der lytter på denne kø
849
+ drained_wildcard_html:
850
+ one: Tømmes af en wildcard-worker-kapsel (%{count} sund worker)
851
+ other: Tømmes af en wildcard-worker-kapsel (%{count} sunde workers)
852
+ empty_html: Intet venter
853
+ handler_html: Event handler-kø — tømmes af consumers (%{count} sunde)
854
+ no_consumers_html:
855
+ one: Event handler-kø uden sund consumer — %{count} event venter
856
+ other: Event handler-kø uden sund consumer — %{count} events venter
857
+ no_workers_html:
858
+ one: Ingen sund worker kører — %{count} job kan afhentes, men intet afhenter det
859
+ other: Ingen sund worker kører — %{count} job kan afhentes, men intet afhenter dem
860
+ not_drained_html: Ingen worker-kapsel tømmer denne kø — job venter, indtil en er konfigureret
861
+ paused_circuit_breaker_html: 'Automatisk sat på pause %{ago} efter %{failures} fejl i træk — genoptages %{time} (udløsning #%{trip})'
862
+ paused_operator_html: Sat på pause %{ago} — %{reason}
863
+ paused_operator_no_reason_html: Sat på pause %{ago} af en operatør
864
+ priority_level_html: Prioritetsniveau %{level} af %{logical}
865
+ stream_html: Stream-kø — leveres ved peek, tømmes ikke af workers
866
+ summary_label: Køoversigt
573
867
  table_health:
574
868
  headers:
575
869
  bloat: Bloat
@@ -579,8 +873,6 @@ da:
579
873
  table: Tabel
580
874
  oldest_txn: 'Ældste åbne transaktion:'
581
875
  title: Tabelhelbred
582
- total: 'Total:'
583
- visible: 'Synlig:'
584
876
  recurring_tasks:
585
877
  index:
586
878
  task_count: