pgbus 0.9.7 → 0.9.9

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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +367 -0
  3. data/README.md +454 -25
  4. data/Rakefile +10 -1
  5. data/app/helpers/pgbus/application_helper.rb +37 -0
  6. data/app/views/pgbus/processes/_processes_table.html.erb +4 -1
  7. data/config/locales/da.yml +4 -0
  8. data/config/locales/de.yml +4 -0
  9. data/config/locales/en.yml +4 -0
  10. data/config/locales/es.yml +4 -0
  11. data/config/locales/fi.yml +4 -0
  12. data/config/locales/fr.yml +4 -0
  13. data/config/locales/it.yml +4 -0
  14. data/config/locales/ja.yml +4 -0
  15. data/config/locales/nb.yml +4 -0
  16. data/config/locales/nl.yml +4 -0
  17. data/config/locales/pt.yml +4 -0
  18. data/config/locales/sv.yml +4 -0
  19. data/lib/generators/pgbus/{add_job_locks_generator.rb → add_uniqueness_keys_generator.rb} +5 -5
  20. data/lib/pgbus/active_job/adapter.rb +1 -1
  21. data/lib/pgbus/active_job/executor.rb +25 -4
  22. data/lib/pgbus/cli/dlq.rb +164 -0
  23. data/lib/pgbus/cli.rb +18 -1
  24. data/lib/pgbus/client/connection_health.rb +194 -0
  25. data/lib/pgbus/client.rb +592 -73
  26. data/lib/pgbus/config_loader.rb +50 -4
  27. data/lib/pgbus/configuration.rb +294 -79
  28. data/lib/pgbus/dedup_cache.rb +8 -0
  29. data/lib/pgbus/doctor.rb +275 -0
  30. data/lib/pgbus/engine.rb +15 -0
  31. data/lib/pgbus/execution_pools/async_pool.rb +9 -2
  32. data/lib/pgbus/execution_pools/thread_pool.rb +7 -0
  33. data/lib/pgbus/generators/config_converter.rb +7 -5
  34. data/lib/pgbus/generators/migration_detector.rb +20 -16
  35. data/lib/pgbus/instrumentation.rb +3 -1
  36. data/lib/pgbus/integrations/appsignal/probe.rb +23 -1
  37. data/lib/pgbus/integrations/appsignal/subscriber.rb +17 -2
  38. data/lib/pgbus/metrics/backend.rb +38 -0
  39. data/lib/pgbus/metrics/backends/prometheus.rb +123 -0
  40. data/lib/pgbus/metrics/backends/statsd.rb +64 -0
  41. data/lib/pgbus/metrics/prometheus_exporter.rb +34 -0
  42. data/lib/pgbus/metrics/subscriber.rb +214 -0
  43. data/lib/pgbus/metrics.rb +43 -0
  44. data/lib/pgbus/pgmq_schema/pgmq_v1.11.1.sql +2126 -0
  45. data/lib/pgbus/pgmq_schema.rb +7 -2
  46. data/lib/pgbus/process/consumer.rb +354 -18
  47. data/lib/pgbus/process/consumer_priority.rb +34 -0
  48. data/lib/pgbus/process/dispatcher.rb +265 -41
  49. data/lib/pgbus/process/heartbeat.rb +18 -5
  50. data/lib/pgbus/process/memory_usage.rb +48 -0
  51. data/lib/pgbus/process/notify_listener.rb +26 -7
  52. data/lib/pgbus/process/notify_probe.rb +96 -0
  53. data/lib/pgbus/process/primary_validator.rb +53 -0
  54. data/lib/pgbus/process/signal_handler.rb +6 -0
  55. data/lib/pgbus/process/supervisor.rb +423 -50
  56. data/lib/pgbus/process/worker.rb +288 -35
  57. data/lib/pgbus/recurring/schedule.rb +1 -2
  58. data/lib/pgbus/recurring/scheduler.rb +15 -1
  59. data/lib/pgbus/serializer.rb +4 -4
  60. data/lib/pgbus/streams/broadcastable_override.rb +0 -8
  61. data/lib/pgbus/streams/signed_name.rb +2 -2
  62. data/lib/pgbus/streams/turbo_broadcastable.rb +7 -5
  63. data/lib/pgbus/table_maintenance.rb +13 -2
  64. data/lib/pgbus/uniqueness.rb +11 -12
  65. data/lib/pgbus/version.rb +1 -1
  66. data/lib/pgbus/web/data_source.rb +36 -4
  67. data/lib/pgbus/web/health_app.rb +102 -0
  68. data/lib/pgbus/web/health_server.rb +144 -0
  69. data/lib/pgbus/web/payload_filter.rb +3 -3
  70. data/lib/pgbus/web/streamer/instance.rb +58 -2
  71. data/lib/pgbus/web/streamer/listener.rb +69 -21
  72. data/lib/pgbus.rb +77 -0
  73. data/lib/tasks/pgbus_doctor.rake +12 -0
  74. metadata +19 -4
  75. data/app/models/pgbus/job_lock.rb +0 -98
  76. data/lib/generators/pgbus/templates/add_job_locks.rb.erb +0 -21
@@ -11,16 +11,62 @@ module Pgbus
11
11
  env ||= (defined?(Rails) && Rails.respond_to?(:env) && Rails.env) || ENV.fetch("PGBUS_ENV", "development")
12
12
  raw = File.read(path)
13
13
  parsed = YAML.safe_load(ERB.new(raw).result, permitted_classes: [Symbol], aliases: true)
14
- config_hash = parsed.fetch(env, parsed)
15
- apply(config_hash)
14
+ # Distinguish sectioned (top-level env keys mapping to Hashes) from
15
+ # flat (top-level setter keys mapping to scalars/arrays). parsed.key?(env)
16
+ # alone can't tell them apart, so a flat file silently lost its typo
17
+ # warnings whenever no env section happened to match its keys.
18
+ if sectioned?(parsed)
19
+ if parsed.key?(env)
20
+ apply(parsed.fetch(env))
21
+ else
22
+ warn_missing_env_section(parsed, env)
23
+ end
24
+ else
25
+ apply(parsed)
26
+ end
27
+ end
28
+
29
+ # A file is "sectioned" (top-level keys are env names, e.g. development:/
30
+ # production:) rather than "flat" (top-level keys are Configuration
31
+ # setters) when every top-level value is a Hash AND none of the
32
+ # top-level keys is itself a real Configuration setter. The setter check
33
+ # is what distinguishes the two: env section names (production, staging,
34
+ # ...) are never real setters, so a legitimate flat file whose settings
35
+ # all happen to be Hash-valued (connection_params:, streams_retention:,
36
+ # recurring_tasks:, ...) is correctly classified as flat instead of being
37
+ # misread as sectioned-with-no-matching-env and silently skipped.
38
+ def sectioned?(parsed)
39
+ return false unless parsed.is_a?(Hash) && parsed.any? && parsed.values.all?(Hash)
40
+
41
+ config = Pgbus.configuration
42
+ parsed.keys.none? { |key| config.respond_to?(:"#{key}=") }
43
+ end
44
+
45
+ # A sectioned file with no section for the current env has nothing to
46
+ # apply for this process — that's a real gap (typo'd env name, or a
47
+ # config file that just doesn't cover this deployment), so it must be
48
+ # loud instead of a silent no-op.
49
+ def warn_missing_env_section(parsed, env)
50
+ Pgbus.configuration.logger.warn do
51
+ "[Pgbus] No configuration section for env #{env.inspect} — " \
52
+ "available sections: #{parsed.keys.inspect}. Nothing was applied."
53
+ end
16
54
  end
17
55
 
18
- def apply(hash)
56
+ def apply(hash, warn_unknown: true)
19
57
  config = Pgbus.configuration
20
58
  hash.each do |key, value|
21
59
  setter = :"#{key}="
22
- config.public_send(setter, value) if config.respond_to?(setter)
60
+ if config.respond_to?(setter)
61
+ config.public_send(setter, value)
62
+ elsif warn_unknown
63
+ config.logger.warn { "[Pgbus] Unknown configuration key ignored: #{key.inspect} — check for typos in pgbus.yml" }
64
+ end
23
65
  end
66
+ # Validate eagerly so a bad YAML value aborts boot with an ArgumentError
67
+ # naming the offending key, instead of failing later in a worker path.
68
+ # Honors an `eager_validation: false` key in the same hash (applied above).
69
+ config.validate! if config.eager_validation
24
70
  config
25
71
  end
26
72
  end