hutch 0.22.1 → 0.23.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/.gitignore +1 -0
- data/.rspec +1 -0
- data/.travis.yml +16 -12
- data/CHANGELOG.md +19 -2
- data/Gemfile +13 -4
- data/Guardfile +13 -4
- data/README.md +18 -4
- data/gemfiles/Gemfile.activesupport4 +2 -0
- data/gemfiles/Gemfile.activesupport5 +2 -0
- data/hutch.gemspec +4 -8
- data/lib/hutch/broker.rb +1 -0
- data/lib/hutch/config.rb +11 -7
- data/lib/hutch/error_handlers.rb +1 -0
- data/lib/hutch/error_handlers/airbrake.rb +21 -11
- data/lib/hutch/error_handlers/honeybadger.rb +2 -1
- data/lib/hutch/error_handlers/logger.rb +2 -1
- data/lib/hutch/error_handlers/opbeat.rb +24 -0
- data/lib/hutch/error_handlers/sentry.rb +2 -1
- data/lib/hutch/version.rb +1 -1
- data/lib/hutch/waiter.rb +1 -1
- data/lib/hutch/worker.rb +3 -5
- data/spec/hutch/broker_spec.rb +25 -17
- data/spec/hutch/config_spec.rb +26 -3
- data/spec/hutch/error_handlers/airbrake_spec.rb +6 -10
- data/spec/hutch/error_handlers/honeybadger_spec.rb +2 -1
- data/spec/hutch/error_handlers/logger_spec.rb +3 -1
- data/spec/hutch/error_handlers/opbeat_spec.rb +22 -0
- data/spec/hutch/error_handlers/sentry_spec.rb +4 -2
- data/spec/hutch/waiter_spec.rb +5 -1
- metadata +15 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 121ef2c74885824fb6289f89e89e55cb2e83f577
|
4
|
+
data.tar.gz: de5ed49d8ad6e020bdfde9e5b39ecadda276dedf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81050d31cea806c918a51a952c8b1b695c384f0d0dd7beb1a89e01af2183c5fdfcc819a62289f7de4afa3a8ddfbb7df1801e935fae4904404e4aee1cf66e34e4
|
7
|
+
data.tar.gz: 0008ef900bf621471fee3cbd4e5c753d3c9d271f3c6fe2f18971586d6c72477f1862dfa55131a3a4b98e0cf0acdfb3d2396d7f54007c76c4fded7067abdc0329
|
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--order random
|
data/.travis.yml
CHANGED
@@ -1,17 +1,21 @@
|
|
1
1
|
language: ruby
|
2
2
|
cache: bundler
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
before_install: gem i bundler
|
4
|
+
matrix:
|
5
|
+
include:
|
6
|
+
- rvm: 2.3.0
|
7
|
+
gemfile: gemfiles/Gemfile.activesupport5
|
8
|
+
- rvm: 2.2
|
9
|
+
gemfile: gemfiles/Gemfile.activesupport4
|
10
|
+
- rvm: 2.1
|
11
|
+
gemfile: gemfiles/Gemfile.activesupport4
|
12
|
+
- rvm: 2.0
|
13
|
+
gemfile: gemfiles/Gemfile.activesupport4
|
14
|
+
- rvm: jruby-9.1.5.0
|
15
|
+
jdk: oraclejdk8
|
16
|
+
gemfile: gemfiles/Gemfile.activesupport5
|
17
|
+
env:
|
18
|
+
- JRUBY_OPTS='--debug'
|
11
19
|
|
12
20
|
services:
|
13
21
|
- rabbitmq
|
14
|
-
|
15
|
-
matrix:
|
16
|
-
allow_failures:
|
17
|
-
- rvm: jruby-9.0.0.0
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,26 @@
|
|
1
1
|
## 0.23.0 — (unreleased)
|
2
2
|
|
3
|
-
|
3
|
+
This release contains a **breaking change** in the error
|
4
|
+
handlers interface.
|
4
5
|
|
6
|
+
### All Message Properties Passed to Error Handlers
|
5
7
|
|
6
|
-
|
8
|
+
Previously error handlers were provided a message ID as first
|
9
|
+
argument to `ErrorHandler#handle`. Now it is a hash of all message
|
10
|
+
properties.
|
11
|
+
|
12
|
+
This is a **breaking public API change**. If you do not use custom
|
13
|
+
error handlers, you are not affected.
|
14
|
+
|
15
|
+
Contributed by Pierre-Louis Gottfrois.
|
16
|
+
|
17
|
+
GH issue: [hutch#238](https://github.com/gocardless/hutch/pull/238)
|
18
|
+
|
19
|
+
### Opbeat Error Handler
|
20
|
+
|
21
|
+
Contributed by Olle Jonsson.
|
22
|
+
|
23
|
+
## 0.22.1 — June 7th, 2016
|
7
24
|
|
8
25
|
### Message Payload is Reported to Sentry
|
9
26
|
|
data/Gemfile
CHANGED
@@ -4,16 +4,25 @@ gemspec
|
|
4
4
|
|
5
5
|
group :development do
|
6
6
|
gem "rake"
|
7
|
-
gem "guard", "~>
|
8
|
-
gem "guard-rspec", "~>
|
7
|
+
gem "guard", "~> 2.14", platform: :mri_23
|
8
|
+
gem "guard-rspec", "~> 4.7", platform: :mri_23
|
9
|
+
|
10
|
+
gem "yard", "~> 0.9"
|
11
|
+
gem 'kramdown', "> 0", platform: :jruby
|
12
|
+
gem "redcarpet", "> 0", platform: :mri
|
13
|
+
gem "github-markup", "> 0"
|
9
14
|
end
|
10
15
|
|
11
16
|
group :development, :test do
|
17
|
+
gem "rspec", "~> 3.0"
|
18
|
+
gem "simplecov", "~> 0.12"
|
19
|
+
|
12
20
|
gem "sentry-raven"
|
13
21
|
gem "honeybadger"
|
14
|
-
gem "coveralls", require: false
|
22
|
+
gem "coveralls", "~> 0.8.15", require: false
|
15
23
|
gem "newrelic_rpm"
|
16
|
-
gem "airbrake", "~>
|
24
|
+
gem "airbrake", "~> 5.0"
|
25
|
+
gem "opbeat", "~> 3.0.9"
|
17
26
|
end
|
18
27
|
|
19
28
|
group :development, :darwin do
|
data/Guardfile
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
-
guard
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
guard :rspec, cmd: "bundle exec rspec" do
|
2
|
+
require "guard/rspec/dsl"
|
3
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
4
|
+
|
5
|
+
# RSpec files
|
6
|
+
rspec = dsl.rspec
|
7
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
8
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
9
|
+
watch(rspec.spec_files)
|
10
|
+
|
11
|
+
# Ruby files
|
12
|
+
ruby = dsl.ruby
|
13
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
5
14
|
end
|
data/README.md
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
Hutch is a Ruby library for enabling asynchronous inter-service communication
|
4
4
|
in a service-oriented architecture, using RabbitMQ.
|
5
5
|
|
6
|
-
[](http://badge.fury.io/rb/hutch)
|
7
|
+
[](https://travis-ci.org/gocardless/hutch)
|
8
|
+
[](https://gemnasium.com/gocardless/hutch)
|
9
|
+
[](https://codeclimate.com/github/gocardless/hutch)
|
10
10
|
|
11
11
|
To install with RubyGems:
|
12
12
|
|
@@ -317,6 +317,20 @@ Known configuration parameters are:
|
|
317
317
|
* `write_timeout`: Bunny's socket write timeout (default: `11`)
|
318
318
|
* `tracer`: tracer to use to track message processing
|
319
319
|
|
320
|
+
### Environment variables
|
321
|
+
|
322
|
+
The file configuration options mentioned above can also be passed in via environment variables, using the `HUTCH_` prefix, eg.
|
323
|
+
|
324
|
+
* `connection_timeout` → `HUTCH_CONNECTION_TIMEOUT`.
|
325
|
+
|
326
|
+
### Configuration precedence
|
327
|
+
|
328
|
+
In order from lowest to highest precedence:
|
329
|
+
|
330
|
+
0. Default values
|
331
|
+
0. `HUTCH_*` environment variables
|
332
|
+
0. Configuration file
|
333
|
+
0. Explicit settings through `Hutch::Config.set`
|
320
334
|
|
321
335
|
## Supported RabbitMQ Versions
|
322
336
|
|
data/hutch.gemspec
CHANGED
@@ -6,22 +6,18 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.add_runtime_dependency 'march_hare', '>= 2.16.0'
|
7
7
|
else
|
8
8
|
gem.platform = Gem::Platform::RUBY
|
9
|
-
gem.add_runtime_dependency 'bunny', '>= 2.
|
9
|
+
gem.add_runtime_dependency 'bunny', '>= 2.6.0'
|
10
10
|
end
|
11
11
|
gem.add_runtime_dependency 'carrot-top', '~> 0.0.7'
|
12
|
-
gem.add_runtime_dependency 'multi_json', '~> 1.
|
13
|
-
gem.add_runtime_dependency 'activesupport'
|
14
|
-
gem.add_development_dependency 'rspec', '~> 3.0'
|
15
|
-
gem.add_development_dependency 'simplecov', '~> 0.7.1'
|
16
|
-
gem.add_development_dependency 'yard', '~> 0.8'
|
17
|
-
gem.add_development_dependency 'redcarpet', '> 0'
|
18
|
-
gem.add_development_dependency 'github-markup', '> 0'
|
12
|
+
gem.add_runtime_dependency 'multi_json', '~> 1.12'
|
13
|
+
gem.add_runtime_dependency 'activesupport'
|
19
14
|
|
20
15
|
gem.name = 'hutch'
|
21
16
|
gem.summary = 'Easy inter-service communication using RabbitMQ.'
|
22
17
|
gem.description = 'Hutch is a Ruby library for enabling asynchronous ' +
|
23
18
|
'inter-service communication using RabbitMQ.'
|
24
19
|
gem.version = Hutch::VERSION.dup
|
20
|
+
gem.required_ruby_version = '>= 2.0'
|
25
21
|
gem.authors = ['Harry Marr']
|
26
22
|
gem.email = ['developers@gocardless.com']
|
27
23
|
gem.homepage = 'https://github.com/gocardless/hutch'
|
data/lib/hutch/broker.rb
CHANGED
data/lib/hutch/config.rb
CHANGED
@@ -134,9 +134,12 @@ module Hutch
|
|
134
134
|
ALL_KEYS = @boolean_keys + @number_keys + @string_keys
|
135
135
|
|
136
136
|
def self.initialize(params = {})
|
137
|
-
@config
|
138
|
-
|
139
|
-
|
137
|
+
unless @config
|
138
|
+
@config = default_config
|
139
|
+
define_methods
|
140
|
+
@config.merge!(env_based_config)
|
141
|
+
end
|
142
|
+
@config.merge!(params)
|
140
143
|
@config
|
141
144
|
end
|
142
145
|
|
@@ -191,8 +194,8 @@ module Hutch
|
|
191
194
|
end
|
192
195
|
|
193
196
|
def self.get(attr)
|
194
|
-
check_attr(attr)
|
195
|
-
user_config[attr]
|
197
|
+
check_attr(attr.to_sym)
|
198
|
+
user_config[attr.to_sym]
|
196
199
|
end
|
197
200
|
|
198
201
|
def self.key_for(attr)
|
@@ -213,8 +216,8 @@ module Hutch
|
|
213
216
|
end
|
214
217
|
|
215
218
|
def self.set(attr, value)
|
216
|
-
check_attr(attr)
|
217
|
-
user_config[attr] = value
|
219
|
+
check_attr(attr.to_sym)
|
220
|
+
user_config[attr.to_sym] = value
|
218
221
|
end
|
219
222
|
|
220
223
|
class << self
|
@@ -264,3 +267,4 @@ module Hutch
|
|
264
267
|
end
|
265
268
|
end
|
266
269
|
end
|
270
|
+
Hutch::Config.initialize
|
data/lib/hutch/error_handlers.rb
CHANGED
@@ -6,20 +6,30 @@ module Hutch
|
|
6
6
|
class Airbrake
|
7
7
|
include Logging
|
8
8
|
|
9
|
-
def handle(
|
9
|
+
def handle(properties, payload, consumer, ex)
|
10
|
+
message_id = properties.message_id
|
10
11
|
prefix = "message(#{message_id || '-'}): "
|
11
12
|
logger.error prefix + "Logging event to Airbrake"
|
12
13
|
logger.error prefix + "#{ex.class} - #{ex.message}"
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
:
|
19
|
-
:
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
|
15
|
+
if ::Airbrake.respond_to?(:notify_or_ignore)
|
16
|
+
::Airbrake.notify_or_ignore(ex, {
|
17
|
+
error_class: ex.class.name,
|
18
|
+
error_message: "#{ ex.class.name }: #{ ex.message }",
|
19
|
+
backtrace: ex.backtrace,
|
20
|
+
parameters: {
|
21
|
+
payload: payload,
|
22
|
+
consumer: consumer,
|
23
|
+
},
|
24
|
+
cgi_data: ENV.to_hash,
|
25
|
+
})
|
26
|
+
else
|
27
|
+
::Airbrake.notify(ex, {
|
28
|
+
payload: payload,
|
29
|
+
consumer: consumer,
|
30
|
+
cgi_data: ENV.to_hash,
|
31
|
+
})
|
32
|
+
end
|
23
33
|
end
|
24
34
|
end
|
25
35
|
end
|
@@ -6,7 +6,8 @@ module Hutch
|
|
6
6
|
class Honeybadger
|
7
7
|
include Logging
|
8
8
|
|
9
|
-
def handle(
|
9
|
+
def handle(properties, payload, consumer, ex)
|
10
|
+
message_id = properties.message_id
|
10
11
|
prefix = "message(#{message_id || '-'}): "
|
11
12
|
logger.error prefix + "Logging event to Honeybadger"
|
12
13
|
logger.error prefix + "#{ex.class} - #{ex.message}"
|
@@ -5,7 +5,8 @@ module Hutch
|
|
5
5
|
class Logger
|
6
6
|
include Logging
|
7
7
|
|
8
|
-
def handle(
|
8
|
+
def handle(properties, payload, consumer, ex)
|
9
|
+
message_id = properties.message_id
|
9
10
|
prefix = "message(#{message_id || '-'}): "
|
10
11
|
logger.error prefix + "error in consumer '#{consumer}'"
|
11
12
|
logger.error prefix + "#{ex.class} - #{ex.message}"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'hutch/logging'
|
2
|
+
require 'opbeat'
|
3
|
+
|
4
|
+
module Hutch
|
5
|
+
module ErrorHandlers
|
6
|
+
class Opbeat
|
7
|
+
include Logging
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
unless ::Opbeat.respond_to?(:report)
|
11
|
+
raise "The Opbeat error handler requires Opbeat >= 3.0"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def handle(properties, payload, consumer, ex)
|
16
|
+
message_id = properties.message_id
|
17
|
+
prefix = "message(#{message_id || '-'}):"
|
18
|
+
logger.error "#{prefix} Logging event to Opbeat"
|
19
|
+
logger.error "#{prefix} #{ex.class} - #{ex.message}"
|
20
|
+
::Opbeat.report(ex, extra: { payload: payload })
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -12,7 +12,8 @@ module Hutch
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def handle(
|
15
|
+
def handle(properties, payload, consumer, ex)
|
16
|
+
message_id = properties.message_id
|
16
17
|
prefix = "message(#{message_id || '-'}): "
|
17
18
|
logger.error prefix + "Logging event to Sentry"
|
18
19
|
logger.error prefix + "#{ex.class} - #{ex.message}"
|
data/lib/hutch/version.rb
CHANGED
data/lib/hutch/waiter.rb
CHANGED
data/lib/hutch/worker.rb
CHANGED
@@ -9,8 +9,6 @@ module Hutch
|
|
9
9
|
class Worker
|
10
10
|
include Logging
|
11
11
|
|
12
|
-
SHUTDOWN_SIGNALS = %w(QUIT TERM INT)
|
13
|
-
|
14
12
|
def initialize(broker, consumers, setup_procs)
|
15
13
|
@broker = broker
|
16
14
|
self.consumers = consumers
|
@@ -70,16 +68,16 @@ module Hutch
|
|
70
68
|
@broker.ack(delivery_info.delivery_tag)
|
71
69
|
rescue => ex
|
72
70
|
acknowledge_error(delivery_info, properties, @broker, ex)
|
73
|
-
handle_error(properties
|
71
|
+
handle_error(properties, payload, consumer, ex)
|
74
72
|
end
|
75
73
|
|
76
74
|
def with_tracing(klass)
|
77
75
|
Hutch::Config[:tracer].new(klass)
|
78
76
|
end
|
79
77
|
|
80
|
-
def handle_error(
|
78
|
+
def handle_error(*args)
|
81
79
|
Hutch::Config[:error_handlers].each do |backend|
|
82
|
-
backend.handle(
|
80
|
+
backend.handle(*args)
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
data/spec/hutch/broker_spec.rb
CHANGED
@@ -2,8 +2,16 @@ require 'spec_helper'
|
|
2
2
|
require 'hutch/broker'
|
3
3
|
|
4
4
|
describe Hutch::Broker do
|
5
|
-
|
6
|
-
|
5
|
+
before do
|
6
|
+
Hutch::Config.initialize(client_logger: Hutch::Logging.logger)
|
7
|
+
@config = Hutch::Config.to_hash
|
8
|
+
end
|
9
|
+
let!(:config) { @config }
|
10
|
+
after do
|
11
|
+
Hutch::Config.instance_variable_set(:@config, nil)
|
12
|
+
Hutch::Config.initialize
|
13
|
+
end
|
14
|
+
let(:broker) { Hutch::Broker.new(config) }
|
7
15
|
|
8
16
|
describe '#connect' do
|
9
17
|
before { allow(broker).to receive(:set_up_amqp_connection) }
|
@@ -195,7 +203,7 @@ describe Hutch::Broker do
|
|
195
203
|
after { broker.disconnect }
|
196
204
|
|
197
205
|
describe '#api_client' do
|
198
|
-
subject {
|
206
|
+
subject { broker.api_client }
|
199
207
|
it { is_expected.to be_a CarrotTop }
|
200
208
|
end
|
201
209
|
end
|
@@ -321,12 +329,12 @@ describe Hutch::Broker do
|
|
321
329
|
|
322
330
|
it 'publishes to the exchange' do
|
323
331
|
expect(broker.exchange).to receive(:publish).once
|
324
|
-
broker.publish('test.key',
|
332
|
+
broker.publish('test.key', {key: "value"})
|
325
333
|
end
|
326
334
|
|
327
335
|
it 'sets default properties' do
|
328
336
|
expect(broker.exchange).to receive(:publish).with(
|
329
|
-
JSON.dump("
|
337
|
+
JSON.dump({key: "value"}),
|
330
338
|
hash_including(
|
331
339
|
persistent: true,
|
332
340
|
routing_key: 'test.key',
|
@@ -334,12 +342,12 @@ describe Hutch::Broker do
|
|
334
342
|
)
|
335
343
|
)
|
336
344
|
|
337
|
-
broker.publish('test.key',
|
345
|
+
broker.publish('test.key', {key: "value"})
|
338
346
|
end
|
339
347
|
|
340
348
|
it 'allows passing message properties' do
|
341
349
|
expect(broker.exchange).to receive(:publish).once
|
342
|
-
broker.publish('test.key',
|
350
|
+
broker.publish('test.key', {key: "value"}, {expiration: "2000", persistent: false})
|
343
351
|
end
|
344
352
|
|
345
353
|
context 'when there are global properties' do
|
@@ -350,8 +358,8 @@ describe Hutch::Broker do
|
|
350
358
|
|
351
359
|
it 'merges the properties' do
|
352
360
|
expect(broker.exchange).
|
353
|
-
to receive(:publish).with('"
|
354
|
-
broker.publish('test.key',
|
361
|
+
to receive(:publish).with('{"key":"value"}', hash_including(app_id: 'app'))
|
362
|
+
broker.publish('test.key', {key: "value"})
|
355
363
|
end
|
356
364
|
end
|
357
365
|
|
@@ -362,8 +370,8 @@ describe Hutch::Broker do
|
|
362
370
|
|
363
371
|
it 'calls the proc and merges the properties' do
|
364
372
|
expect(broker.exchange).
|
365
|
-
to receive(:publish).with('"
|
366
|
-
broker.publish('test.key',
|
373
|
+
to receive(:publish).with('{"key":"value"}', hash_including(app_id: 'app'))
|
374
|
+
broker.publish('test.key', {key: "value"})
|
367
375
|
end
|
368
376
|
end
|
369
377
|
end
|
@@ -372,13 +380,13 @@ describe Hutch::Broker do
|
|
372
380
|
it 'does not wait for confirms on the channel', adapter: :bunny do
|
373
381
|
expect_any_instance_of(Bunny::Channel).
|
374
382
|
to_not receive(:wait_for_confirms)
|
375
|
-
broker.publish('test.key',
|
383
|
+
broker.publish('test.key', {key: "value"})
|
376
384
|
end
|
377
385
|
|
378
386
|
it 'does not wait for confirms on the channel', adapter: :march_hare do
|
379
387
|
expect_any_instance_of(MarchHare::Channel).
|
380
388
|
to_not receive(:wait_for_confirms)
|
381
|
-
broker.publish('test.key',
|
389
|
+
broker.publish('test.key', {key: "value"})
|
382
390
|
end
|
383
391
|
end
|
384
392
|
|
@@ -392,13 +400,13 @@ describe Hutch::Broker do
|
|
392
400
|
it 'waits for confirms on the channel', adapter: :bunny do
|
393
401
|
expect_any_instance_of(Bunny::Channel).
|
394
402
|
to receive(:wait_for_confirms)
|
395
|
-
broker.publish('test.key',
|
403
|
+
broker.publish('test.key', {key: "value"})
|
396
404
|
end
|
397
405
|
|
398
406
|
it 'waits for confirms on the channel', adapter: :march_hare do
|
399
407
|
expect_any_instance_of(MarchHare::Channel).
|
400
408
|
to receive(:wait_for_confirms)
|
401
|
-
broker.publish('test.key',
|
409
|
+
broker.publish('test.key', {key: "value"})
|
402
410
|
end
|
403
411
|
end
|
404
412
|
end
|
@@ -407,13 +415,13 @@ describe Hutch::Broker do
|
|
407
415
|
before { broker.set_up_amqp_connection; broker.disconnect }
|
408
416
|
|
409
417
|
it 'raises an exception' do
|
410
|
-
expect { broker.publish('test.key',
|
418
|
+
expect { broker.publish('test.key', {key: "value"}) }.
|
411
419
|
to raise_exception(Hutch::PublishError)
|
412
420
|
end
|
413
421
|
|
414
422
|
it 'logs an error' do
|
415
423
|
expect(broker.logger).to receive(:error)
|
416
|
-
broker.publish('test.key',
|
424
|
+
broker.publish('test.key', {key: "value"}) rescue nil
|
417
425
|
end
|
418
426
|
end
|
419
427
|
end
|
data/spec/hutch/config_spec.rb
CHANGED
@@ -5,9 +5,14 @@ describe Hutch::Config do
|
|
5
5
|
let(:new_value) { 'not-localhost' }
|
6
6
|
|
7
7
|
before do
|
8
|
+
Hutch::Config.instance_variable_set(:@config, nil)
|
8
9
|
Hutch::Config.initialize
|
9
10
|
end
|
10
11
|
|
12
|
+
after do
|
13
|
+
Hutch::Config.instance_variable_set(:@config, nil)
|
14
|
+
end
|
15
|
+
|
11
16
|
describe '.get' do
|
12
17
|
context 'for valid attributes' do
|
13
18
|
subject { Hutch::Config.get(:mq_host) }
|
@@ -18,9 +23,7 @@ describe Hutch::Config do
|
|
18
23
|
|
19
24
|
context 'with an overridden value' do
|
20
25
|
before do
|
21
|
-
|
22
|
-
user_config: { mq_host: new_value }
|
23
|
-
)
|
26
|
+
Hutch::Config.set(:mq_host, new_value)
|
24
27
|
end
|
25
28
|
|
26
29
|
it { is_expected.to eq(new_value) }
|
@@ -161,4 +164,24 @@ YAML
|
|
161
164
|
end
|
162
165
|
end
|
163
166
|
end
|
167
|
+
|
168
|
+
context 'developer ergonomics' do
|
169
|
+
it 'will accept strings and symbols as config keys' do
|
170
|
+
expect(Hutch::Config.get(:mq_host)).to eq '127.0.0.1'
|
171
|
+
expect(Hutch::Config.get('mq_host')).to eq '127.0.0.1'
|
172
|
+
end
|
173
|
+
|
174
|
+
describe 'it will not overwrite existing config' do
|
175
|
+
it 'with defaults' do
|
176
|
+
expect(Hutch::Config.get(:mq_host)).to eq '127.0.0.1'
|
177
|
+
Hutch::Config.initialize
|
178
|
+
|
179
|
+
Hutch::Config.set(:mq_host, 'example2.com')
|
180
|
+
|
181
|
+
expect(Hutch::Config.get(:mq_host)).to eq 'example2.com'
|
182
|
+
Hutch::Config.initialize
|
183
|
+
expect(Hutch::Config.get(:mq_host)).to eq 'example2.com'
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
164
187
|
end
|
@@ -14,21 +14,17 @@ describe Hutch::ErrorHandlers::Airbrake do
|
|
14
14
|
|
15
15
|
it "logs the error to Airbrake" do
|
16
16
|
message_id = "1"
|
17
|
+
properties = OpenStruct.new(message_id: message_id)
|
17
18
|
payload = "{}"
|
18
19
|
consumer = double
|
19
20
|
ex = error
|
20
21
|
message = {
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:parameters => {
|
25
|
-
:payload => payload,
|
26
|
-
:consumer => consumer,
|
27
|
-
},
|
28
|
-
:cgi_data => ENV.to_hash,
|
22
|
+
payload: payload,
|
23
|
+
consumer: consumer,
|
24
|
+
cgi_data: ENV.to_hash,
|
29
25
|
}
|
30
|
-
expect(::Airbrake).to receive(:
|
31
|
-
error_handler.handle(
|
26
|
+
expect(::Airbrake).to receive(:notify).with(ex, message)
|
27
|
+
error_handler.handle(properties, payload, consumer, ex)
|
32
28
|
end
|
33
29
|
end
|
34
30
|
end
|
@@ -14,6 +14,7 @@ describe Hutch::ErrorHandlers::Honeybadger do
|
|
14
14
|
|
15
15
|
it "logs the error to Honeybadger" do
|
16
16
|
message_id = "1"
|
17
|
+
properties = OpenStruct.new(message_id: message_id)
|
17
18
|
payload = "{}"
|
18
19
|
consumer = double
|
19
20
|
ex = error
|
@@ -30,7 +31,7 @@ describe Hutch::ErrorHandlers::Honeybadger do
|
|
30
31
|
}
|
31
32
|
}
|
32
33
|
expect(::Honeybadger).to receive(:notify_or_ignore).with(message)
|
33
|
-
error_handler.handle(
|
34
|
+
error_handler.handle(properties, payload, consumer, ex)
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
@@ -4,12 +4,14 @@ describe Hutch::ErrorHandlers::Logger do
|
|
4
4
|
let(:error_handler) { Hutch::ErrorHandlers::Logger.new }
|
5
5
|
|
6
6
|
describe '#handle' do
|
7
|
+
let(:properties) { OpenStruct.new(message_id: "1") }
|
8
|
+
let(:payload) { "{}" }
|
7
9
|
let(:error) { double(message: "Stuff went wrong", class: "RuntimeError",
|
8
10
|
backtrace: ["line 1", "line 2"]) }
|
9
11
|
|
10
12
|
it "logs three separate lines" do
|
11
13
|
expect(Hutch::Logging.logger).to receive(:error).exactly(3).times
|
12
|
-
error_handler.handle(
|
14
|
+
error_handler.handle(properties, payload, double, error)
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hutch::ErrorHandlers::Opbeat do
|
4
|
+
let(:error_handler) { Hutch::ErrorHandlers::Opbeat.new }
|
5
|
+
|
6
|
+
describe '#handle' do
|
7
|
+
let(:properties) { OpenStruct.new(message_id: "1") }
|
8
|
+
let(:payload) { "{}" }
|
9
|
+
let(:error) do
|
10
|
+
begin
|
11
|
+
raise "Stuff went wrong"
|
12
|
+
rescue RuntimeError => err
|
13
|
+
err
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "logs the error to Opbeat" do
|
18
|
+
expect(Opbeat).to receive(:report).with(error, extra: { payload: payload })
|
19
|
+
error_handler.handle(properties, payload, double, error)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -4,6 +4,8 @@ describe Hutch::ErrorHandlers::Sentry do
|
|
4
4
|
let(:error_handler) { Hutch::ErrorHandlers::Sentry.new }
|
5
5
|
|
6
6
|
describe '#handle' do
|
7
|
+
let(:properties) { OpenStruct.new(message_id: "1") }
|
8
|
+
let(:payload) { "{}" }
|
7
9
|
let(:error) do
|
8
10
|
begin
|
9
11
|
raise "Stuff went wrong"
|
@@ -13,8 +15,8 @@ describe Hutch::ErrorHandlers::Sentry do
|
|
13
15
|
end
|
14
16
|
|
15
17
|
it "logs the error to Sentry" do
|
16
|
-
expect(Raven).to receive(:capture_exception).with(error, extra: { payload:
|
17
|
-
error_handler.handle(
|
18
|
+
expect(Raven).to receive(:capture_exception).with(error, extra: { payload: payload })
|
19
|
+
error_handler.handle(properties, payload, double, error)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
data/spec/hutch/waiter_spec.rb
CHANGED
@@ -12,7 +12,11 @@ RSpec.describe Hutch::Waiter do
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
described_class::SHUTDOWN_SIGNALS.each do |signal|
|
16
|
+
# JRuby does not support QUIT:
|
17
|
+
# The signal QUIT is in use by the JVM and will not work correctly on this platform
|
18
|
+
next if signal == 'QUIT' && defined?(JRUBY_VERSION)
|
19
|
+
|
16
20
|
context "a #{signal} signal is received" do
|
17
21
|
it "logs that hutch is stopping" do
|
18
22
|
expect(Hutch::Logging.logger).to receive(:info)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hutch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Harry Marr
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.6.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.6.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: carrot-top
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,96 +44,26 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
47
|
+
version: '1.12'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
54
|
+
version: '1.12'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activesupport
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '3.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '3.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: simplecov
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 0.7.1
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 0.7.1
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: yard
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0.8'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0.8'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: redcarpet
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: github-markup
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">"
|
137
67
|
- !ruby/object:Gem::Version
|
138
68
|
version: '0'
|
139
69
|
description: Hutch is a Ruby library for enabling asynchronous inter-service communication
|
@@ -146,6 +76,7 @@ extensions: []
|
|
146
76
|
extra_rdoc_files: []
|
147
77
|
files:
|
148
78
|
- ".gitignore"
|
79
|
+
- ".rspec"
|
149
80
|
- ".travis.yml"
|
150
81
|
- ".yardopts"
|
151
82
|
- CHANGELOG.md
|
@@ -157,6 +88,8 @@ files:
|
|
157
88
|
- bin/hutch
|
158
89
|
- examples/consumer.rb
|
159
90
|
- examples/producer.rb
|
91
|
+
- gemfiles/Gemfile.activesupport4
|
92
|
+
- gemfiles/Gemfile.activesupport5
|
160
93
|
- hutch.gemspec
|
161
94
|
- lib/hutch.rb
|
162
95
|
- lib/hutch/acknowledgements/base.rb
|
@@ -172,6 +105,7 @@ files:
|
|
172
105
|
- lib/hutch/error_handlers/airbrake.rb
|
173
106
|
- lib/hutch/error_handlers/honeybadger.rb
|
174
107
|
- lib/hutch/error_handlers/logger.rb
|
108
|
+
- lib/hutch/error_handlers/opbeat.rb
|
175
109
|
- lib/hutch/error_handlers/sentry.rb
|
176
110
|
- lib/hutch/exceptions.rb
|
177
111
|
- lib/hutch/logging.rb
|
@@ -194,6 +128,7 @@ files:
|
|
194
128
|
- spec/hutch/error_handlers/airbrake_spec.rb
|
195
129
|
- spec/hutch/error_handlers/honeybadger_spec.rb
|
196
130
|
- spec/hutch/error_handlers/logger_spec.rb
|
131
|
+
- spec/hutch/error_handlers/opbeat_spec.rb
|
197
132
|
- spec/hutch/error_handlers/sentry_spec.rb
|
198
133
|
- spec/hutch/logger_spec.rb
|
199
134
|
- spec/hutch/message_spec.rb
|
@@ -223,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
223
158
|
requirements:
|
224
159
|
- - ">="
|
225
160
|
- !ruby/object:Gem::Version
|
226
|
-
version: '0'
|
161
|
+
version: '2.0'
|
227
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
228
163
|
requirements:
|
229
164
|
- - ">="
|
@@ -231,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
166
|
version: '0'
|
232
167
|
requirements: []
|
233
168
|
rubyforge_project:
|
234
|
-
rubygems_version: 2.
|
169
|
+
rubygems_version: 2.4.8
|
235
170
|
signing_key:
|
236
171
|
specification_version: 4
|
237
172
|
summary: Easy inter-service communication using RabbitMQ.
|
@@ -243,6 +178,7 @@ test_files:
|
|
243
178
|
- spec/hutch/error_handlers/airbrake_spec.rb
|
244
179
|
- spec/hutch/error_handlers/honeybadger_spec.rb
|
245
180
|
- spec/hutch/error_handlers/logger_spec.rb
|
181
|
+
- spec/hutch/error_handlers/opbeat_spec.rb
|
246
182
|
- spec/hutch/error_handlers/sentry_spec.rb
|
247
183
|
- spec/hutch/logger_spec.rb
|
248
184
|
- spec/hutch/message_spec.rb
|
@@ -251,4 +187,3 @@ test_files:
|
|
251
187
|
- spec/hutch/worker_spec.rb
|
252
188
|
- spec/hutch_spec.rb
|
253
189
|
- spec/spec_helper.rb
|
254
|
-
has_rdoc:
|