pgbus 0.14.0 → 0.14.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/app/models/pgbus/batch_entry.rb +78 -6
  4. data/app/models/pgbus/batch_execution.rb +28 -0
  5. data/app/models/pgbus/blocked_execution.rb +2 -2
  6. data/app/models/pgbus/uniqueness_key.rb +50 -4
  7. data/app/views/pgbus/batches/_batches_table.html.erb +3 -3
  8. data/app/views/pgbus/batches/show.html.erb +7 -7
  9. data/config/locales/da.yml +2 -2
  10. data/config/locales/de.yml +2 -2
  11. data/config/locales/en.yml +2 -2
  12. data/config/locales/es.yml +2 -2
  13. data/config/locales/fi.yml +2 -2
  14. data/config/locales/fr.yml +2 -2
  15. data/config/locales/it.yml +2 -2
  16. data/config/locales/ja.yml +2 -2
  17. data/config/locales/nb.yml +2 -2
  18. data/config/locales/nl.yml +2 -2
  19. data/config/locales/pt.yml +2 -2
  20. data/config/locales/sv.yml +2 -2
  21. data/lib/generators/pgbus/add_batch_callback_jobs_generator.rb +47 -0
  22. data/lib/generators/pgbus/add_batch_executions_generator.rb +44 -0
  23. data/lib/generators/pgbus/templates/add_batch_callback_jobs.rb.erb +13 -0
  24. data/lib/generators/pgbus/templates/add_batch_executions.rb.erb +50 -0
  25. data/lib/generators/pgbus/templates/initializer.rb.erb +2 -0
  26. data/lib/generators/pgbus/templates/migration.rb.erb +23 -2
  27. data/lib/pgbus/active_job/adapter.rb +142 -28
  28. data/lib/pgbus/active_job/batch_id.rb +48 -0
  29. data/lib/pgbus/active_job/executor.rb +45 -9
  30. data/lib/pgbus/batch/sweep.rb +163 -0
  31. data/lib/pgbus/batch.rb +448 -63
  32. data/lib/pgbus/bus_record.rb +15 -1
  33. data/lib/pgbus/client.rb +191 -15
  34. data/lib/pgbus/concurrency/blocked_execution.rb +14 -1
  35. data/lib/pgbus/configuration.rb +24 -1
  36. data/lib/pgbus/engine.rb +1 -0
  37. data/lib/pgbus/generators/migration_detector.rb +30 -0
  38. data/lib/pgbus/instrumentation.rb +5 -0
  39. data/lib/pgbus/outbox/poller.rb +6 -7
  40. data/lib/pgbus/process/dispatcher.rb +41 -17
  41. data/lib/pgbus/recurring/schedule.rb +12 -1
  42. data/lib/pgbus/uniqueness.rb +35 -7
  43. data/lib/pgbus/version.rb +1 -1
  44. data/lib/pgbus/web/data_source.rb +47 -9
  45. metadata +8 -1
data/lib/pgbus/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pgbus
4
- VERSION = "0.14.0"
4
+ VERSION = "0.14.2"
5
5
  end
@@ -669,7 +669,9 @@ module Pgbus
669
669
 
670
670
  # Batches
671
671
  def batches(limit: 100)
672
- BatchEntry.order(created_at: :desc).limit(limit).map { |r| format_batch(r) }
672
+ records = BatchEntry.order(created_at: :desc).limit(limit).to_a
673
+ pending = pending_jobs_by_batch(records.map(&:batch_id))
674
+ records.map { |r| format_batch(r, pending_jobs: pending[r.batch_id]) }
673
675
  rescue StandardError => e
674
676
  Pgbus.logger.debug { "[Pgbus::Web] Error fetching batches: #{e.message}" }
675
677
  []
@@ -679,11 +681,14 @@ module Pgbus
679
681
  record = BatchEntry.find_by(batch_id: batch_id)
680
682
  return nil unless record
681
683
 
682
- format_batch(record).merge(
684
+ pending = pending_jobs_by_batch([batch_id])
685
+ failure_callback = callback_display_name(record, :on_failure) || failure_callback_class(record)
686
+ format_batch(record, pending_jobs: pending[batch_id]).merge(
683
687
  properties: record.properties,
684
- on_finish_class: record.on_finish_class,
685
- on_success_class: record.on_success_class,
686
- on_discard_class: record.on_discard_class
688
+ on_finish_class: callback_display_name(record, :on_finish) || record.on_finish_class,
689
+ on_success_class: callback_display_name(record, :on_success) || record.on_success_class,
690
+ on_failure_class: failure_callback,
691
+ on_discard_class: failure_callback
687
692
  )
688
693
  rescue StandardError => e
689
694
  Pgbus.logger.debug { "[Pgbus::Web] Error fetching batch #{batch_id}: #{e.message}" }
@@ -1351,10 +1356,12 @@ module Pgbus
1351
1356
  end
1352
1357
  end
1353
1358
 
1354
- def format_batch(record)
1359
+ def format_batch(record, pending_jobs: nil)
1355
1360
  total = record.total_jobs
1356
- done = record.completed_jobs + record.discarded_jobs
1361
+ failed = failure_job_count(record)
1362
+ done = record.completed_jobs + failed
1357
1363
  pct = total.positive? ? ((done * 100) / total) : 100
1364
+ pending = pending_jobs || [total - done, 0].max
1358
1365
 
1359
1366
  {
1360
1367
  batch_id: record.batch_id,
@@ -1362,14 +1369,45 @@ module Pgbus
1362
1369
  status: record.status,
1363
1370
  total_jobs: total,
1364
1371
  completed_jobs: record.completed_jobs,
1365
- discarded_jobs: record.discarded_jobs,
1366
- failed_jobs: record.failed_jobs,
1372
+ failed_jobs: failed,
1373
+ discarded_jobs: failed,
1374
+ pending_jobs: pending,
1367
1375
  progress_pct: pct,
1368
1376
  created_at: record.created_at,
1369
1377
  finished_at: record.finished_at
1370
1378
  }
1371
1379
  end
1372
1380
 
1381
+ def failure_job_count(record)
1382
+ record.respond_to?(:discarded_jobs) ? record.discarded_jobs.to_i : record.failed_jobs.to_i
1383
+ end
1384
+
1385
+ # A callback configured as an ActiveJob instance lives in the *_job jsonb
1386
+ # column, not the legacy *_class string — show its job_class either way.
1387
+ def callback_display_name(record, slot)
1388
+ column = "#{slot}_job"
1389
+ return nil unless record.respond_to?(column)
1390
+
1391
+ record.public_send(column).presence&.dig("job_class")
1392
+ end
1393
+
1394
+ def failure_callback_class(record)
1395
+ if record.respond_to?(:on_failure_class) && record.on_failure_class.present?
1396
+ record.on_failure_class
1397
+ elsif record.respond_to?(:on_discard_class)
1398
+ record.on_discard_class
1399
+ end
1400
+ end
1401
+
1402
+ def pending_jobs_by_batch(batch_ids)
1403
+ return {} unless Batch.executions_migrated?
1404
+ return {} if batch_ids.empty?
1405
+
1406
+ BatchExecution.where(batch_id: batch_ids).group(:batch_id).count
1407
+ rescue StandardError
1408
+ {}
1409
+ end
1410
+
1373
1411
  def sanitize_name(name)
1374
1412
  QueueNameValidator.sanitize!(name)
1375
1413
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgbus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.14.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
@@ -150,6 +150,7 @@ files:
150
150
  - app/helpers/pgbus/streams_helper.rb
151
151
  - app/models/pgbus/application_record.rb
152
152
  - app/models/pgbus/batch_entry.rb
153
+ - app/models/pgbus/batch_execution.rb
153
154
  - app/models/pgbus/blocked_execution.rb
154
155
  - app/models/pgbus/job_stat.rb
155
156
  - app/models/pgbus/outbox_entry.rb
@@ -210,6 +211,8 @@ files:
210
211
  - exe/pgbus
211
212
  - exe/pgbus-health
212
213
  - lib/active_job/queue_adapters/pgbus_adapter.rb
214
+ - lib/generators/pgbus/add_batch_callback_jobs_generator.rb
215
+ - lib/generators/pgbus/add_batch_executions_generator.rb
213
216
  - lib/generators/pgbus/add_failed_events_index_generator.rb
214
217
  - lib/generators/pgbus/add_job_stats_generator.rb
215
218
  - lib/generators/pgbus/add_job_stats_latency_generator.rb
@@ -225,6 +228,8 @@ files:
225
228
  - lib/generators/pgbus/install_generator.rb
226
229
  - lib/generators/pgbus/migrate_job_locks_generator.rb
227
230
  - lib/generators/pgbus/migration_path.rb
231
+ - lib/generators/pgbus/templates/add_batch_callback_jobs.rb.erb
232
+ - lib/generators/pgbus/templates/add_batch_executions.rb.erb
228
233
  - lib/generators/pgbus/templates/add_failed_events_unique_index.rb.erb
229
234
  - lib/generators/pgbus/templates/add_job_stats.rb.erb
230
235
  - lib/generators/pgbus/templates/add_job_stats_latency.rb.erb
@@ -251,9 +256,11 @@ files:
251
256
  - lib/generators/pgbus/upgrade_pgmq_generator.rb
252
257
  - lib/pgbus.rb
253
258
  - lib/pgbus/active_job/adapter.rb
259
+ - lib/pgbus/active_job/batch_id.rb
254
260
  - lib/pgbus/active_job/executor.rb
255
261
  - lib/pgbus/autovacuum_tuning.rb
256
262
  - lib/pgbus/batch.rb
263
+ - lib/pgbus/batch/sweep.rb
257
264
  - lib/pgbus/bus_record.rb
258
265
  - lib/pgbus/circuit_breaker.rb
259
266
  - lib/pgbus/cli.rb