eventboss 1.4.1 → 1.8.0
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/.github/workflows/verify.yml +40 -0
- data/Gemfile.lock +28 -26
- data/README.md +2 -2
- data/eventboss.gemspec +2 -1
- data/lib/eventboss/configuration.rb +1 -2
- data/lib/eventboss/development_mode.rb +3 -0
- data/lib/eventboss/error_handlers/non_existent_queue_handler.rb +12 -0
- data/lib/eventboss/error_handlers/rollbar.rb +11 -0
- data/lib/eventboss/extensions.rb +2 -0
- data/lib/eventboss/launcher.rb +2 -1
- data/lib/eventboss/long_poller.rb +5 -0
- data/lib/eventboss/version.rb +1 -1
- data/lib/eventboss/worker.rb +1 -2
- data/lib/tasks/eventboss.rake +21 -6
- metadata +24 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96d1bb368bb5d3178aba2cf5a00bec49444f24e3a0b768d3128651d14947248e
|
4
|
+
data.tar.gz: 98c2d5c2e7c64a629ef7ceedb31bfb74798c6a61d781fea22c52e36f132fd2b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c54b9a6375dc06ce7dd516513b5e09c0f8eda8c79e796694cb9fbceaa348bff1bc196e83d400f2355b323b85b344018b13c8194505c37773b04c7196d6d6c012
|
7
|
+
data.tar.gz: a64d2636b7d9a8dbb910d85f36eedd873abdeb7b7b7aa078c19fcb67772d6de7f6dfc353117cf1b0ea84505c3f5aa5f87d48a4deb2c68beb504b4a6cfe24333c
|
@@ -0,0 +1,40 @@
|
|
1
|
+
name: Verify
|
2
|
+
# Source: https://github.com/actions/setup-ruby
|
3
|
+
|
4
|
+
on:
|
5
|
+
push:
|
6
|
+
branches: [master]
|
7
|
+
pull_request:
|
8
|
+
branches: [master]
|
9
|
+
|
10
|
+
jobs:
|
11
|
+
test:
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
strategy:
|
14
|
+
matrix:
|
15
|
+
ruby-version: ["2.6", "2.7", "3.0"]
|
16
|
+
steps:
|
17
|
+
- uses: actions/checkout@v2
|
18
|
+
- name: Set up Ruby
|
19
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby-version }}
|
23
|
+
# runs 'bundle install' and caches installed gems automatically
|
24
|
+
bundler-cache: true
|
25
|
+
- name: Run tests
|
26
|
+
run: bundle exec rspec
|
27
|
+
audit:
|
28
|
+
runs-on: ubuntu-latest
|
29
|
+
steps:
|
30
|
+
- uses: actions/checkout@v2
|
31
|
+
- name: Set up Ruby
|
32
|
+
uses: ruby/setup-ruby@v1
|
33
|
+
with:
|
34
|
+
ruby-version: "3.0"
|
35
|
+
- name: Install bundle audit
|
36
|
+
run: gem install bundle-audit
|
37
|
+
- name: Update Ruby Advisory Database
|
38
|
+
run: bundle-audit update
|
39
|
+
- name: Run audit
|
40
|
+
run: bundle audit
|
data/Gemfile.lock
CHANGED
@@ -1,55 +1,57 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
eventboss (1.
|
4
|
+
eventboss (1.8.0)
|
5
5
|
aws-sdk-sns (>= 1.1.0)
|
6
6
|
aws-sdk-sqs (>= 1.3.0)
|
7
7
|
dotenv (~> 2.1, >= 2.1.1)
|
8
|
+
rexml (~> 3.0)
|
8
9
|
|
9
10
|
GEM
|
10
11
|
remote: https://rubygems.org/
|
11
12
|
specs:
|
12
|
-
aws-eventstream (1.
|
13
|
-
aws-partitions (1.
|
14
|
-
aws-sdk-core (3.
|
13
|
+
aws-eventstream (1.2.0)
|
14
|
+
aws-partitions (1.568.0)
|
15
|
+
aws-sdk-core (3.130.0)
|
15
16
|
aws-eventstream (~> 1, >= 1.0.2)
|
16
|
-
aws-partitions (~> 1, >= 1.
|
17
|
+
aws-partitions (~> 1, >= 1.525.0)
|
17
18
|
aws-sigv4 (~> 1.1)
|
18
19
|
jmespath (~> 1.0)
|
19
|
-
aws-sdk-sns (1.
|
20
|
-
aws-sdk-core (~> 3, >= 3.
|
20
|
+
aws-sdk-sns (1.53.0)
|
21
|
+
aws-sdk-core (~> 3, >= 3.127.0)
|
21
22
|
aws-sigv4 (~> 1.1)
|
22
|
-
aws-sdk-sqs (1.
|
23
|
-
aws-sdk-core (~> 3, >= 3.
|
23
|
+
aws-sdk-sqs (1.51.0)
|
24
|
+
aws-sdk-core (~> 3, >= 3.127.0)
|
24
25
|
aws-sigv4 (~> 1.1)
|
25
|
-
aws-sigv4 (1.
|
26
|
+
aws-sigv4 (1.4.0)
|
26
27
|
aws-eventstream (~> 1, >= 1.0.2)
|
27
|
-
diff-lcs (1.
|
28
|
+
diff-lcs (1.5.0)
|
28
29
|
dotenv (2.7.6)
|
29
|
-
jmespath (1.
|
30
|
-
rake (13.0.
|
31
|
-
|
32
|
-
|
33
|
-
rspec-
|
34
|
-
rspec-
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
jmespath (1.6.1)
|
31
|
+
rake (13.0.6)
|
32
|
+
rexml (3.2.5)
|
33
|
+
rspec (3.11.0)
|
34
|
+
rspec-core (~> 3.11.0)
|
35
|
+
rspec-expectations (~> 3.11.0)
|
36
|
+
rspec-mocks (~> 3.11.0)
|
37
|
+
rspec-core (3.11.0)
|
38
|
+
rspec-support (~> 3.11.0)
|
39
|
+
rspec-expectations (3.11.0)
|
38
40
|
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
-
rspec-support (~> 3.
|
40
|
-
rspec-mocks (3.
|
41
|
+
rspec-support (~> 3.11.0)
|
42
|
+
rspec-mocks (3.11.0)
|
41
43
|
diff-lcs (>= 1.2.0, < 2.0)
|
42
|
-
rspec-support (~> 3.
|
43
|
-
rspec-support (3.
|
44
|
+
rspec-support (~> 3.11.0)
|
45
|
+
rspec-support (3.11.0)
|
44
46
|
|
45
47
|
PLATFORMS
|
46
48
|
ruby
|
47
49
|
|
48
50
|
DEPENDENCIES
|
49
|
-
bundler (
|
51
|
+
bundler (>= 1)
|
50
52
|
eventboss!
|
51
53
|
rake (>= 10.0)
|
52
54
|
rspec (~> 3.0)
|
53
55
|
|
54
56
|
BUNDLED WITH
|
55
|
-
|
57
|
+
2.3.7
|
data/README.md
CHANGED
@@ -100,8 +100,8 @@ EVENTBOSS_ENV=env_name # production/staging/test
|
|
100
100
|
EVENTBOSS_REGION=aws_region # i.e. eu-west-1
|
101
101
|
EVENTBOSS_CONCURRENCY=10 # default is 25
|
102
102
|
|
103
|
-
AWS_SNS_ENDPOINT=http://localhost:
|
104
|
-
AWS_SQS_ENDPOINT=http://localhost:
|
103
|
+
AWS_SNS_ENDPOINT=http://localhost:4566 # when using with localstack
|
104
|
+
AWS_SQS_ENDPOINT=http://localhost:4566 # when using with localstack
|
105
105
|
```
|
106
106
|
Use fixed account ID for localstack setup:
|
107
107
|
```
|
data/eventboss.gemspec
CHANGED
@@ -23,8 +23,9 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency "aws-sdk-sqs", ">= 1.3.0"
|
24
24
|
spec.add_dependency "aws-sdk-sns", ">= 1.1.0"
|
25
25
|
spec.add_dependency "dotenv", "~> 2.1", ">= 2.1.1"
|
26
|
+
spec.add_dependency "rexml", "~> 3.0"
|
26
27
|
|
27
|
-
spec.add_development_dependency "bundler", "
|
28
|
+
spec.add_development_dependency "bundler", ">= 1"
|
28
29
|
spec.add_development_dependency 'rake', '>= 10.0'
|
29
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
30
31
|
end
|
@@ -25,14 +25,13 @@ module Eventboss
|
|
25
25
|
:sns_sqs_name_infix,
|
26
26
|
:listeners
|
27
27
|
|
28
|
-
|
29
28
|
def raise_on_missing_configuration
|
30
29
|
defined_or_default('raise_on_missing_configuration') { (ENV['EVENTBOSS_RAISE_ON_MISSING_CONFIGURATION'] || ENV['EVENTBUS_RAISE_ON_MISSING_CONFIGURATION'])&.downcase == 'true' }
|
31
30
|
end
|
32
31
|
|
33
32
|
def error_handlers
|
34
33
|
defined_or_default('error_handlers') do
|
35
|
-
[ErrorHandlers::Logger.new].tap do |handlers|
|
34
|
+
[ErrorHandlers::Logger.new, ErrorHandlers::NonExistentQueueHandler.new].tap do |handlers|
|
36
35
|
handlers << ErrorHandlers::DbConnectionDropHandler.new if defined?(::ActiveRecord::StatementInvalid)
|
37
36
|
handlers << ErrorHandlers::DbConnectionNotEstablishedHandler.new if defined?(::ActiveRecord::ConnectionNotEstablished)
|
38
37
|
end
|
@@ -17,6 +17,9 @@ module Eventboss
|
|
17
17
|
logger.info('development-mode') { "Creating queue #{queue.name}..." }
|
18
18
|
sqs_client.create_queue(queue_name: queue.name)
|
19
19
|
|
20
|
+
logger.info('development-mode') { "Creating deadletter queue #{queue.name}-deadletter..." }
|
21
|
+
sqs_client.create_queue(queue_name: "#{queue.name}-deadletter")
|
22
|
+
|
20
23
|
logger.info('development-mode') { "Setting up queue #{queue.name} policy..." }
|
21
24
|
policy = queue_policy(queue.arn, topic.topic_arn)
|
22
25
|
sqs_client.set_queue_attributes(queue_url: queue.url, attributes: { Policy: policy.to_json })
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Eventboss
|
2
|
+
module ErrorHandlers
|
3
|
+
class NonExistentQueueHandler
|
4
|
+
def call(exception, context = {})
|
5
|
+
if exception.class == ::Aws::SQS::Errors::NonExistentQueue
|
6
|
+
queue = context.fetch(:poller_id, "").sub('poller-', '')
|
7
|
+
Eventboss.logger.error("Queue doesn't exist: " + queue)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Eventboss
|
2
|
+
module ErrorHandlers
|
3
|
+
class Rollbar
|
4
|
+
def call(exception, context = {})
|
5
|
+
eventboss_context = { component: 'eventboss' }
|
6
|
+
eventboss_context[:action] = context[:processor].class.to_s if context[:processor]
|
7
|
+
::Rollbar.error(exception, eventboss_context.merge(context))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/eventboss/extensions.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'eventboss/error_handlers/logger'
|
2
2
|
require 'eventboss/error_handlers/airbrake'
|
3
|
+
require 'eventboss/error_handlers/rollbar'
|
3
4
|
require 'eventboss/error_handlers/db_connection_drop_handler'
|
4
5
|
require 'eventboss/error_handlers/db_connection_not_established_handler'
|
6
|
+
require 'eventboss/error_handlers/non_existent_queue_handler'
|
data/lib/eventboss/launcher.rb
CHANGED
@@ -34,6 +34,7 @@ module Eventboss
|
|
34
34
|
@bus.clear
|
35
35
|
@pollers.each(&:terminate)
|
36
36
|
@workers.each(&:terminate)
|
37
|
+
@bus.close
|
37
38
|
|
38
39
|
wait_for_shutdown
|
39
40
|
hard_shutdown
|
@@ -70,7 +71,7 @@ module Eventboss
|
|
70
71
|
end
|
71
72
|
|
72
73
|
def new_worker(id)
|
73
|
-
Worker.new(self, id, @bus)
|
74
|
+
Worker.new(self, "worker-#{id}", @bus)
|
74
75
|
end
|
75
76
|
|
76
77
|
def new_poller(queue, listener)
|
@@ -45,6 +45,8 @@ module Eventboss
|
|
45
45
|
fetch_messages.each do |message|
|
46
46
|
logger.debug(id) { "enqueueing message #{message.message_id}" }
|
47
47
|
@bus << UnitOfWork.new(@client, queue, listener, message)
|
48
|
+
rescue ClosedQueueError
|
49
|
+
logger.info(id) { "skip message #{message.message_id} enqueuing due to closed queue" }
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
@@ -53,6 +55,9 @@ module Eventboss
|
|
53
55
|
@launcher.poller_stopped(self)
|
54
56
|
rescue Eventboss::Shutdown
|
55
57
|
@launcher.poller_stopped(self)
|
58
|
+
rescue Aws::SQS::Errors::NonExistentQueue => exception
|
59
|
+
handle_exception(exception, poller_id: id)
|
60
|
+
@launcher.poller_stopped(self)
|
56
61
|
rescue StandardError => exception
|
57
62
|
handle_exception(exception, poller_id: id)
|
58
63
|
# Give a chance for temporary AWS errors to be resolved
|
data/lib/eventboss/version.rb
CHANGED
data/lib/eventboss/worker.rb
CHANGED
@@ -7,7 +7,7 @@ module Eventboss
|
|
7
7
|
attr_reader :id
|
8
8
|
|
9
9
|
def initialize(launcher, id, bus, restart_on: [Exception])
|
10
|
-
@id =
|
10
|
+
@id = id
|
11
11
|
@launcher = launcher
|
12
12
|
@bus = bus
|
13
13
|
@thread = nil
|
@@ -45,7 +45,6 @@ module Eventboss
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def kill(wait = false)
|
48
|
-
stop_token
|
49
48
|
return unless @thread
|
50
49
|
@thread.raise Eventboss::Shutdown
|
51
50
|
@thread.value if wait
|
data/lib/tasks/eventboss.rake
CHANGED
@@ -6,6 +6,9 @@ namespace :eventboss do
|
|
6
6
|
task :reload, [:event_name, :source_app, :max_messages] do |task, args|
|
7
7
|
source_app = args[:source_app]
|
8
8
|
event_name = args[:event_name]
|
9
|
+
start_time = Time.now
|
10
|
+
|
11
|
+
Eventboss.logger.info "[#{task.name}] Start task"
|
9
12
|
|
10
13
|
# Zero means: fetch all messages
|
11
14
|
max_messages = args[:max_messages].to_i
|
@@ -17,13 +20,11 @@ namespace :eventboss do
|
|
17
20
|
|
18
21
|
queue_name = compose_queue_name(source_app, event_name)
|
19
22
|
|
20
|
-
|
23
|
+
Eventboss.logger.info "[#{task.name}] Reloading #{queue_name}-deadletter (max: #{ max_messages }, batch: #{ batch_size })"
|
21
24
|
queue = Eventboss::Queue.new("#{queue_name}-deadletter")
|
22
25
|
send_queue = Eventboss::Queue.new(queue_name)
|
23
26
|
|
24
|
-
|
25
|
-
puts "[#{task.name}] to"
|
26
|
-
puts "[#{task.name}] #{send_queue.url}"
|
27
|
+
Eventboss.logger.info "[#{task.name}] #{queue.url} to #{send_queue.url}"
|
27
28
|
|
28
29
|
fetcher = Eventboss::Fetcher.new(Eventboss.configuration)
|
29
30
|
client = fetcher.client
|
@@ -42,16 +43,24 @@ namespace :eventboss do
|
|
42
43
|
|
43
44
|
break if max_messages > 0 && total >= max_messages
|
44
45
|
end
|
46
|
+
Eventboss.logger.info <<~HEREDOC
|
47
|
+
[#{task.name}] Task done
|
48
|
+
total messages: #{total}
|
49
|
+
total time: #{Time.now - start_time}s
|
50
|
+
HEREDOC
|
45
51
|
end
|
46
52
|
|
47
53
|
desc 'Purge deadletter queue'
|
48
54
|
task :purge, [:event_name, :source_app, :max_messages] do |task, args|
|
49
55
|
source_app = args[:source_app]
|
50
56
|
event_name = args[:event_name]
|
57
|
+
start_time = Time.now
|
51
58
|
|
52
59
|
# Zero means: fetch all messages
|
53
60
|
max_messages = args[:max_messages].to_i
|
54
61
|
|
62
|
+
Eventboss.logger.info "[#{task.name}] Start task"
|
63
|
+
|
55
64
|
# Ensure we don't fetch more than 10 messages from SQS
|
56
65
|
batch_size = max_messages == 0 ? 10 : [10, max_messages].min
|
57
66
|
|
@@ -59,9 +68,9 @@ namespace :eventboss do
|
|
59
68
|
|
60
69
|
queue_name = compose_queue_name(source_app, event_name)
|
61
70
|
|
62
|
-
|
71
|
+
Eventboss.logger.info "[#{task.name}] Purging #{queue_name}-deadletter (max: #{ max_messages }, batch: #{ batch_size })"
|
63
72
|
queue = Eventboss::Queue.new("#{queue_name}-deadletter")
|
64
|
-
|
73
|
+
Eventboss.logger.info "[#{task.name}] #{queue.url}"
|
65
74
|
|
66
75
|
fetcher = Eventboss::Fetcher.new(Eventboss.configuration)
|
67
76
|
total = 0
|
@@ -78,6 +87,12 @@ namespace :eventboss do
|
|
78
87
|
|
79
88
|
break if max_messages > 0 && total >= max_messages
|
80
89
|
end
|
90
|
+
|
91
|
+
Eventboss.logger.info <<~HEREDOC
|
92
|
+
[#{task.name}] Task done
|
93
|
+
total messages: #{total}
|
94
|
+
total time: #{Time.now - start_time}s
|
95
|
+
HEREDOC
|
81
96
|
end
|
82
97
|
|
83
98
|
def compose_queue_name(source_app, event_name)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventboss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AirHelp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-sqs
|
@@ -59,19 +59,33 @@ dependencies:
|
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 2.1.1
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
62
|
+
name: rexml
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
68
|
-
type: :
|
67
|
+
version: '3.0'
|
68
|
+
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '3.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: bundler
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '1'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '1'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: rake
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,7 @@ executables:
|
|
108
122
|
extensions: []
|
109
123
|
extra_rdoc_files: []
|
110
124
|
files:
|
125
|
+
- ".github/workflows/verify.yml"
|
111
126
|
- ".gitignore"
|
112
127
|
- ".rspec"
|
113
128
|
- ".travis.yml"
|
@@ -128,6 +143,8 @@ files:
|
|
128
143
|
- lib/eventboss/error_handlers/db_connection_drop_handler.rb
|
129
144
|
- lib/eventboss/error_handlers/db_connection_not_established_handler.rb
|
130
145
|
- lib/eventboss/error_handlers/logger.rb
|
146
|
+
- lib/eventboss/error_handlers/non_existent_queue_handler.rb
|
147
|
+
- lib/eventboss/error_handlers/rollbar.rb
|
131
148
|
- lib/eventboss/extensions.rb
|
132
149
|
- lib/eventboss/fetcher.rb
|
133
150
|
- lib/eventboss/instrumentation.rb
|
@@ -171,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
188
|
- !ruby/object:Gem::Version
|
172
189
|
version: '0'
|
173
190
|
requirements: []
|
174
|
-
rubygems_version: 3.
|
191
|
+
rubygems_version: 3.3.7
|
175
192
|
signing_key:
|
176
193
|
specification_version: 4
|
177
194
|
summary: Eventboss Ruby Client.
|