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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +367 -0
- data/README.md +454 -25
- data/Rakefile +10 -1
- data/app/helpers/pgbus/application_helper.rb +37 -0
- data/app/views/pgbus/processes/_processes_table.html.erb +4 -1
- data/config/locales/da.yml +4 -0
- data/config/locales/de.yml +4 -0
- data/config/locales/en.yml +4 -0
- data/config/locales/es.yml +4 -0
- data/config/locales/fi.yml +4 -0
- data/config/locales/fr.yml +4 -0
- data/config/locales/it.yml +4 -0
- data/config/locales/ja.yml +4 -0
- data/config/locales/nb.yml +4 -0
- data/config/locales/nl.yml +4 -0
- data/config/locales/pt.yml +4 -0
- data/config/locales/sv.yml +4 -0
- data/lib/generators/pgbus/{add_job_locks_generator.rb → add_uniqueness_keys_generator.rb} +5 -5
- data/lib/pgbus/active_job/adapter.rb +1 -1
- data/lib/pgbus/active_job/executor.rb +25 -4
- data/lib/pgbus/cli/dlq.rb +164 -0
- data/lib/pgbus/cli.rb +18 -1
- data/lib/pgbus/client/connection_health.rb +194 -0
- data/lib/pgbus/client.rb +592 -73
- data/lib/pgbus/config_loader.rb +50 -4
- data/lib/pgbus/configuration.rb +294 -79
- data/lib/pgbus/dedup_cache.rb +8 -0
- data/lib/pgbus/doctor.rb +275 -0
- data/lib/pgbus/engine.rb +15 -0
- data/lib/pgbus/execution_pools/async_pool.rb +9 -2
- data/lib/pgbus/execution_pools/thread_pool.rb +7 -0
- data/lib/pgbus/generators/config_converter.rb +7 -5
- data/lib/pgbus/generators/migration_detector.rb +20 -16
- data/lib/pgbus/instrumentation.rb +3 -1
- data/lib/pgbus/integrations/appsignal/probe.rb +23 -1
- data/lib/pgbus/integrations/appsignal/subscriber.rb +17 -2
- data/lib/pgbus/metrics/backend.rb +38 -0
- data/lib/pgbus/metrics/backends/prometheus.rb +123 -0
- data/lib/pgbus/metrics/backends/statsd.rb +64 -0
- data/lib/pgbus/metrics/prometheus_exporter.rb +34 -0
- data/lib/pgbus/metrics/subscriber.rb +214 -0
- data/lib/pgbus/metrics.rb +43 -0
- data/lib/pgbus/pgmq_schema/pgmq_v1.11.1.sql +2126 -0
- data/lib/pgbus/pgmq_schema.rb +7 -2
- data/lib/pgbus/process/consumer.rb +354 -18
- data/lib/pgbus/process/consumer_priority.rb +34 -0
- data/lib/pgbus/process/dispatcher.rb +265 -41
- data/lib/pgbus/process/heartbeat.rb +18 -5
- data/lib/pgbus/process/memory_usage.rb +48 -0
- data/lib/pgbus/process/notify_listener.rb +26 -7
- data/lib/pgbus/process/notify_probe.rb +96 -0
- data/lib/pgbus/process/primary_validator.rb +53 -0
- data/lib/pgbus/process/signal_handler.rb +6 -0
- data/lib/pgbus/process/supervisor.rb +423 -50
- data/lib/pgbus/process/worker.rb +288 -35
- data/lib/pgbus/recurring/schedule.rb +1 -2
- data/lib/pgbus/recurring/scheduler.rb +15 -1
- data/lib/pgbus/serializer.rb +4 -4
- data/lib/pgbus/streams/broadcastable_override.rb +0 -8
- data/lib/pgbus/streams/signed_name.rb +2 -2
- data/lib/pgbus/streams/turbo_broadcastable.rb +7 -5
- data/lib/pgbus/table_maintenance.rb +13 -2
- data/lib/pgbus/uniqueness.rb +11 -12
- data/lib/pgbus/version.rb +1 -1
- data/lib/pgbus/web/data_source.rb +36 -4
- data/lib/pgbus/web/health_app.rb +102 -0
- data/lib/pgbus/web/health_server.rb +144 -0
- data/lib/pgbus/web/payload_filter.rb +3 -3
- data/lib/pgbus/web/streamer/instance.rb +58 -2
- data/lib/pgbus/web/streamer/listener.rb +69 -21
- data/lib/pgbus.rb +77 -0
- data/lib/tasks/pgbus_doctor.rake +12 -0
- metadata +19 -4
- data/app/models/pgbus/job_lock.rb +0 -98
- data/lib/generators/pgbus/templates/add_job_locks.rb.erb +0 -21
data/lib/pgbus/config_loader.rb
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|