hutch 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c16188d79e67f6645279e39fc3a628d70ebb2468
4
- data.tar.gz: c82d50ef75cda6ac8482e66a561c9db6175166ec
3
+ metadata.gz: 3c92582d4268b9d9623c60f4b2588d4afc244c17
4
+ data.tar.gz: f783601d90dd7031c90c6a6372eb6f2b6b4ef2e4
5
5
  SHA512:
6
- metadata.gz: 8d264879570aa9a3b7493ac5fdf9aa9739780073a6b6649cec0d9bced34a1558e677bc2f17c543cd9cdaab493d43e82d68da275668d16d74b42c61af7447990d
7
- data.tar.gz: 6eb7f683f37389a6263bc8de520dc34084007d1cafe1ba11f6510be37bc02c3f05827dd9cbc1f4552570c8d1f81c7fd972ccc691a65ae09acd9c12f18cd797c0
6
+ metadata.gz: e40a52fafa102ec87c2df5e885dcffd48a0a6786b08cd4c133122e4da85a2a614aeca75513fbd4f3d464409b6d8189c8585ea4b9d456f893e44b97957ffcba0a
7
+ data.tar.gz: 19f8a9dc63bf258f9b0211f49f9b21a509266a1f09eb2d3e3865d3acc2d2eb13a6fdc5d4c682accbaf98ec6d4794f1775d28156723a62e88be2b68c651e4d8bc
@@ -1,3 +1,41 @@
1
+ ## 0.14.0 — (unreleased)
2
+
3
+ ### Configurable Socket Timeouts
4
+
5
+ Socket read and write timeouts are now configurable using
6
+ the `read_timeout` and `write_timeout` options, respectively.
7
+
8
+ Contributed by Chris Barton.
9
+
10
+
11
+ ### Logged Messages as Serialised as JSON
12
+
13
+ ...as opposed to Ruby object printing.
14
+
15
+ Contributed by Andrew Morton.
16
+
17
+
18
+ ### Configurable Heartbeat
19
+
20
+ Config now supports a new option: `:heartbeat`, which is passed
21
+ on to Bunny.
22
+
23
+ Contributed by Simon Taranto.
24
+
25
+
26
+ ### HoneyBadger Error Handler
27
+
28
+ Contributed by Daniel Farrell.
29
+
30
+
31
+ ### Hutch.connected? Now Returns Up-to-Date Value
32
+
33
+ `Hutch.connected?` no longer relies on an ivar and always returns
34
+ an up-to-date value.
35
+
36
+ Contributed by Pierre-Louis Gottfrois.
37
+
38
+
1
39
  ## 0.13.0 — Dec 5th, 2014
2
40
 
3
41
  ### HTTP API Can Be Disabled for Consumers
data/Gemfile CHANGED
@@ -10,6 +10,7 @@ end
10
10
 
11
11
  group :development, :test do
12
12
  gem "sentry-raven"
13
+ gem "honeybadger"
13
14
  gem "coveralls", require: false
14
15
  end
15
16
 
data/README.md CHANGED
@@ -242,12 +242,15 @@ Known configuration parameters are:
242
242
  * `force_publisher_confirms`: enables publisher confirms, forces `Hutch::Broker#wait_for_confirms` for every publish. **This is the safest option which also offers the lowest throughput**.
243
243
  * `log_level`: log level used by the standard Ruby logger (default: `Logger::INFO`)
244
244
  * `mq_exchange`: exchange to use for publishing (default: `hutch`)
245
+ * `heartbeat`: [RabbitMQ heartbeat timeout](http://rabbitmq.com/heartbeats.html) (default: `30`)
246
+ * `connection_timeout`: Bunny's socket open timeout (default: `11`)
247
+ * `read_timeout`: Bunny's socket read timeout (default: `11`)
248
+ * `write_timemout`: Bunny's socket write timeout (default: `11`)
245
249
 
246
250
 
247
251
  ## Supported RabbitMQ Versions
248
252
 
249
- Hutch requires RabbitMQ 2.x or later. 3.x releases
250
- are recommended.
253
+ Hutch requires RabbitMQ 3.3 or later.
251
254
 
252
255
  ---
253
256
 
@@ -1,7 +1,7 @@
1
1
  require File.expand_path('../lib/hutch/version', __FILE__)
2
2
 
3
3
  Gem::Specification.new do |gem|
4
- gem.add_runtime_dependency 'bunny', '>= 1.6.1'
4
+ gem.add_runtime_dependency 'bunny', '>= 1.7.0'
5
5
  gem.add_runtime_dependency 'carrot-top', '~> 0.0.7'
6
6
  gem.add_runtime_dependency 'multi_json', '~> 1.5'
7
7
  gem.add_development_dependency 'rspec', '~> 3.0'
@@ -35,15 +35,11 @@ module Hutch
35
35
  unless connected?
36
36
  @broker = Hutch::Broker.new(config)
37
37
  @broker.connect(options)
38
- @connected = true
39
38
  end
40
39
  end
41
40
 
42
41
  def self.disconnect
43
- if @broker
44
- @broker.disconnect
45
- @connected = false
46
- end
42
+ @broker.disconnect if @broker
47
43
  end
48
44
 
49
45
  def self.broker
@@ -51,7 +47,9 @@ module Hutch
51
47
  end
52
48
 
53
49
  def self.connected?
54
- @connected
50
+ return false unless broker
51
+ return false unless broker.connection
52
+ broker.connection.open?
55
53
  end
56
54
 
57
55
  def self.publish(*args)
@@ -77,15 +77,22 @@ module Hutch
77
77
  tls = @config[:mq_tls]
78
78
  tls_key = @config[:mq_tls_key]
79
79
  tls_cert = @config[:mq_tls_cert]
80
+ heartbeat = @config[:heartbeat]
80
81
  connection_timeout = @config[:connection_timeout]
82
+ read_timeout = @config[:read_timeout]
83
+ write_timeout = @config[:write_timeout]
84
+
81
85
  protocol = tls ? "amqps://" : "amqp://"
82
86
  sanitized_uri = "#{protocol}#{username}@#{host}:#{port}/#{vhost.sub(/^\//, '')}"
83
87
  logger.info "connecting to rabbitmq (#{sanitized_uri})"
84
88
  @connection = Bunny.new(host: host, port: port, vhost: vhost,
85
89
  tls: tls, tls_key: tls_key, tls_cert: tls_cert,
86
90
  username: username, password: password,
87
- heartbeat: 30, automatically_recover: true,
88
- network_recovery_interval: 1, connection_timeout: connection_timeout)
91
+ heartbeat: heartbeat, automatically_recover: true,
92
+ network_recovery_interval: 1,
93
+ connection_timeout: connection_timeout,
94
+ read_timeout: read_timeout,
95
+ write_timeout: write_timeout)
89
96
 
90
97
  with_bunny_connection_handler(sanitized_uri) do
91
98
  @connection.start
@@ -215,9 +222,9 @@ module Hutch
215
222
  }
216
223
  properties[:message_id] ||= generate_id
217
224
 
218
- logger.info("publishing message '#{message.inspect}' to #{routing_key}")
219
-
220
- response = @exchange.publish(JSON.dump(message), {persistent: true}.
225
+ json = JSON.dump(message)
226
+ logger.info("publishing message '#{json}' to #{routing_key}")
227
+ response = @exchange.publish(json, {persistent: true}.
221
228
  merge(properties).
222
229
  merge(global_properties).
223
230
  merge(non_overridable_properties))
@@ -241,7 +248,7 @@ module Hutch
241
248
  private
242
249
 
243
250
  def raise_publish_error(reason, routing_key, message)
244
- msg = "Unable to publish - #{reason}. Message: #{message.inspect}, Routing key: #{routing_key}."
251
+ msg = "unable to publish - #{reason}. Message: #{JSON.dump(message)}, Routing key: #{routing_key}."
245
252
  logger.error(msg)
246
253
  raise PublishError, msg
247
254
  end
@@ -21,6 +21,7 @@ module Hutch
21
21
  mq_api_host: 'localhost',
22
22
  mq_api_port: 15672,
23
23
  mq_api_ssl: false,
24
+ heartbeat: 30,
24
25
  # placeholder, allows specifying connection parameters
25
26
  # as a URI.
26
27
  uri: nil,
@@ -40,6 +41,8 @@ module Hutch
40
41
  force_publisher_confirms: false,
41
42
  # Heroku needs > 10. MK.
42
43
  connection_timeout: 11,
44
+ read_timeout: 11,
45
+ write_timeout: 11,
43
46
  enable_http_api_use: true
44
47
  }.merge(params)
45
48
  end
@@ -1,6 +1,7 @@
1
1
  module Hutch
2
2
  module ErrorHandlers
3
- autoload :Logger, 'hutch/error_handlers/logger'
4
- autoload :Sentry, 'hutch/error_handlers/sentry'
3
+ autoload :Logger, 'hutch/error_handlers/logger'
4
+ autoload :Sentry, 'hutch/error_handlers/sentry'
5
+ autoload :Honeybadger, 'hutch/error_handlers/honeybadger'
5
6
  end
6
7
  end
@@ -0,0 +1,28 @@
1
+ require 'hutch/logging'
2
+ require 'honeybadger'
3
+
4
+ module Hutch
5
+ module ErrorHandlers
6
+ class Honeybadger
7
+ include Logging
8
+
9
+ def handle(message_id, payload, consumer, ex)
10
+ prefix = "message(#{message_id || '-'}): "
11
+ logger.error prefix + "Logging event to Honeybadger"
12
+ logger.error prefix + "#{ex.class} - #{ex.message}"
13
+ ::Honeybadger.notify_or_ignore(
14
+ :error_class => ex.class.name,
15
+ :error_message => "#{ ex.class.name }: #{ ex.message }",
16
+ :backtrace => ex.backtrace,
17
+ :context => {
18
+ :message_id => message_id,
19
+ :consumer => consumer
20
+ },
21
+ :parameters => {
22
+ :payload => payload
23
+ }
24
+ )
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,4 +1,4 @@
1
1
  module Hutch
2
- VERSION = '0.13.0'.freeze
2
+ VERSION = '0.14.0'.freeze
3
3
  end
4
4
 
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hutch::ErrorHandlers::Honeybadger do
4
+ let(:error_handler) { Hutch::ErrorHandlers::Honeybadger.new }
5
+
6
+ describe '#handle' do
7
+ let(:error) do
8
+ begin
9
+ raise "Stuff went wrong"
10
+ rescue RuntimeError => err
11
+ err
12
+ end
13
+ end
14
+
15
+ it "logs the error to Honeybadger" do
16
+ message_id = "1"
17
+ payload = "{}"
18
+ consumer = double
19
+ ex = error
20
+ message = {
21
+ :error_class => ex.class.name,
22
+ :error_message => "#{ ex.class.name }: #{ ex.message }",
23
+ :backtrace => ex.backtrace,
24
+ :context => {
25
+ :message_id => message_id,
26
+ :consumer => consumer
27
+ },
28
+ :parameters => {
29
+ :payload => payload
30
+ }
31
+ }
32
+ expect(::Honeybadger).to receive(:notify_or_ignore).with(message)
33
+ error_handler.handle(message_id, payload, consumer, ex)
34
+ end
35
+ end
36
+ end
@@ -27,11 +27,6 @@ describe Hutch do
27
27
  action
28
28
  end
29
29
 
30
- it 'sets @connect' do
31
- action
32
-
33
- expect(Hutch.connected?).to be_truthy
34
- end
35
30
  end
36
31
 
37
32
  context 'connected' do
@@ -44,6 +39,39 @@ describe Hutch do
44
39
  end
45
40
  end
46
41
 
42
+ describe '.connected?' do
43
+ subject(:connected?) { Hutch.connected? }
44
+
45
+ before { allow(Hutch).to receive(:broker).and_return(broker) }
46
+
47
+ context 'without a broker' do
48
+ let(:broker) { nil }
49
+
50
+ it { expect(connected?).to be_falsey }
51
+ end
52
+
53
+ context 'without a connection' do
54
+ let(:connection) { nil }
55
+ let(:broker) { double(:broker, connection: connection) }
56
+
57
+ it { expect(connected?).to be_falsey }
58
+ end
59
+
60
+ context 'with a closed connection' do
61
+ let(:connection) { double(:connection, open?: false) }
62
+ let(:broker) { double(:broker, connection: connection) }
63
+
64
+ it { expect(connected?).to be_falsey }
65
+ end
66
+
67
+ context 'with an opened connection' do
68
+ let(:connection) { double(:connection, open?: true) }
69
+ let(:broker) { double(:broker, connection: connection) }
70
+
71
+ it { expect(connected?).to be_truthy }
72
+ end
73
+ end
74
+
47
75
  describe '#publish' do
48
76
  let(:broker) { double(Hutch::Broker) }
49
77
  let(:args) { ['test.key', 'message', { headers: { foo: 'bar' } }] }
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hutch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.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: 2014-12-05 00:00:00.000000000 Z
11
+ date: 2015-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.6.1
19
+ version: 1.7.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: 1.6.1
26
+ version: 1.7.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: carrot-top
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.0.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.0.7
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: multi_json
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.5'
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
54
  version: '1.5'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 0.7.1
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.7.1
83
83
  description: Hutch is a Ruby library for enabling asynchronous inter-service communication
@@ -89,8 +89,8 @@ executables:
89
89
  extensions: []
90
90
  extra_rdoc_files: []
91
91
  files:
92
- - .gitignore
93
- - .travis.yml
92
+ - ".gitignore"
93
+ - ".travis.yml"
94
94
  - CHANGELOG.md
95
95
  - Gemfile
96
96
  - Guardfile
@@ -108,6 +108,7 @@ files:
108
108
  - lib/hutch/config.rb
109
109
  - lib/hutch/consumer.rb
110
110
  - lib/hutch/error_handlers.rb
111
+ - lib/hutch/error_handlers/honeybadger.rb
111
112
  - lib/hutch/error_handlers/logger.rb
112
113
  - lib/hutch/error_handlers/sentry.rb
113
114
  - lib/hutch/exceptions.rb
@@ -119,6 +120,7 @@ files:
119
120
  - spec/hutch/cli_spec.rb
120
121
  - spec/hutch/config_spec.rb
121
122
  - spec/hutch/consumer_spec.rb
123
+ - spec/hutch/error_handlers/honeybadger_spec.rb
122
124
  - spec/hutch/error_handlers/logger_spec.rb
123
125
  - spec/hutch/error_handlers/sentry_spec.rb
124
126
  - spec/hutch/logger_spec.rb
@@ -136,17 +138,17 @@ require_paths:
136
138
  - lib
137
139
  required_ruby_version: !ruby/object:Gem::Requirement
138
140
  requirements:
139
- - - '>='
141
+ - - ">="
140
142
  - !ruby/object:Gem::Version
141
143
  version: '0'
142
144
  required_rubygems_version: !ruby/object:Gem::Requirement
143
145
  requirements:
144
- - - '>='
146
+ - - ">="
145
147
  - !ruby/object:Gem::Version
146
148
  version: '0'
147
149
  requirements: []
148
150
  rubyforge_project:
149
- rubygems_version: 2.2.2
151
+ rubygems_version: 2.4.5
150
152
  signing_key:
151
153
  specification_version: 4
152
154
  summary: Easy inter-service communication using RabbitMQ.
@@ -155,6 +157,7 @@ test_files:
155
157
  - spec/hutch/cli_spec.rb
156
158
  - spec/hutch/config_spec.rb
157
159
  - spec/hutch/consumer_spec.rb
160
+ - spec/hutch/error_handlers/honeybadger_spec.rb
158
161
  - spec/hutch/error_handlers/logger_spec.rb
159
162
  - spec/hutch/error_handlers/sentry_spec.rb
160
163
  - spec/hutch/logger_spec.rb