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 @@ de:
41
41
  title: Aktive Prozesse
42
42
  queue_health:
43
43
  dead_tuples: Tote Tupel
44
+ empty: Noch keine Queue-Tabellen zu messen
44
45
  headers:
45
46
  bloat: Bloat
46
47
  dead: Tot
@@ -60,14 +61,34 @@ de:
60
61
  one: "%{count} Tabelle benötigt Vacuum"
61
62
  other: "%{count} Tabellen benötigen Vacuum"
62
63
  title: Warteschlangen-Gesundheit
64
+ words:
65
+ bloat:
66
+ critical: "%{ratio} bei %{table} — Lesezugriffe werden langsamer; jetzt Vacuum ausführen (kritisch ab %{critical}, Warnung ab %{warn})"
67
+ none: Noch nichts zu messen
68
+ ok: "%{ratio} bei %{table} — in Ordnung (Warnung ab %{warn}, kritisch ab %{critical})"
69
+ warn: "%{ratio} bei %{table} — Vacuum fällig (Warnung ab %{warn}, kritisch ab %{critical})"
70
+ dead_tuples:
71
+ ok: In Ordnung — Warnung ab %{limit} toten Zeilen
72
+ warn: Über %{limit} — Autovacuum hinkt hinterher; die Tabelle unten zeigt, wo
73
+ transaction:
74
+ critical: Über %{critical} — Vacuum kann keine Zeilen freigeben, bis sie endet; finde sie in pg_stat_activity (Warnung bei %{warn}; die Zustandsbewertung wird nach %{verdict} schlechter)
75
+ none: Keine offene Transaktion — Vacuum kann alle toten Zeilen freigeben (Warnung bei %{warn}, Alarm bei %{critical}; die Zustandsbewertung wird nach %{verdict} schlechter)
76
+ ok: In Ordnung — Warnung bei %{warn}, Alarm bei %{critical}; die Zustandsbewertung wird nach %{verdict} schlechter
77
+ warn: Über %{warn} — eine lange Transaktion hindert Vacuum daran, Zeilen freizugeben (Alarm bei %{critical}; die Zustandsbewertung wird nach %{verdict} schlechter)
78
+ vacuum:
79
+ critical: Über %{critical} — Autovacuum erreicht diese Tabellen nicht; prüfe seine Einstellungen (Warnung nach %{warn})
80
+ ok: In Ordnung — Warnung nach %{warn}, kritisch nach %{critical}
81
+ unknown: Nie vacuumiert, oder die Statistiken sind nicht verfügbar
82
+ warn: Über %{warn} — Autovacuum kommt möglicherweise nicht hinterher (kritisch nach %{critical})
63
83
  worst_bloat: Schlimmster Bloat
64
84
  queues_table:
65
85
  empty: Keine Warteschlangen gefunden
66
86
  headers:
67
87
  depth: Tiefe
68
- oldest_claimable: Älteste verfügbar (s)
88
+ oldest_claimable: Älteste verfügbar
69
89
  parked: Geparkt
70
90
  queue: Warteschlange
91
+ status: Status
71
92
  total: Gesamt
72
93
  visible: Sichtbar
73
94
  title: Warteschlangen
@@ -75,7 +96,9 @@ de:
75
96
  recent_failures:
76
97
  empty: Keine Fehler
77
98
  headers:
99
+ attempt: Versuch
78
100
  error: Fehler
101
+ job: Job
79
102
  queue: Warteschlange
80
103
  when: Wann
81
104
  title: Kürzliche Fehler
@@ -83,19 +106,72 @@ de:
83
106
  show:
84
107
  title: Dashboard
85
108
  stats_cards:
109
+ dead_lettered: Dead-lettered
110
+ dlq_newest_html: 'neuester: %{error_class} in %{job} %{ago}'
111
+ dlq_newest_legacy_html: 'neuester: %{job} %{ago} — kein Grund erfasst'
112
+ dlq_newest_no_error_html: 'neuester: %{job} %{ago} — kein Fehler erfasst'
113
+ dlq_none: Nichts ist dead-lettered
114
+ dlq_see_why: öffne die Dead-Letter-Seite, um zu sehen, warum jeder gestorben ist
86
115
  enqueued: Eingereiht
87
- failed_dlq: Fehlgeschlagen / DLQ
88
- failed_dlq_labels: Fehlgeschlagen / Dead Lettered
116
+ enqueued_detail: "%{claimable} jetzt abholbar · %{waiting} geplant, laufend oder in Wiederholung"
117
+ enqueued_paused:
118
+ one: "%{count} in pausierten Warteschlangen"
119
+ other: "%{count} in pausierten Warteschlangen"
89
120
  parked_jobs: Geparkte Jobs
90
121
  parked_jobs_oldest: ältester %{age}
91
122
  processes: Prozesse
123
+ processes_detail: "%{healthy} gesund · %{stalled} hängend · %{stale} veraltet"
124
+ processes_none: Nichts läuft — kein Job wird abgeholt
125
+ processes_stale: veraltete Prozesse senden keine Heartbeats mehr; ihre laufenden Jobs werden erneut ausgeführt, wenn ihr Visibility Timeout abläuft
92
126
  queues: Warteschlangen
127
+ queues_detail: "%{paused} pausiert · %{dlq} Dead Letter"
128
+ queues_undrained:
129
+ one: "%{count} enthält Jobs, die niemand abarbeitet"
130
+ other: "%{count} enthalten Jobs, die niemand abarbeitet"
93
131
  recurring: Wiederkehrend
132
+ recurring_detail: Aufgaben, die der Scheduler nach Zeitplan einreiht
133
+ retrying: Wiederholung
134
+ retrying_due:
135
+ one: "%{count} jetzt fällig"
136
+ other: "%{count} jetzt fällig"
137
+ retrying_newest: neuester Fehler %{error_class}
138
+ retrying_next_html: nächster Versuch %{time}
139
+ retrying_none: Nichts wird wiederholt
94
140
  throughput: Durchsatz
95
- throughput_unit: Nachrichten/s
96
- view_tasks: Aufgaben anzeigen
97
- visible: sichtbar
141
+ throughput_detail: Aufträge/Min in den letzten %{minutes} Min
142
+ throughput_unavailable: benötigt Job-Statistiken (rails g pgbus:add_job_stats)
143
+ verdict:
144
+ links:
145
+ dlq: Dead Letters
146
+ processes: Prozesse
147
+ look_at: 'Siehe:'
148
+ meaning:
149
+ degraded: Etwas braucht Aufmerksamkeit, aber Jobs laufen weiter. /readyz antwortet weiterhin bereit.
150
+ ok: Jede Warteschlange mit Arbeit wird abgearbeitet, und jeder Prozess sendet Heartbeats. /readyz antwortet bereit.
151
+ stalled: Jobs warten, und niemand holt sie ab. /readyz antwortet nicht bereit (503).
152
+ statuses:
153
+ degraded: DEGRADED
154
+ ok: OK
155
+ stalled: STALLED
156
+ title: 'Zustand: %{status}'
157
+ unavailable: Zustandsbewertung nicht verfügbar — die zugrunde liegenden Prüfungen konnten nicht gelesen werden; siehe Log
98
158
  dead_letter:
159
+ detail:
160
+ backtrace: Backtrace (erste Zeilen)
161
+ died: 'Gestorben:'
162
+ dlq: 'Dead-Letter-Queue:'
163
+ error_from_attempt: Fehler aus Versuch %{attempt}; Versuche %{from}–%{to} haben keinen Fehler erfasst.
164
+ source: 'Verschoben von:'
165
+ sources:
166
+ consumer: Event-Consumer
167
+ worker: Job-Worker
168
+ why: Warum er gestorben ist
169
+ filters:
170
+ all: Alle
171
+ clear_error_class: Filter entfernen
172
+ error_class: 'Fehler: %{error_class}'
173
+ filter_error_class: Nur %{error_class} anzeigen
174
+ label: Dead Letters filtern
99
175
  index:
100
176
  discard_all: Alle verwerfen
101
177
  discard_all_confirm: Alle DLQ-Nachrichten dauerhaft verwerfen?
@@ -115,11 +191,13 @@ de:
115
191
  empty: Dead Letter Queue ist leer
116
192
  full_json_payload: Vollständige JSON-Nutzlast
117
193
  headers:
118
- enqueued: Eingereiht
194
+ actions: Aktionen
195
+ attempts: Versuche
196
+ died: Gestorben
119
197
  id: ID
120
- job_class: Job-Klasse
121
- reads: Liest
122
- source_queue: Quellwarteschlange
198
+ job: Job
199
+ reason: Grund
200
+ source_queue: Quell-Queue
123
201
  headers_section: Header
124
202
  job_id: 'Job-ID:'
125
203
  metadata: Metadaten
@@ -131,6 +209,16 @@ de:
131
209
  visible_at: 'Sichtbar um:'
132
210
  retry: Erneut versuchen
133
211
  total_label: Nachrichten in der Dead-Letter-Warteschlange
212
+ view: Ansehen
213
+ reasons:
214
+ error_earlier_attempt_html: 'Wiederholungen ausgeschöpft. Letzter erfasster Fehler, aus Versuch %{error_attempt}: %{error_class}: %{error_message}'
215
+ error_html: 'Wiederholungen ausgeschöpft. Letzter Fehler: %{error_class}: %{error_message}'
216
+ event_no_error_html: Handler ist bei %{attempts} Zustellungen gescheitert (max. %{max}) — kein Handler-Fehler erfasst
217
+ no_error_recorded_html: "%{max} Wiederholungen nach %{attempts} Lesevorgängen überschritten — kein Fehler erfasst; jeder fehlgeschlagene Versuch ist abgestürzt, bevor er berichten konnte"
218
+ not_recorded_html: Grund nicht erfasst (vor pgbus %{version} in die DLQ verschoben)
219
+ retried_before:
220
+ one: Schon einmal aus der DLQ wiederholt.
221
+ other: Schon %{count}-mal aus der DLQ wiederholt.
134
222
  show:
135
223
  back: Zurück zur DLQ
136
224
  context: Kontext
@@ -138,8 +226,10 @@ de:
138
226
  discard_confirm: Dauerhaft verwerfen?
139
227
  headers: Header
140
228
  labels:
229
+ attempts: Versuche
230
+ died: Gestorben
231
+ dlq: Dead-Letter-Queue
141
232
  enqueued_at: Eingereiht am
142
- read_count: Anzahl der Lesevorgänge
143
233
  source_queue: Quellwarteschlange
144
234
  visibility_timeout: Sichtbarkeits-Timeout
145
235
  not_found: Nachricht nicht gefunden
@@ -163,6 +253,7 @@ de:
163
253
  mark_handled_failed: Ereignis konnte nicht als bearbeitet markiert werden.
164
254
  marked_handled: Ereignis als bearbeitet markiert.
165
255
  none_selected: Keine Ereignisse ausgewählt.
256
+ payload_redacted: 'Nicht gespeichert: Die Nutzlast enthält noch geschwärzte ([FILTERED]) Werte, die die echten ersetzen würden.'
166
257
  payload_update_failed: Nutzlast konnte nicht aktualisiert werden. Überprüfen Sie, ob das JSON gültig ist.
167
258
  payload_updated: Nutzlast aktualisiert und Ereignis erneut in die Warteschlange gestellt.
168
259
  replay_failed: Ereignis nicht gefunden oder konnte nicht erneut abgespielt werden.
@@ -170,56 +261,118 @@ de:
170
261
  reroute_failed: Ereignis konnte nicht umgeleitet werden.
171
262
  rerouted: Ereignis an Ziel-Handler umgeleitet.
172
263
  index:
173
- discard_selected: Ausgewählte verwerfen
174
- discard_selected_confirm: Ausgewählte Ereignisse verwerfen?
175
- pending_empty: Keine ausstehenden Ereignisse
176
- pending_headers:
177
- enqueued: In die Warteschlange gestellt
178
- handler_queue: Handler-Warteschlange
179
- id: ID
180
- reads: Lesevorgänge
181
- routing_key: Routing-Schlüssel
182
264
  pending_title: Ausstehende Ereignisse
183
- processed_empty: Noch keine Ereignisse verarbeitet
184
- processed_headers:
185
- event_id: Ereignis-ID
186
- handler: Handler
187
- processed_at: Verarbeitet am
188
265
  processed_title: Verarbeitete Ereignisse
266
+ subscribers:
267
+ covered: Von einem laufenden Consumer abgearbeitet
268
+ uncovered: Kein laufender Consumer deckt dieses Muster ab
269
+ unknown: Consumer-Abdeckung unbekannt
270
+ view_pending: Ausstehende anzeigen
189
271
  subscribers_empty: Keine Abonnenten registriert
190
272
  subscribers_headers:
273
+ consumer: Consumer
191
274
  handler: Handler
192
275
  pattern: Muster
276
+ pending: Ausstehend
193
277
  queue: Warteschlange
194
278
  subscribers_title: Registrierte Abonnenten
195
279
  title: Ereignisse
196
- pending_table:
197
- arguments: Nutzlast
280
+ list:
198
281
  context: Kontext
199
282
  discard: Verwerfen
200
283
  discard_confirm: Dieses Ereignis verwerfen? Es wird archiviert.
284
+ discard_failure_confirm: Dieses fehlgeschlagene Ereignis verwerfen? Seine Nachricht ist nicht mehr in der Warteschlange.
285
+ discard_selected: Ausgewählte verwerfen
286
+ discard_selected_confirm: Ausgewählte Ereignisse verwerfen?
201
287
  edit_payload: Bearbeiten & erneut versuchen
202
288
  edit_payload_confirm: Nutzlast aktualisieren und dieses Ereignis erneut in die Warteschlange stellen?
203
289
  edit_payload_label: 'JSON-Nutzlast:'
290
+ empty:
291
+ all: Keine ausstehenden Ereignisse
292
+ ready: Keine Ereignisse warten auf Verarbeitung
293
+ retrying: Keine Ereignisse warten auf einen neuen Versuch
294
+ running: Keine Ereignisse in Verarbeitung
295
+ scheduled: Keine geplanten Ereignisse
204
296
  event_id: 'Ereignis-ID:'
205
297
  full_json_payload: Vollständige JSON-Nutzlast
298
+ headers:
299
+ actions: Aktionen
300
+ attempts: Versuche
301
+ event: Ereignis
302
+ handler: Handler
303
+ id: ID
304
+ reason: Nächster Lauf / Grund
305
+ state: Zustand
206
306
  headers_section: Header
207
307
  mark_handled: Als bearbeitet markieren
208
- mark_handled_confirm: Dieses Ereignis als bearbeitet markieren? Es wird archiviert und bei der Wiedergabe übersprungen.
308
+ mark_handled_confirm: Dieses Ereignis als verarbeitet markieren? Die Nachricht wird archiviert und der Handler führt sie nicht aus.
209
309
  metadata: Metadaten
210
310
  metadata_labels:
311
+ enqueued: 'Eingereiht:'
211
312
  last_read: 'Zuletzt gelesen:'
313
+ published: 'Veröffentlicht:'
212
314
  read_count: 'Leseanzahl:'
213
315
  visible_at: 'Sichtbar ab:'
316
+ payload: Nutzlast
317
+ reasons:
318
+ handling_html: Wird von %{handler} verarbeitet — abgeholt %{ago} · Lease läuft ab %{time}
319
+ lease_expired_html: Lease abgelaufen (Consumer vermutlich abgestürzt) — wird erneut an %{handler} zugestellt, Versuch %{attempt}
320
+ no_consumer_for_queue_html: Kein laufender Consumer abonniert %{pattern} (%{handler})
321
+ no_consumers_html: Kein gesunder Consumer läuft
322
+ orphaned_html: Fehlgeschlagen mit %{error} in %{handler} — Nachricht nicht mehr in der Warteschlange
323
+ paused_html: Warteschlange pausiert
324
+ retrying_dlq_html: "%{handler} Versuch %{attempt}/%{max} fehlgeschlagen: %{error} — der nächste Lesevorgang verschiebt es in die DLQ"
325
+ retrying_due_html: "%{handler} Versuch %{attempt}/%{max} fehlgeschlagen: %{error} — nächster Versuch jetzt fällig"
326
+ retrying_html: "%{handler} Versuch %{attempt}/%{max} fehlgeschlagen: %{error} — nächster Versuch %{time}"
327
+ scheduled_html: Geplant — wird von %{handler} verarbeitet %{time}
328
+ waiting_html: 'Wartet — %{count} davor · als Nächstes: %{handler}'
329
+ waiting_unknown_html: Wartet auf %{handler}
214
330
  reroute: Umleiten
215
331
  reroute_confirm: Dieses Ereignis an einen anderen Handler umleiten?
216
332
  reroute_label: 'Ziel-Handler:'
333
+ states:
334
+ ready: Bereit
335
+ retrying: Wiederholung
336
+ running: In Verarbeitung
337
+ scheduled: Geplant
338
+ tabs:
339
+ all: Alle
340
+ ready: Bereit
341
+ retrying: Wiederholung
342
+ running: In Verarbeitung
343
+ scheduled: Geplant
344
+ tabs_label: Ereigniszustände
345
+ view_failure: Fehler anzeigen
346
+ processed:
347
+ empty: Noch keine Ereignisse verarbeitet
348
+ headers:
349
+ actions: Aktionen
350
+ event_id: Ereignis-ID
351
+ handler: Handler
352
+ reason: Grund
353
+ state: Zustand
354
+ reasons:
355
+ abandoned_html: Claim verstummt %{ago} — die nächste Zustellung führt den Handler erneut aus
356
+ completed_html: Abgeschlossen %{ago}
357
+ completed_legacy_html: Erfasst %{ago} (einphasiger Claim; Upgrade mit pgbus:add_processed_event_completion)
358
+ handling_html: In Verarbeitung — Claim aufgefrischt %{ago}
359
+ replay: Erneut abspielen
360
+ replay_confirm: Dieses Ereignis unter einer neuen Ereignis-ID erneut an seinen Handler zustellen? Der Handler läuft erneut.
361
+ replay_unavailable:
362
+ no_handler: Handler nicht mehr registriert
363
+ not_archived: Nicht mehr im Archiv
364
+ states:
365
+ abandoned: Verstummt
366
+ completed: Abgeschlossen
367
+ handling: In Verarbeitung
217
368
  show:
218
369
  back: Zurück zu Ereignissen
219
370
  labels:
371
+ completed_at: Abgeschlossen am
220
372
  event_id: Ereignis-ID
221
373
  handler: Handler
222
374
  processed_at: Verarbeitet am
375
+ state: Status
223
376
  not_found: Ereignis nicht gefunden
224
377
  title: Ereignis %{event_id}
225
378
  helpers:
@@ -231,6 +384,7 @@ de:
231
384
  bulk_select_row: "%{id} auswählen"
232
385
  bulk_selected: ausgewählt
233
386
  pagination:
387
+ label: Seitennavigation
234
388
  next: Weiter
235
389
  previous: Zurück
236
390
  showing: Zeige %{from}–%{to} von %{total}
@@ -245,24 +399,50 @@ de:
245
399
  healthy: Gesund
246
400
  stale: Veraltet
247
401
  stalled: Blockiert
402
+ time:
403
+ absolute_format: "%Y-%m-%d %H:%M:%S %Z"
404
+ clock_format: "%H:%M"
405
+ future: in %{distance}
406
+ now: jetzt
407
+ past: vor %{distance}
408
+ range:
409
+ days:
410
+ one: "%{count} Tag"
411
+ other: "%{count} Tage"
412
+ hours:
413
+ one: "%{count} Stunde"
414
+ other: "%{count} Stunden"
415
+ minutes:
416
+ one: "%{count} Minute"
417
+ other: "%{count} Minuten"
418
+ units:
419
+ days: "%{count}T"
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: Fehler beim Laden der Diagrammdaten
252
- latency: Warteschlangenlatenz (ms)
427
+ captions:
428
+ latency: Jobs warteten durchschnittlich %{avg}, bevor ein Worker sie übernahm, p95 %{p95}
429
+ status: "%{success} erfolgreich, %{failed} fehlgeschlagen, %{dead_lettered} dead-lettered"
430
+ throughput_html: "%{total} Aufträge in den letzten %{range}, Spitze %{peak} Aufträge/Min %{at}"
431
+ data_table: Datentabelle
432
+ latency: Warteschlangenlatenz
253
433
  latency_avg: Durchschnitt
254
434
  latency_p95: P95
255
435
  no_data: Noch keine Daten
256
436
  series_name: Aufträge/Min
257
437
  status_distribution: Statusverteilung
258
- throughput: Durchsatz (Aufträge/Min)
438
+ throughput: Durchsatz
259
439
  description_html: Leistungskennzahlen für die letzten %{range}
260
440
  latency_by_queue:
261
441
  empty: Noch keine Latenzdaten vorhanden
262
442
  headers:
263
- avg: Durchschnitt (ms)
443
+ avg: Durchschnitt
264
444
  count: Anzahl
265
- p95: P95 (ms)
445
+ p95: P95
266
446
  queue: Warteschlange
267
447
  title: Latenz nach Warteschlange
268
448
  live_streams:
@@ -282,6 +462,10 @@ de:
282
462
  job_class: Job-Klasse
283
463
  max: Max
284
464
  title: Langsamste Job-Klassen (durchschnittliche Dauer)
465
+ statuses:
466
+ dead_lettered: Dead-lettered
467
+ failed: Fehlgeschlagen
468
+ success: Erfolgreich
285
469
  streams:
286
470
  summary:
287
471
  active: Aktiv
@@ -310,6 +494,20 @@ de:
310
494
  p99_latency: P99 Latenz
311
495
  succeeded: Erfolgreich
312
496
  total_jobs: Gesamtanzahl der Jobs
497
+ tables:
498
+ captions:
499
+ latency_minute: Warteschlangenlatenz pro Minute
500
+ latency_step: Warteschlangenlatenz pro %{step}
501
+ status: Aufträge nach Endstatus
502
+ throughput_minute: Aufträge pro Minute
503
+ throughput_step: Aufträge pro %{step}
504
+ headers:
505
+ avg: Durchschnitt
506
+ from: Von
507
+ highest_p95: Höchster p95
508
+ jobs: Aufträge
509
+ share: Anteil
510
+ status: Status
313
511
  time_ranges:
314
512
  1h: 1h
315
513
  24h: 24h
@@ -317,60 +515,87 @@ de:
317
515
  7d: 7d
318
516
  title: Einblicke
319
517
  jobs:
320
- enqueued_table:
518
+ index:
519
+ discard_all: Alle verwerfen
520
+ discard_all_confirm: Alle fehlgeschlagenen Jobs verwerfen?
521
+ discard_all_enqueued_notice: "%{count} eingereihte Jobs verworfen und Sperren freigegeben."
522
+ discard_selected: Ausgewählte verwerfen
523
+ discard_selected_confirm: Ausgewählte Elemente verwerfen?
524
+ discarded_selected:
525
+ one: 1 ausgewähltes Element verworfen.
526
+ other: "%{count} ausgewählte Elemente verworfen."
527
+ none_selected: Keine Elemente ausgewählt.
528
+ retry_all: Alle wiederholen
529
+ retry_all_confirm: Alle fehlgeschlagenen Jobs wiederholen?
530
+ title: Jobs
531
+ list:
321
532
  arguments: Argumente
322
533
  discard: Verwerfen
323
- discard_all: Alle verwerfen
324
- discard_all_confirm: Alle eingereihten Jobs verwerfen und ihre Sperren freigeben? Dies kann nicht rückgängig gemacht werden.
325
- discard_confirm: Diese Nachricht verwerfen?
326
- empty: Keine eingereihten Jobs
534
+ discard_all_enqueued: Alle eingereihten verwerfen
535
+ discard_all_enqueued_confirm: Alle eingereihten Jobs verwerfen und ihre Sperren freigeben? Dies kann nicht rückgängig gemacht werden.
536
+ discard_confirm: Diesen Job verwerfen?
537
+ empty:
538
+ all: Keine Jobs
539
+ blocked: Keine durch ein Nebenläufigkeitslimit blockierten Jobs
540
+ ready: Keine Jobs warten auf Ausführung
541
+ retrying: Keine Jobs warten auf Wiederholung
542
+ running: Keine laufenden Jobs
543
+ scheduled: Keine geplanten Jobs
327
544
  full_json_payload: Vollständige JSON-Nutzlast
328
545
  headers:
329
- enqueued: Eingereiht
546
+ actions: Aktionen
547
+ attempts: Versuche
330
548
  id: ID
331
- job_class: Job-Klasse
549
+ job: Job
332
550
  queue: Warteschlange
333
- reads: Lesevorgänge
551
+ reason: Nächster Lauf / Grund
552
+ state: Zustand
334
553
  headers_section: Header
335
554
  job_id: 'Job-ID:'
336
555
  metadata: Metadaten
337
556
  metadata_labels:
557
+ concurrency_key: 'Nebenläufigkeitsschlüssel:'
558
+ enqueued: 'Eingereiht:'
338
559
  last_read: 'Letzter Lesevorgang:'
339
560
  locale: 'Sprache:'
340
561
  priority: 'Priorität:'
341
- queue: 'Warteschlange:'
342
562
  scheduled: 'Geplant:'
343
563
  timezone: 'Zeitzone:'
344
564
  visible_at: 'Sichtbar ab:'
565
+ reasons:
566
+ blocked_html: Wartet auf einen Nebenläufigkeits-Slot für %{key} (belegt %{held}/%{limit}) · geparkt %{ago}
567
+ blocked_no_slots_html: Wartet auf einen Nebenläufigkeits-Slot für %{key} · geparkt %{ago}
568
+ lease_expired_html: Lease abgelaufen (Worker vermutlich abgestürzt) — wird erneut zugestellt, Versuch %{attempt}
569
+ no_workers_html: Kein gesunder Worker läuft
570
+ not_drained_html: Kein Worker arbeitet diese Warteschlange ab
571
+ orphaned_html: Fehlgeschlagen mit %{error} — Nachricht nicht mehr in der Warteschlange
572
+ paused_html: Warteschlange pausiert
573
+ retrying_dlq_html: 'Versuch %{attempt}/%{max} fehlgeschlagen: %{error} — der nächste Lesevorgang verschiebt ihn in die DLQ'
574
+ retrying_due_html: 'Versuch %{attempt}/%{max} fehlgeschlagen: %{error} — nächster Versuch jetzt fällig'
575
+ retrying_html: 'Versuch %{attempt}/%{max} fehlgeschlagen: %{error} — nächster Versuch %{time}'
576
+ running_html: Abgeholt %{ago} · Lease läuft ab %{time}
577
+ scheduled_html: Geplant — läuft %{time}
578
+ waiting_html: Wartet — %{count} davor
579
+ waiting_priority_html: Wartet — %{count} davor mit dieser Priorität
580
+ waiting_unknown_html: Wartet auf Abholung
345
581
  retry: Wiederholen
346
582
  retry_confirm: Sichtbarkeits-Timeout zurücksetzen und erneut versuchen?
347
- title: Eingereihte Jobs
348
- failed_table:
349
- discard: Verwerfen
350
- discard_confirm: Diesen Job verwerfen?
351
- empty: Keine fehlgeschlagenen Jobs
352
- headers:
353
- actions: Aktionen
354
- error: Fehler
355
- failed: Fehlgeschlagen
356
- id: ID
357
- queue: Warteschlange
358
- retries: Wiederholungen
359
- retry: Wiederholen
360
- title: Fehlgeschlagene Jobs
361
- index:
362
- discard_all: Alle verwerfen
363
- discard_all_confirm: Alle fehlgeschlagenen Jobs verwerfen?
364
- discard_all_enqueued_notice: "%{count} eingereihte Jobs verworfen und Sperren freigegeben."
365
- discard_selected: Ausgewählte verwerfen
366
- discard_selected_confirm: Ausgewählte Elemente verwerfen?
367
- discarded_selected:
368
- one: 1 ausgewähltes Element verworfen.
369
- other: "%{count} ausgewählte Elemente verworfen."
370
- none_selected: Keine Elemente ausgewählt.
371
- retry_all: Alle wiederholen
372
- retry_all_confirm: Alle fehlgeschlagenen Jobs wiederholen?
373
- title: Jobs
583
+ states:
584
+ blocked: Blockiert
585
+ ready: Bereit
586
+ retrying: Wiederholung
587
+ running: Läuft
588
+ scheduled: Geplant
589
+ tabs:
590
+ all: Alle
591
+ blocked: Blockiert
592
+ ready: Bereit
593
+ retrying: Wiederholung
594
+ running: Laufend
595
+ scheduled: Geplant
596
+ tabs_label: Job-Zustände
597
+ view_failure: Fehler anzeigen
598
+ view_locks: Sperren anzeigen
374
599
  show:
375
600
  back: Zurück zu Jobs
376
601
  backtrace: Stacktrace
@@ -423,6 +648,7 @@ de:
423
648
  other: Die %{count} hinter diesem Schlüssel geparkten Jobs verwerfen? Sie werden nie ausgeführt.
424
649
  empty: Keine Nebenläufigkeitsschlüssel in Verwendung
425
650
  headers:
651
+ actions: Aktionen
426
652
  in_use: Belegt
427
653
  key: Schlüssel
428
654
  lease: Lease
@@ -456,6 +682,7 @@ de:
456
682
  discard_selected_confirm: Ausgewählte Sperren verwerfen?
457
683
  empty: Keine aktiven Sperren
458
684
  headers:
685
+ actions: Aktionen
459
686
  age: Alter
460
687
  lock_key: Sperrschlüssel
461
688
  msg_id: Nachrichten-ID
@@ -483,8 +710,6 @@ de:
483
710
  pending: Ausstehend
484
711
  published: Veröffentlicht
485
712
  stats:
486
- no_age: "—"
487
- oldest_age: "%{seconds}s"
488
713
  oldest_unpublished: Ältester unveröffentlichter
489
714
  total: Gesamt
490
715
  unpublished: Unveröffentlicht
@@ -493,18 +718,76 @@ de:
493
718
  index:
494
719
  title: Prozesse
495
720
  processes_table:
721
+ capsule: Kapsel %{capsule} · Prozess %{process}
496
722
  empty: Keine Prozesse laufen
497
723
  headers:
498
- hostname: Hostname
499
- kind: Art
500
- last_heartbeat: Letzter Heartbeat
501
- metadata: Metadaten
502
- pid: PID
724
+ activity: Aktivität
725
+ heartbeat: Heartbeat
726
+ process: Prozess
727
+ recycle: Recycling
503
728
  status: Status
504
- rates:
505
- dequeued: entnommen
506
- failed: fehlgeschlagen
507
- processed: verarbeitet
729
+ no_raw_metadata: Keine weiteren Metadaten
730
+ raw_metadata: Weitere Metadaten
731
+ started: Gestartet
732
+ under_supervisor: unter Supervisor %{pid}
733
+ uptime: läuft seit %{duration}
734
+ state:
735
+ activity:
736
+ buffered: "%{number} gepuffert"
737
+ busy_slots: "%{busy}/%{capacity} Slots belegt"
738
+ busy_threads: "%{busy}/%{capacity} Threads belegt"
739
+ consumes: Konsumiert %{topics}
740
+ drains: Arbeitet %{queues} ab
741
+ drains_all: Arbeitet alle Queues ab
742
+ failed_rate: "%{rate} fehlgeschlagen/s"
743
+ handled: "%{number} verarbeitet"
744
+ maintenance: Wartung alle %{interval} (geplante Jobs, verwaiste Prozesse, Archive)
745
+ outbox: Veröffentlicht Outbox-Einträge
746
+ rate: "%{rate} Jobs/s"
747
+ schedule:
748
+ one: Führt %{count} wiederkehrende Aufgabe aus, prüft alle %{interval}
749
+ other: Führt %{count} wiederkehrende Aufgaben aus, prüft alle %{interval}
750
+ slots:
751
+ one: "%{count} Slot"
752
+ other: "%{count} Slots"
753
+ supervises: Überwacht %{children}
754
+ supervises_none: Überwacht keine Prozesse auf diesem Host
755
+ threads:
756
+ one: "%{count} Thread"
757
+ other: "%{count} Threads"
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: Outbox-Poller
767
+ other: "%{count} Outbox-Poller"
768
+ scheduler:
769
+ one: Scheduler
770
+ other: "%{count} Scheduler"
771
+ worker:
772
+ one: "%{count} Worker"
773
+ other: "%{count} Worker"
774
+ next:
775
+ stale_reaped: vermutlich tot; wird beim nächsten Durchlauf des Dispatchers entfernt (innerhalb von %{within})
776
+ stale_unreaped: vermutlich tot; kein laufender Dispatcher, der ihn entfernt
777
+ stalled_maintenance: geplante Jobs, Aufräumen verwaister Prozesse und Archivverdichtung kommen nicht voran
778
+ stalled_schedule: wiederkehrende Aufgaben werden nicht eingereiht
779
+ stalled_standalone: kein Supervisor, der ihn neu startet
780
+ stalled_supervised: der Watchdog des Supervisors startet ihn neu
781
+ reasons:
782
+ healthy_detection_off_html: Heartbeat %{ago} (Grenze %{limit}) · Hänger-Erkennung aus
783
+ healthy_heartbeat_html: Heartbeat %{ago} (Grenze %{limit})
784
+ healthy_loop_html: Schleife lief %{ago} (Grenze %{limit})
785
+ stale_html: Kein Heartbeat seit %{age} (Grenze %{limit})
786
+ stalled_html: Schleife lief zuletzt %{ago} (Grenze %{limit})
787
+ recycle:
788
+ jobs: "%{done} / %{limit} Jobs"
789
+ lifetime: läuft seit %{uptime} / %{limit}
790
+ memory: "%{used} / %{limit} MB"
508
791
  queues:
509
792
  destroy:
510
793
  success: Warteschlange %{name} gelöscht.
@@ -517,59 +800,70 @@ de:
517
800
  headers:
518
801
  actions: Aktionen
519
802
  depth: Tiefe
520
- newest: Neueste (s)
521
- oldest_claimable: Älteste verfügbar (s)
803
+ newest: Neueste
804
+ oldest_claimable: Älteste verfügbar
522
805
  parked: Geparkt
523
806
  queue: Warteschlange
524
807
  total_ever: Insgesamt jemals
525
808
  visible: Sichtbar
526
809
  pause: Pause
527
810
  pause_confirm: Verarbeitung für %{name} pausieren?
528
- paused: Pausiert
529
811
  purge: Bereinigen
530
812
  purge_confirm: Alle Nachrichten von %{name} löschen?
531
813
  resume: Fortsetzen
532
814
  show:
533
- arguments: Argumente
534
815
  back: Zurück zu Warteschlangen
535
816
  delete_confirm: Diese Warteschlange dauerhaft löschen? Dies kann nicht rückgängig gemacht werden.
536
817
  delete_queue: Warteschlange löschen
537
- depth: 'Tiefe:'
538
- discard: Verwerfen
539
- discard_confirm: Diese Nachricht verwerfen?
540
- empty: Warteschlange ist leer
541
- full_json_payload: Vollständige JSON-Nutzlast
542
- headers:
543
- enqueued: Eingereiht
544
- id: ID
545
- job_class: Job-Klasse
546
- reads: Lesevorgänge
547
- vt: VT
548
- headers_section: Header
549
- job_id: 'Job-ID:'
818
+ dlq_link: Auf der Dead-Letter-Seite wiederholen oder verwerfen
819
+ dlq_pointer:
820
+ one: Dead-Letter-Queue für %{logical} — %{count} Nachricht.
821
+ other: Dead-Letter-Queue für %{logical} — %{count} Nachrichten.
550
822
  message_discard_failed: Nachricht konnte nicht verworfen werden.
551
823
  message_discarded: Nachricht verworfen.
552
824
  message_retried: Sichtbarkeit der Nachricht zurückgesetzt.
553
825
  message_retry_failed: Nachricht konnte nicht wiederholt werden.
554
- metadata: Metadaten
555
- metadata_labels:
556
- last_read: 'Letzter Lesevorgang:'
557
- locale: 'Sprache:'
558
- priority: 'Priorität:'
559
- queue: 'Warteschlange:'
560
- scheduled: 'Geplant:'
561
- timezone: 'Zeitzone:'
562
- visible_at: 'Sichtbar ab:'
563
- oldest: 'Älteste:'
564
- oldest_claimable: 'Älteste verfügbar:'
565
- parked: 'Geparkt:'
826
+ metrics:
827
+ claimable: Jetzt abholbar
828
+ depth: Tiefe
829
+ oldest: Ältester
830
+ oldest_claimable: Ältester abholbar
831
+ parked: Geparkt
832
+ total: Gesamt bisher
833
+ other_levels: 'Andere Prioritätsstufen:'
566
834
  pause: Pause
567
835
  pause_confirm: Verarbeitung pausieren?
568
836
  purge_confirm: Alle Nachrichten löschen?
569
837
  purge_queue: Warteschlange bereinigen
570
838
  resume: Fortsetzen
571
- retry: Wiederholen
572
- retry_confirm: Sichtbarkeits-Timeout zurücksetzen und erneut versuchen?
839
+ summary:
840
+ backlog_html: "%{visible} jetzt abholbar, ältester wartet seit %{age} · %{parked} geparkt (geplant oder in Wiederholung)"
841
+ backlog_parked_only_html: Nichts jetzt abholbar · %{parked} geparkt (geplant oder in Wiederholung)
842
+ dlq_html: 'Dead-Letter-Queue für %{logical}: Jobs landen hier nach %{max} fehlgeschlagenen Versuchen'
843
+ drained_by_html:
844
+ one: Abgearbeitet von %{capsules} (%{count} gesunder Worker)
845
+ other: Abgearbeitet von %{capsules} (%{count} gesunde Worker)
846
+ drained_live_html:
847
+ one: Abgearbeitet von %{count} gesunden Worker, der auf diese Queue hört
848
+ other: Abgearbeitet von %{count} gesunden Workern, die auf diese Queue hören
849
+ drained_wildcard_html:
850
+ one: Abgearbeitet von einer Wildcard-Worker-Kapsel (%{count} gesunder Worker)
851
+ other: Abgearbeitet von einer Wildcard-Worker-Kapsel (%{count} gesunde Worker)
852
+ empty_html: Nichts wartet
853
+ handler_html: Event-Handler-Queue — von Consumern abgearbeitet (%{count} gesund)
854
+ no_consumers_html:
855
+ one: Event-Handler-Queue ohne gesunden Consumer — %{count} Event wartet
856
+ other: Event-Handler-Queue ohne gesunden Consumer — %{count} Events warten
857
+ no_workers_html:
858
+ one: Kein gesunder Worker läuft — %{count} Job ist abholbar, aber niemand holt ihn ab
859
+ other: Kein gesunder Worker läuft — %{count} Jobs sind abholbar, aber niemand holt sie ab
860
+ not_drained_html: Keine Worker-Kapsel arbeitet diese Queue ab — Jobs warten, bis eine konfiguriert ist
861
+ paused_circuit_breaker_html: 'Automatisch pausiert %{ago} nach %{failures} Fehlern in Folge — wird fortgesetzt %{time} (Auslösung #%{trip})'
862
+ paused_operator_html: Pausiert %{ago} — %{reason}
863
+ paused_operator_no_reason_html: Pausiert %{ago} durch einen Operator
864
+ priority_level_html: Prioritätsstufe %{level} von %{logical}
865
+ stream_html: Stream-Queue — per Peek zugestellt, nicht von Workern abgearbeitet
866
+ summary_label: Queue-Übersicht
573
867
  table_health:
574
868
  headers:
575
869
  bloat: Bloat
@@ -579,8 +873,6 @@ de:
579
873
  table: Tabelle
580
874
  oldest_txn: 'Älteste offene Transaktion:'
581
875
  title: Tabellen-Gesundheit
582
- total: 'Insgesamt:'
583
- visible: 'Sichtbar:'
584
876
  recurring_tasks:
585
877
  index:
586
878
  task_count: