hutch 0.28.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,31 +1,26 @@
1
1
  require 'hutch/logging'
2
- require 'raven'
2
+ require 'sentry-ruby'
3
3
  require 'hutch/error_handlers/base'
4
4
 
5
5
  module Hutch
6
6
  module ErrorHandlers
7
7
  class Sentry < Base
8
-
9
- def initialize
10
- unless Raven.respond_to?(:capture_exception)
11
- raise "The Hutch Sentry error handler requires Raven >= 0.4.0"
12
- end
13
- end
14
-
15
8
  def handle(properties, payload, consumer, ex)
16
9
  message_id = properties.message_id
17
10
  prefix = "message(#{message_id || '-'}):"
18
11
  logger.error "#{prefix} Logging event to Sentry"
19
12
  logger.error "#{prefix} #{ex.class} - #{ex.message}"
20
- Raven.capture_exception(ex, extra: { payload: payload })
13
+ ::Sentry.configure_scope do |scope|
14
+ scope.set_context("payload", payload)
15
+ end
16
+ ::Sentry.capture_exception(ex)
21
17
  end
22
18
 
23
19
  def handle_setup_exception(ex)
24
20
  logger.error "Logging setup exception to Sentry"
25
21
  logger.error "#{ex.class} - #{ex.message}"
26
- Raven.capture_exception(ex)
22
+ ::Sentry.capture_exception(ex)
27
23
  end
28
-
29
24
  end
30
25
  end
31
26
  end
@@ -0,0 +1,31 @@
1
+ require 'hutch/logging'
2
+ require 'raven'
3
+ require 'hutch/error_handlers/base'
4
+
5
+ module Hutch
6
+ module ErrorHandlers
7
+ class SentryRaven < Base
8
+
9
+ def initialize
10
+ unless Raven.respond_to?(:capture_exception)
11
+ raise "The Hutch Sentry error handler requires Raven >= 0.4.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 Sentry"
19
+ logger.error "#{prefix} #{ex.class} - #{ex.message}"
20
+ Raven.capture_exception(ex, extra: { payload: payload })
21
+ end
22
+
23
+ def handle_setup_exception(ex)
24
+ logger.error "Logging setup exception to Sentry"
25
+ logger.error "#{ex.class} - #{ex.message}"
26
+ Raven.capture_exception(ex)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -2,8 +2,10 @@ module Hutch
2
2
  module ErrorHandlers
3
3
  autoload :Logger, 'hutch/error_handlers/logger'
4
4
  autoload :Sentry, 'hutch/error_handlers/sentry'
5
+ autoload :SentryRaven, 'hutch/error_handlers/sentry_raven'
5
6
  autoload :Honeybadger, 'hutch/error_handlers/honeybadger'
6
7
  autoload :Airbrake, 'hutch/error_handlers/airbrake'
7
8
  autoload :Rollbar, 'hutch/error_handlers/rollbar'
9
+ autoload :Bugsnag, 'hutch/error_handlers/bugsnag'
8
10
  end
9
11
  end
@@ -6,7 +6,7 @@ module Hutch
6
6
  class JSON
7
7
 
8
8
  def self.encode(payload)
9
- ::JSON.dump(payload)
9
+ ::MultiJson.dump(payload)
10
10
  end
11
11
 
12
12
  def self.decode(payload)
@@ -0,0 +1,17 @@
1
+ require 'ddtrace'
2
+
3
+ module Hutch
4
+ module Tracers
5
+ class Datadog
6
+ def initialize(klass)
7
+ @klass = klass
8
+ end
9
+
10
+ def handle(message)
11
+ ::Datadog.tracer.trace(@klass.class.name, service: 'hutch', span_type: 'rabbitmq') do
12
+ @klass.process(message)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
data/lib/hutch/tracers.rb CHANGED
@@ -2,5 +2,6 @@ module Hutch
2
2
  module Tracers
3
3
  autoload :NullTracer, 'hutch/tracers/null_tracer'
4
4
  autoload :NewRelic, 'hutch/tracers/newrelic'
5
+ autoload :Datadog, 'hutch/tracers/datadog'
5
6
  end
6
7
  end
data/lib/hutch/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hutch
2
- VERSION = '0.28.0'.freeze
2
+ VERSION = '1.1.1'.freeze
3
3
  end
data/lib/hutch/worker.rb CHANGED
@@ -47,7 +47,7 @@ module Hutch
47
47
  def setup_queue(consumer)
48
48
  logger.info "setting up queue: #{consumer.get_queue_name}"
49
49
 
50
- queue = @broker.queue(consumer.get_queue_name, consumer.get_arguments)
50
+ queue = @broker.queue(consumer.get_queue_name, consumer.get_options)
51
51
  @broker.bind_queue(queue, consumer.routing_keys)
52
52
 
53
53
  queue.subscribe(consumer_tag: unique_consumer_tag, manual_ack: true) do |*args|
@@ -262,7 +262,7 @@ describe Hutch::Broker do
262
262
  args.first == ''
263
263
  args.last == arguments
264
264
  end
265
- broker.queue('test', arguments)
265
+ broker.queue('test', arguments: arguments)
266
266
  end
267
267
  end
268
268
 
@@ -49,6 +49,44 @@ describe Hutch::Config do
49
49
  context 'sets value in user config hash' do
50
50
  it { is_expected.to eq(new_value) }
51
51
  end
52
+
53
+ context 'type casting' do
54
+ context 'number attributes' do
55
+ before { Hutch::Config.set(:heartbeat, new_value) }
56
+ subject(:value) { Hutch::Config.user_config[:heartbeat] }
57
+
58
+ let(:new_value) { "0" }
59
+
60
+
61
+ specify 'casts values to integers' do
62
+ expect(value).to eq 0
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'boolean attributes' do
68
+ before { Hutch::Config.set(:autoload_rails, new_value) }
69
+ subject(:value) { Hutch::Config.user_config[:autoload_rails] }
70
+
71
+ let(:new_value) { "t" }
72
+
73
+
74
+ specify 'casts values to booleans' do
75
+ expect(value).to eq true
76
+ end
77
+ end
78
+
79
+ context 'string attributes' do
80
+ before { Hutch::Config.set(:mq_exchange_type, new_value) }
81
+ subject(:value) { Hutch::Config.user_config[:mq_exchange_type] }
82
+
83
+ let(:new_value) { 1 }
84
+
85
+
86
+ specify 'does not perform any typecasting' do
87
+ expect(value).to eq new_value
88
+ end
89
+ end
52
90
  end
53
91
 
54
92
  context 'for invalid attributes' do
@@ -28,17 +28,30 @@ describe Hutch::Consumer do
28
28
  ComplexConsumer
29
29
  end
30
30
 
31
- let(:consumer_with_custom_queue_options) do
32
- unless defined? ConsumerWithCustomQueueOptions
33
- class ConsumerWithCustomQueueOptions
31
+ let(:consumer_using_quorum_queue) do
32
+ unless defined? ConsumerUsingQuorumQueue
33
+ class ConsumerUsingQuorumQueue
34
34
  include Hutch::Consumer
35
35
  consume 'hutch.test1'
36
36
  arguments foo: :bar
37
- lazy_queue
37
+
38
38
  quorum_queue
39
39
  end
40
40
  end
41
- ConsumerWithCustomQueueOptions
41
+ ConsumerUsingQuorumQueue
42
+ end
43
+
44
+ let(:consumer_using_classic_queue) do
45
+ unless defined? ConsumerUsingLazyQueue
46
+ class ConsumerUsingLazyQueue
47
+ include Hutch::Consumer
48
+ consume 'hutch.test1'
49
+ arguments foo: :bar
50
+ lazy_queue
51
+ classic_queue
52
+ end
53
+ end
54
+ ConsumerUsingLazyQueue
42
55
  end
43
56
 
44
57
  describe 'module inclusion' do
@@ -84,26 +97,33 @@ describe Hutch::Consumer do
84
97
  end
85
98
  end
86
99
 
87
- describe '.lazy_queue' do
88
- it 'does not use lazy mode by default' do
89
- expect(simple_consumer.queue_mode).to eq('default')
100
+ describe 'default queue mode' do
101
+ it 'does not specify any mode by default' do
102
+ expect(simple_consumer.queue_mode).to eq(nil)
103
+ expect(simple_consumer.queue_type).to eq(nil)
90
104
  end
105
+ end
91
106
 
107
+ describe '.lazy_queue' do
92
108
  context 'when queue mode has been set explicitly to lazy' do
93
109
  it 'sets queue mode to lazy' do
94
- expect(consumer_with_custom_queue_options.queue_mode).to eq('lazy')
110
+ expect(consumer_using_classic_queue.queue_mode).to eq('lazy')
95
111
  end
96
112
  end
97
113
  end
98
114
 
99
- describe '.quorum_queue' do
100
- it 'does not have quorum type by default' do
101
- expect(simple_consumer.queue_type).to eq('classic')
115
+ describe '.classic_queue' do
116
+ context 'when queue type has been set explicitly to classic' do
117
+ it 'sets queue type to classic' do
118
+ expect(consumer_using_classic_queue.queue_type).to eq('classic')
119
+ end
102
120
  end
121
+ end
103
122
 
123
+ describe '.quorum_queue' do
104
124
  context 'when queue type has been set explicitly to quorum' do
105
125
  it 'sets queue type to quorum' do
106
- expect(consumer_with_custom_queue_options.queue_type).to eq('quorum')
126
+ expect(consumer_using_quorum_queue.queue_type).to eq('quorum')
107
127
  end
108
128
 
109
129
  it 'accepts initial group size as an option' do
@@ -125,34 +145,26 @@ describe Hutch::Consumer do
125
145
  end
126
146
 
127
147
  describe '.get_arguments' do
128
-
129
148
  context 'when defined' do
130
149
  it { expect(complex_consumer.get_arguments).to include(foo: :bar) }
131
150
  end
132
151
 
133
- context 'when not defined' do
134
- it 'has the default values for queue custom options' do
135
- expect(simple_consumer.get_arguments).to have_key('x-queue-mode')
136
- .and have_key('x-queue-type')
137
- end
138
- end
139
-
140
152
  context 'when queue is lazy' do
141
153
  it 'has the x-queue-mode argument set to lazy' do
142
- expect(consumer_with_custom_queue_options.get_arguments['x-queue-mode'])
154
+ expect(consumer_using_classic_queue.get_arguments['x-queue-mode'])
143
155
  .to eq('lazy')
144
156
  end
145
157
  end
146
158
 
147
159
  context "when queue's type is quorum" do
148
- let(:arguments) { consumer_with_custom_queue_options.get_arguments }
160
+ let(:arguments) { consumer_using_quorum_queue.get_arguments }
149
161
  it 'has the x-queue-type argument set to quorum' do
150
162
  expect(arguments['x-queue-type']).to eq('quorum')
151
163
  expect(arguments).to_not have_key('x-quorum-initial-group-size')
152
164
  end
153
165
 
154
166
  it 'has the x-quorum-initial-group-size argument set to quorum' do
155
- consumer_with_custom_queue_options.quorum_queue(initial_group_size: 5)
167
+ consumer_using_quorum_queue.quorum_queue(initial_group_size: 5)
156
168
  expect(arguments['x-queue-type']).to eq('quorum')
157
169
  expect(arguments['x-quorum-initial-group-size']).to eq(5)
158
170
  end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Hutch::ErrorHandlers::Bugsnag do
6
+ let(:error_handler) { described_class.new }
7
+
8
+ before do
9
+ Bugsnag.configure do |bugsnag|
10
+ bugsnag.api_key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11
+ end
12
+ end
13
+
14
+ describe "#handle" do
15
+ let(:error) do
16
+ begin
17
+ raise "Stuff went wrong"
18
+ rescue RuntimeError => err
19
+ err
20
+ end
21
+ end
22
+
23
+ it "logs the error to Bugsnag" do
24
+ message_id = "1"
25
+ properties = OpenStruct.new(message_id: message_id)
26
+ payload = "{}"
27
+ consumer = double
28
+ ex = error
29
+ message = {
30
+ payload: payload,
31
+ consumer: consumer
32
+ }
33
+
34
+ expect(::Bugsnag).to receive(:notify).with(ex).and_call_original
35
+ expect_any_instance_of(::Bugsnag::Report).to receive(:add_tab).with(:hutch, message)
36
+ error_handler.handle(properties, payload, consumer, ex)
37
+ end
38
+ end
39
+
40
+ describe "#handle_setup_exception" do
41
+ let(:error) do
42
+ begin
43
+ raise "Stuff went wrong"
44
+ rescue RuntimeError => err
45
+ err
46
+ end
47
+ end
48
+
49
+ it "logs the error to Bugsnag" do
50
+ ex = error
51
+ expect(::Bugsnag).to receive(:notify).with(ex)
52
+ error_handler.handle_setup_exception(ex)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hutch::ErrorHandlers::SentryRaven do
4
+ let(:error_handler) { Hutch::ErrorHandlers::SentryRaven.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 Sentry" do
18
+ expect(Raven).to receive(:capture_exception).with(error, extra: { payload: payload })
19
+ error_handler.handle(properties, payload, double, error)
20
+ end
21
+ end
22
+
23
+ describe '#handle_setup_exception' do
24
+ let(:error) do
25
+ begin
26
+ raise "Stuff went wrong during setup"
27
+ rescue RuntimeError => err
28
+ err
29
+ end
30
+ end
31
+
32
+ it "logs the error to Sentry" do
33
+ expect(Raven).to receive(:capture_exception).with(error)
34
+ error_handler.handle_setup_exception(error)
35
+ end
36
+ end
37
+ end
@@ -15,7 +15,8 @@ describe Hutch::ErrorHandlers::Sentry do
15
15
  end
16
16
 
17
17
  it "logs the error to Sentry" do
18
- expect(Raven).to receive(:capture_exception).with(error, extra: { payload: payload })
18
+ expect(::Sentry).to receive(:capture_exception).with(error).and_call_original
19
+
19
20
  error_handler.handle(properties, payload, double, error)
20
21
  end
21
22
  end
@@ -30,7 +31,8 @@ describe Hutch::ErrorHandlers::Sentry do
30
31
  end
31
32
 
32
33
  it "logs the error to Sentry" do
33
- expect(Raven).to receive(:capture_exception).with(error)
34
+ expect(::Sentry).to receive(:capture_exception).with(error).and_call_original
35
+
34
36
  error_handler.handle_setup_exception(error)
35
37
  end
36
38
  end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Hutch::Tracers::Datadog do
4
+ describe "#handle" do
5
+ subject(:handle) { tracer.handle(message) }
6
+
7
+ let(:tracer) { described_class.new(klass) }
8
+ let(:klass) do
9
+ Class.new do
10
+ attr_reader :message
11
+
12
+ def initialize
13
+ @message = nil
14
+ end
15
+
16
+ def class
17
+ OpenStruct.new(name: 'ClassName')
18
+ end
19
+
20
+ def process(message)
21
+ @message = message
22
+ end
23
+ end.new
24
+ end
25
+ let(:message) { double(:message) }
26
+
27
+ before do
28
+ allow(Datadog.tracer).to receive(:trace).and_call_original
29
+ end
30
+
31
+ it 'uses Datadog tracer' do
32
+ handle
33
+
34
+ expect(Datadog.tracer).to have_received(:trace).with('ClassName',
35
+ hash_including(service: 'hutch', span_type: 'rabbitmq'))
36
+ end
37
+
38
+ it 'processes the message' do
39
+ expect {
40
+ handle
41
+ }.to change { klass.message }.from(nil).to(message)
42
+ end
43
+ end
44
+ end
@@ -4,7 +4,7 @@ require 'hutch/worker'
4
4
  describe Hutch::Worker do
5
5
  let(:consumer) { double('Consumer', routing_keys: %w( a b c ),
6
6
  get_queue_name: 'consumer', get_arguments: {},
7
- get_serializer: nil) }
7
+ get_options: {}, get_serializer: nil) }
8
8
  let(:consumers) { [consumer, double('Consumer')] }
9
9
  let(:broker) { Hutch::Broker.new }
10
10
  let(:setup_procs) { Array.new(2) { Proc.new {} } }
@@ -35,7 +35,7 @@ describe Hutch::Worker do
35
35
  before { allow(broker).to receive_messages(queue: queue, bind_queue: nil) }
36
36
 
37
37
  it 'creates a queue' do
38
- expect(broker).to receive(:queue).with(consumer.get_queue_name, consumer.get_arguments).and_return(queue)
38
+ expect(broker).to receive(:queue).with(consumer.get_queue_name, consumer.get_options).and_return(queue)
39
39
  worker.setup_queue(consumer)
40
40
  end
41
41
 
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hutch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.28.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry Marr
8
- autorequire:
8
+ - Michael Klishin
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2020-03-17 00:00:00.000000000 Z
12
+ date: 2022-03-18 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bunny
@@ -16,20 +17,20 @@ dependencies:
16
17
  requirements:
17
18
  - - ">="
18
19
  - !ruby/object:Gem::Version
19
- version: '2.14'
20
+ version: '2.19'
20
21
  - - "<"
21
22
  - !ruby/object:Gem::Version
22
- version: '2.16'
23
+ version: '3.0'
23
24
  type: :runtime
24
25
  prerelease: false
25
26
  version_requirements: !ruby/object:Gem::Requirement
26
27
  requirements:
27
28
  - - ">="
28
29
  - !ruby/object:Gem::Version
29
- version: '2.14'
30
+ version: '2.19'
30
31
  - - "<"
31
32
  - !ruby/object:Gem::Version
32
- version: '2.16'
33
+ version: '3.0'
33
34
  - !ruby/object:Gem::Dependency
34
35
  name: carrot-top
35
36
  requirement: !ruby/object:Gem::Requirement
@@ -50,14 +51,14 @@ dependencies:
50
51
  requirements:
51
52
  - - "~>"
52
53
  - !ruby/object:Gem::Version
53
- version: '1.14'
54
+ version: '1.15'
54
55
  type: :runtime
55
56
  prerelease: false
56
57
  version_requirements: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - "~>"
59
60
  - !ruby/object:Gem::Version
60
- version: '1.14'
61
+ version: '1.15'
61
62
  - !ruby/object:Gem::Dependency
62
63
  name: activesupport
63
64
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +68,7 @@ dependencies:
67
68
  version: '4.2'
68
69
  - - "<"
69
70
  - !ruby/object:Gem::Version
70
- version: '7'
71
+ version: '8'
71
72
  type: :runtime
72
73
  prerelease: false
73
74
  version_requirements: !ruby/object:Gem::Requirement
@@ -77,19 +78,18 @@ dependencies:
77
78
  version: '4.2'
78
79
  - - "<"
79
80
  - !ruby/object:Gem::Version
80
- version: '7'
81
+ version: '8'
81
82
  description: Hutch is a Ruby library for enabling asynchronous inter-service communication
82
- using RabbitMQ.
83
+ using RabbitMQ
83
84
  email:
84
- - developers@gocardless.com
85
85
  executables:
86
86
  - hutch
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
+ - ".github/workflows/test.yml"
90
91
  - ".gitignore"
91
92
  - ".rspec"
92
- - ".travis.yml"
93
93
  - ".yardopts"
94
94
  - CHANGELOG.md
95
95
  - Gemfile
@@ -98,6 +98,7 @@ files:
98
98
  - README.md
99
99
  - Rakefile
100
100
  - bin/ci/before_build.sh
101
+ - bin/ci/before_build_docker.sh
101
102
  - bin/ci/install_on_debian.sh
102
103
  - bin/hutch
103
104
  - examples/consumer.rb
@@ -116,10 +117,12 @@ files:
116
117
  - lib/hutch/error_handlers.rb
117
118
  - lib/hutch/error_handlers/airbrake.rb
118
119
  - lib/hutch/error_handlers/base.rb
120
+ - lib/hutch/error_handlers/bugsnag.rb
119
121
  - lib/hutch/error_handlers/honeybadger.rb
120
122
  - lib/hutch/error_handlers/logger.rb
121
123
  - lib/hutch/error_handlers/rollbar.rb
122
124
  - lib/hutch/error_handlers/sentry.rb
125
+ - lib/hutch/error_handlers/sentry_raven.rb
123
126
  - lib/hutch/exceptions.rb
124
127
  - lib/hutch/logging.rb
125
128
  - lib/hutch/message.rb
@@ -127,6 +130,7 @@ files:
127
130
  - lib/hutch/serializers/identity.rb
128
131
  - lib/hutch/serializers/json.rb
129
132
  - lib/hutch/tracers.rb
133
+ - lib/hutch/tracers/datadog.rb
130
134
  - lib/hutch/tracers/newrelic.rb
131
135
  - lib/hutch/tracers/null_tracer.rb
132
136
  - lib/hutch/version.rb
@@ -139,13 +143,16 @@ files:
139
143
  - spec/hutch/config_spec.rb
140
144
  - spec/hutch/consumer_spec.rb
141
145
  - spec/hutch/error_handlers/airbrake_spec.rb
146
+ - spec/hutch/error_handlers/bugsnag_spec.rb
142
147
  - spec/hutch/error_handlers/honeybadger_spec.rb
143
148
  - spec/hutch/error_handlers/logger_spec.rb
144
149
  - spec/hutch/error_handlers/rollbar_spec.rb
150
+ - spec/hutch/error_handlers/sentry_raven_spec.rb
145
151
  - spec/hutch/error_handlers/sentry_spec.rb
146
152
  - spec/hutch/logger_spec.rb
147
153
  - spec/hutch/message_spec.rb
148
154
  - spec/hutch/serializers/json_spec.rb
155
+ - spec/hutch/tracers/datadog_spec.rb
149
156
  - spec/hutch/waiter_spec.rb
150
157
  - spec/hutch/worker_spec.rb
151
158
  - spec/hutch_spec.rb
@@ -159,11 +166,11 @@ files:
159
166
  - templates/default/method_details/text/settings.erb
160
167
  - templates/default/module/html/settings.erb
161
168
  - templates/default/module/setup.rb
162
- homepage: https://github.com/gocardless/hutch
169
+ homepage: https://github.com/ruby-amqp/hutch
163
170
  licenses:
164
171
  - MIT
165
172
  metadata: {}
166
- post_install_message:
173
+ post_install_message:
167
174
  rdoc_options: []
168
175
  require_paths:
169
176
  - lib
@@ -178,23 +185,26 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
185
  - !ruby/object:Gem::Version
179
186
  version: '0'
180
187
  requirements: []
181
- rubygems_version: 3.0.3
182
- signing_key:
188
+ rubygems_version: 3.1.4
189
+ signing_key:
183
190
  specification_version: 4
184
- summary: Easy inter-service communication using RabbitMQ.
191
+ summary: Opinionated asynchronous inter-service communication using RabbitMQ
185
192
  test_files:
186
193
  - spec/hutch/broker_spec.rb
187
194
  - spec/hutch/cli_spec.rb
188
195
  - spec/hutch/config_spec.rb
189
196
  - spec/hutch/consumer_spec.rb
190
197
  - spec/hutch/error_handlers/airbrake_spec.rb
198
+ - spec/hutch/error_handlers/bugsnag_spec.rb
191
199
  - spec/hutch/error_handlers/honeybadger_spec.rb
192
200
  - spec/hutch/error_handlers/logger_spec.rb
193
201
  - spec/hutch/error_handlers/rollbar_spec.rb
202
+ - spec/hutch/error_handlers/sentry_raven_spec.rb
194
203
  - spec/hutch/error_handlers/sentry_spec.rb
195
204
  - spec/hutch/logger_spec.rb
196
205
  - spec/hutch/message_spec.rb
197
206
  - spec/hutch/serializers/json_spec.rb
207
+ - spec/hutch/tracers/datadog_spec.rb
198
208
  - spec/hutch/waiter_spec.rb
199
209
  - spec/hutch/worker_spec.rb
200
210
  - spec/hutch_spec.rb