hutch 0.23.1 → 0.24.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4e335b78e14abc9ebf9a6d027b52b10100dfa5c
4
- data.tar.gz: 39013b71c53646886336d89718c67e056d3f3e04
3
+ metadata.gz: fb197fc767359bc60d35790ec650c9c077120d0d
4
+ data.tar.gz: e1152a8d434fdc9a4752c095ad5fdce4871ffd9e
5
5
  SHA512:
6
- metadata.gz: 2d3d9acd8724e4882d272d63adee132f308fd8d134cdb58c2b0228342f2e67fd22904dcac8d7bed61a50b2a7254ac9e935ba38e65b7978317d32139c522f37fd
7
- data.tar.gz: e1c695a9e83d0de05678d11cfbba783388968b8cfa68d287856f6f2f481e149833c043a6a46185e1c7e0552f350f8a0d1db873cb5ebe22670d37e36b668f9777
6
+ metadata.gz: c34020a830413a6e970bfae9e59fecdaebbe770aaf7df753a7f263af6d7dc98b0ae4433a4aafc27d9d8f45689168d0b39a64d3ba4086c05187fc7b0e352d9814
7
+ data.tar.gz: cc24d3e6ab11c4979455c06ba057760b00cffae9dd577a39f4f89bfe7b45a33378c2190362c2d003a5418b3e64238d2997610c8b4f8f52a5287d0765563109ad
data/.travis.yml CHANGED
@@ -1,19 +1,17 @@
1
1
  language: ruby
2
2
  cache: bundler
3
- before_install: gem i bundler
3
+ before_install:
4
+ - gem update --system
5
+ - gem install bundler
4
6
  matrix:
5
7
  include:
6
- - rvm: 2.3.0
7
- gemfile: gemfiles/Gemfile.activesupport5
8
+ - rvm: 2.4.0
9
+ - rvm: 2.3.3
8
10
  - rvm: 2.2
9
- gemfile: gemfiles/Gemfile.activesupport4
10
11
  - rvm: 2.1
11
- gemfile: gemfiles/Gemfile.activesupport4
12
12
  - rvm: 2.0
13
- gemfile: gemfiles/Gemfile.activesupport4
14
- - rvm: jruby-9.1.5.0
13
+ - rvm: jruby-9.1.7.0
15
14
  jdk: oraclejdk8
16
- gemfile: gemfiles/Gemfile.activesupport5
17
15
  env:
18
16
  - JRUBY_OPTS='--debug'
19
17
 
data/CHANGELOG.md CHANGED
@@ -1,9 +1,43 @@
1
1
  ## 0.24.0 — (unreleased)
2
2
 
3
- No changes yet.
3
+ ### Configurable Consumer Prefixes
4
4
 
5
+ Hutch consumers now can use user-provided prefixes for consumer tags.
5
6
 
6
- ## 0.23.0 October 20th, 2016
7
+ Contributed by Dávid Lantos.
8
+
9
+ GitHub issue: [#265](https://github.com/gocardless/hutch/pull/265)
10
+
11
+ ### Signal Handling in Workers
12
+
13
+ Hutch will now handle several OS signals:
14
+
15
+ * `USR2` will log stack traces of all alive VM threads
16
+ * `QUIT` (except on JRuby), `INT`, `TERM` will cause Hutch daemon to shut down
17
+
18
+ Contributed by Olle Jonsson.
19
+
20
+ GitHub issues: [#263](https://github.com/gocardless/hutch/pull/263), [#271](https://github.com/gocardless/hutch/pull/271)
21
+
22
+ ### Opbeat Tracer
23
+
24
+ Hutch now provides a tracer implementation for [Opbeat](https://opbeat.com/).
25
+
26
+ Contributed by Olle Jonsson.
27
+
28
+ GitHub issue: [#262](https://github.com/gocardless/hutch/pull/262)
29
+
30
+ ### `HUTCH_URI` Support
31
+
32
+ The `HUTCH_URI` environment variable now can be used to configure
33
+ Hutch connection URI.
34
+
35
+ Contributed by Sam Stickland.
36
+
37
+ GitHub issue: [#270](https://github.com/gocardless/hutch/pull/270)
38
+
39
+
40
+ ## 0.23.1 — October 20th, 2016
7
41
 
8
42
  This release contains a **breaking change** in the error
9
43
  handlers interface.
data/Gemfile CHANGED
@@ -1,5 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ ruby RUBY_VERSION
4
+
3
5
  gemspec
4
6
 
5
7
  group :development do
@@ -14,7 +16,7 @@ group :development do
14
16
  end
15
17
 
16
18
  group :development, :test do
17
- gem "rspec", "~> 3.0"
19
+ gem "rspec", "~> 3.5"
18
20
  gem "simplecov", "~> 0.12"
19
21
 
20
22
  gem "sentry-raven"
data/README.md CHANGED
@@ -1,29 +1,47 @@
1
1
  ![](http://cl.ly/image/3h0q3F3G142K/hutch.png)
2
2
 
3
- Hutch is a Ruby library for enabling asynchronous inter-service communication
4
- in a service-oriented architecture, using RabbitMQ.
5
-
6
3
  [![Gem Version](https://badge.fury.io/rb/hutch.svg)](http://badge.fury.io/rb/hutch)
7
4
  [![Build Status](https://travis-ci.org/gocardless/hutch.svg?branch=master)](https://travis-ci.org/gocardless/hutch)
8
5
  [![Dependency Status](https://gemnasium.com/gocardless/hutch.svg)](https://gemnasium.com/gocardless/hutch)
9
6
  [![Code Climate](https://codeclimate.com/github/gocardless/hutch.svg)](https://codeclimate.com/github/gocardless/hutch)
10
7
 
8
+ Hutch is a Ruby library for enabling asynchronous inter-service communication
9
+ in a service-oriented architecture, using RabbitMQ.
10
+
11
11
  To install with RubyGems:
12
12
 
13
13
  ```
14
14
  gem install hutch
15
15
  ```
16
16
 
17
- ## Project Maturity
17
+ <!-- Tocer[start]: Auto-generated, don't remove. -->
18
18
 
19
- Hutch is a moderately mature project (started in early 2013)
20
- that was extracted from production systems.
19
+ ### Table of Contents
21
20
 
21
+ - [Requirements](#requirements)
22
+ - [Overview](#overview)
23
+ - [Project Maturity](#project-maturity)
24
+ - [Consumers](#consumers)
25
+ - [Message Processing Tracers](#message-processing-tracers)
26
+ - [Running Hutch](#running-hutch)
27
+ - [Loading Consumers](#loading-consumers)
28
+ - [Stopping Hutch](#stopping-hutch)
29
+ - [Producers](#producers)
30
+ - [Producer Configuration](#producer-configuration)
31
+ - [Publisher Confirms](#publisher-confirms)
32
+ - [Writing Well-Behaved Publishers](#writing-well-behaved-publishers)
33
+ - [Configuration](#configuration)
34
+ - [Config File](#config-file)
35
+ - [Environment variables](#environment-variables)
36
+ - [Configuration precedence](#configuration-precedence)
37
+ - [Generated list of configuration options](#generated-list-of-configuration-options)
22
38
 
23
- ## Supported Ruby Versions
39
+ <!-- Tocer[finish]: Auto-generated, don't remove. -->
24
40
 
25
- Hutch requires CRuby 2.0+ or JRuby 9K.
41
+ ## Requirements
26
42
 
43
+ - Hutch requires Ruby 2.0+ or JRuby 9K.
44
+ - Hutch requires RabbitMQ 3.3 or later.
27
45
 
28
46
  ## Overview
29
47
 
@@ -39,8 +57,12 @@ and so on. Publishers connect to RabbitMQ via `Hutch.connect` and publish using
39
57
  Hutch uses [Bunny](http://rubybunny.info) or [March Hare](http://rubymarchhare.info)
40
58
  (on JRuby) under the hood.
41
59
 
60
+ ### Project Maturity
61
+
62
+ Hutch is a moderately mature project (started in early 2013)
63
+ that was extracted from production systems.
42
64
 
43
- ## Defining Consumers
65
+ ## Consumers
44
66
 
45
67
  Consumers receive messages from a RabbitMQ queue. That queue may be bound to
46
68
  one or more topics (represented by routing keys).
@@ -136,11 +158,13 @@ to learn more.
136
158
 
137
159
  Tracers allow you to track message processing.
138
160
 
139
- #### NewRelic
161
+ This will enable NewRelic custom instrumentation:
162
+
140
163
  ```ruby
141
164
  Hutch::Config.set(:tracer, Hutch::Tracers::NewRelic)
142
165
  ```
143
- This will enable NewRelic custom instrumentation. Batteries included! Screenshoots available [here](https://monosnap.com/list/557020a000779174f23467e3).
166
+
167
+ Batteries included!
144
168
 
145
169
  ## Running Hutch
146
170
 
@@ -279,7 +303,7 @@ end
279
303
  If using publisher confirms with amqp gem, see [this issue][pc-issue]
280
304
  and [this gist][pc-gist] for more info.
281
305
 
282
- ## Configuration Reference
306
+ ## Configuration
283
307
 
284
308
  ### Config File
285
309
 
@@ -334,7 +358,12 @@ In order from lowest to highest precedence:
334
358
 
335
359
  ### Generated list of configuration options
336
360
 
337
- <table border="1" class="settings">
361
+ Generate with
362
+
363
+ 0. `yard doc lib/hutch/config.rb`
364
+ 0. Copy the _Configuration_ section from `doc/Hutch/Config.html` here, with the anchor tags stripped.
365
+
366
+ <table border="1" class="settings" style="overflow:visible;">
338
367
  <thead>
339
368
  <tr>
340
369
  <th>
@@ -401,6 +430,15 @@ In order from lowest to highest precedence:
401
430
  </td>
402
431
  </tr>
403
432
 
433
+ <tr>
434
+ <td><tt>uri</tt></td>
435
+ <td>nil</td>
436
+ <td>String</td>
437
+ <td><tt>HUTCH_URI</tt></td>
438
+ <td><p>RabbitMQ URI (takes precedence over MQ username, password, host, port and vhost settings)</p>
439
+ </td>
440
+ </tr>
441
+
404
442
  <tr>
405
443
  <td><tt>mq_api_host</tt></td>
406
444
  <td>127.0.0.1</td>
@@ -571,15 +609,20 @@ In order from lowest to highest precedence:
571
609
  <td><p>Should Bunny's consumer work pool threads abort on exception.</p>
572
610
  </td>
573
611
  </tr>
612
+
613
+ <tr>
614
+ <td><tt>consumer_tag_prefix</tt></td>
615
+ <td>hutch</td>
616
+ <td>String</td>
617
+ <td><tt>HUTCH_CONSUMER_TAG_PREFIX</tt></td>
618
+ <td><p>Prefix displayed on the consumers tags.</p>
619
+ </td>
620
+ </tr>
574
621
 
575
622
  </tbody>
576
623
  </table>
577
624
 
578
625
 
579
- ## Supported RabbitMQ Versions
580
-
581
- Hutch requires RabbitMQ 3.3 or later.
582
-
583
626
  ---
584
627
 
585
628
  GoCardless ♥ open source. If you do too, come [join us](https://gocardless.com/jobs/backend_developer).
data/hutch.gemspec CHANGED
@@ -3,18 +3,18 @@ require File.expand_path('../lib/hutch/version', __FILE__)
3
3
  Gem::Specification.new do |gem|
4
4
  if defined?(JRUBY_VERSION)
5
5
  gem.platform = 'java'
6
- gem.add_runtime_dependency 'march_hare', '>= 2.16.0'
6
+ gem.add_runtime_dependency 'march_hare', '>= 2.22.0'
7
7
  else
8
8
  gem.platform = Gem::Platform::RUBY
9
- gem.add_runtime_dependency 'bunny', '>= 2.6.0'
9
+ gem.add_runtime_dependency 'bunny', '>= 2.6.3'
10
10
  end
11
11
  gem.add_runtime_dependency 'carrot-top', '~> 0.0.7'
12
12
  gem.add_runtime_dependency 'multi_json', '~> 1.12'
13
- gem.add_runtime_dependency 'activesupport'
13
+ gem.add_runtime_dependency 'activesupport', '>= 4.2', '< 6'
14
14
 
15
15
  gem.name = 'hutch'
16
16
  gem.summary = 'Easy inter-service communication using RabbitMQ.'
17
- gem.description = 'Hutch is a Ruby library for enabling asynchronous ' +
17
+ gem.description = 'Hutch is a Ruby library for enabling asynchronous ' \
18
18
  'inter-service communication using RabbitMQ.'
19
19
  gem.version = Hutch::VERSION.dup
20
20
  gem.required_ruby_version = '>= 2.0'
data/lib/hutch/config.rb CHANGED
@@ -60,6 +60,9 @@ module Hutch
60
60
  # RabbitMQ password
61
61
  string_setting :mq_password, 'guest'
62
62
 
63
+ # RabbitMQ URI (takes precedence over MQ username, password, host, port and vhost settings)
64
+ string_setting :uri, nil
65
+
63
66
  # RabbitMQ HTTP API hostname
64
67
  string_setting :mq_api_host, '127.0.0.1'
65
68
 
@@ -130,6 +133,9 @@ module Hutch
130
133
  # The option is ignored on JRuby.
131
134
  boolean_setting :consumer_pool_abort_on_exception, false
132
135
 
136
+ # Prefix displayed on the consumers tags.
137
+ string_setting :consumer_tag_prefix, 'hutch'
138
+
133
139
  # Set of all setting keys
134
140
  ALL_KEYS = @boolean_keys + @number_keys + @string_keys
135
141
 
@@ -267,4 +273,4 @@ module Hutch
267
273
  end
268
274
  end
269
275
  end
270
- Hutch::Config.initialize
276
+ Hutch::Config.initialize
data/lib/hutch/logging.rb CHANGED
@@ -9,13 +9,12 @@ module Hutch
9
9
  end
10
10
  end
11
11
 
12
- def self.setup_logger(target = $stdout)
12
+ def self.setup_logger
13
13
  require 'hutch/config'
14
- Hutch::Config.initialize
15
- @logger = Logger.new(target)
16
- @logger.level = Hutch::Config.log_level
17
- @logger.formatter = HutchFormatter.new
18
- @logger
14
+ @logger = Logger.new($stdout).tap do |l|
15
+ l.level = Hutch::Config.log_level
16
+ l.formatter = HutchFormatter.new
17
+ end
19
18
  end
20
19
 
21
20
  def self.logger
@@ -0,0 +1,37 @@
1
+ require 'opbeat'
2
+
3
+ module Hutch
4
+ module Tracers
5
+ # Tracer for Opbeat, which traces each message processed.
6
+ class Opbeat
7
+ KIND = 'messaging.hutch'.freeze
8
+
9
+ # @param klass [Consumer] Consumer instance (!)
10
+ def initialize(klass)
11
+ @klass = klass
12
+ end
13
+
14
+ # @param message [Message]
15
+ def handle(message)
16
+ ::Opbeat.transaction(sig, KIND, extra: extra_from(message)) do
17
+ @klass.process(message)
18
+ end.done(true)
19
+ end
20
+
21
+ private
22
+
23
+ def sig
24
+ @klass.class.name
25
+ end
26
+
27
+ def extra_from(message)
28
+ {
29
+ body: message.body.to_s,
30
+ message_id: message.message_id,
31
+ timestamp: message.timestamp,
32
+ routing_key: message.routing_key
33
+ }
34
+ end
35
+ end
36
+ end
37
+ 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 :Opbeat, 'hutch/tracers/opbeat'
5
6
  end
6
7
  end
data/lib/hutch/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Hutch
2
- VERSION = '0.23.1'.freeze
2
+ VERSION = '0.24.0'.freeze
3
3
  end
4
4
 
data/lib/hutch/waiter.rb CHANGED
@@ -1,10 +1,26 @@
1
1
  require 'hutch/logging'
2
2
 
3
3
  module Hutch
4
+ # Signal-handling class.
5
+ #
6
+ # Currently, the signal USR2 performs a thread dump,
7
+ # while QUIT, TERM and INT all perform a graceful shutdown.
4
8
  class Waiter
5
9
  include Logging
6
10
 
7
- SHUTDOWN_SIGNALS = %w(QUIT TERM INT).keep_if { |s| Signal.list.keys.include? s }.freeze
11
+ class ContinueProcessingSignals < RuntimeError
12
+ end
13
+
14
+ def self.supported_signals_of(list)
15
+ list.keep_if { |s| Signal.list.keys.include?(s) }.tap do |result|
16
+ result.delete('QUIT') if defined?(JRUBY_VERSION)
17
+ end
18
+ end
19
+
20
+ SHUTDOWN_SIGNALS = supported_signals_of(%w(QUIT TERM INT)).freeze
21
+ # We have chosen a JRuby-supported signal
22
+ USER_SIGNALS = supported_signals_of(%w(USR2)).freeze
23
+ REGISTERED_SIGNALS = (SHUTDOWN_SIGNALS + USER_SIGNALS).freeze
8
24
 
9
25
  def self.wait_until_signaled
10
26
  new.wait_until_signaled
@@ -14,14 +30,57 @@ module Hutch
14
30
  self.sig_read, self.sig_write = IO.pipe
15
31
 
16
32
  register_signal_handlers
17
- wait_for_signal
18
33
 
19
- sig = sig_read.gets.strip.downcase
20
- logger.info "caught sig#{sig}, stopping hutch..."
34
+ begin
35
+ wait_for_signal
36
+
37
+ sig = sig_read.gets.strip
38
+ handle_signal(sig)
39
+ rescue ContinueProcessingSignals
40
+ retry
41
+ end
42
+ end
43
+
44
+ def handle_signal(sig)
45
+ raise ContinueProcessingSignals unless REGISTERED_SIGNALS.include?(sig)
46
+ if user_signal?(sig)
47
+ handle_user_signal(sig)
48
+ else
49
+ handle_shutdown_signal(sig)
50
+ end
51
+ end
52
+
53
+ # @raises ContinueProcessingSignals
54
+ def handle_user_signal(sig)
55
+ case sig
56
+ when 'USR2' then log_thread_backtraces
57
+ else raise "Assertion failed - unhandled signal: #{sig.inspect}"
58
+ end
59
+ raise ContinueProcessingSignals
60
+ end
61
+
62
+ def handle_shutdown_signal(sig)
63
+ logger.info "caught SIG#{sig}, stopping hutch..."
21
64
  end
22
65
 
23
66
  private
24
67
 
68
+ def log_thread_backtraces
69
+ logger.info 'Requested a VM-wide thread stack trace dump...'
70
+ Thread.list.each do |thread|
71
+ logger.info "Thread TID-#{thread.object_id.to_s(36)} #{thread['label']}"
72
+ logger.info backtrace_for(thread)
73
+ end
74
+ end
75
+
76
+ def backtrace_for(thread)
77
+ if thread.backtrace
78
+ thread.backtrace.join("\n")
79
+ else
80
+ '<no backtrace available>'
81
+ end
82
+ end
83
+
25
84
  attr_accessor :sig_read, :sig_write
26
85
 
27
86
  def wait_for_signal
@@ -29,7 +88,7 @@ module Hutch
29
88
  end
30
89
 
31
90
  def register_signal_handlers
32
- SHUTDOWN_SIGNALS.each do |sig|
91
+ REGISTERED_SIGNALS.each do |sig|
33
92
  # This needs to be reentrant, so we queue up signals to be handled
34
93
  # in the run loop, rather than acting on signals here
35
94
  trap(sig) do
@@ -37,5 +96,9 @@ module Hutch
37
96
  end
38
97
  end
39
98
  end
99
+
100
+ def user_signal?(sig)
101
+ USER_SIGNALS.include?(sig)
102
+ end
40
103
  end
41
104
  end
data/lib/hutch/worker.rb CHANGED
@@ -4,6 +4,7 @@ require 'hutch/broker'
4
4
  require 'hutch/acknowledgements/nack_on_all_failures'
5
5
  require 'hutch/waiter'
6
6
  require 'carrot-top'
7
+ require 'securerandom'
7
8
 
8
9
  module Hutch
9
10
  class Worker
@@ -44,7 +45,7 @@ module Hutch
44
45
  queue = @broker.queue(consumer.get_queue_name, consumer.get_arguments)
45
46
  @broker.bind_queue(queue, consumer.routing_keys)
46
47
 
47
- queue.subscribe(manual_ack: true) do |*args|
48
+ queue.subscribe(consumer_tag: unique_consumer_tag, manual_ack: true) do |*args|
48
49
  delivery_info, properties, payload = Hutch::Adapter.decode_message(*args)
49
50
  handle_message(consumer, delivery_info, properties, payload)
50
51
  end
@@ -103,5 +104,13 @@ module Hutch
103
104
  private
104
105
 
105
106
  attr_accessor :setup_procs
107
+
108
+ def unique_consumer_tag
109
+ prefix = Hutch::Config[:consumer_tag_prefix]
110
+ unique_part = SecureRandom.uuid
111
+ "#{prefix}-#{unique_part}".tap do |tag|
112
+ raise "Tag must be 255 bytes long at most, current one is #{tag.bytesize} ('#{tag}')" if tag.bytesize > 255
113
+ end
114
+ end
106
115
  end
107
116
  end
@@ -12,25 +12,39 @@ RSpec.describe Hutch::Waiter do
12
12
  end
13
13
  end
14
14
 
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
-
20
- context "a #{signal} signal is received" do
21
- it "logs that hutch is stopping" do
22
- expect(Hutch::Logging.logger).to receive(:info)
23
- .with("caught sig#{signal.downcase}, stopping hutch...")
24
-
25
- start_kill_thread(signal)
26
- described_class.wait_until_signaled
27
- end
15
+ context 'a QUIT signal is received', if: RSpec::Support::Ruby.mri? do
16
+ it 'logs that hutch is stopping' do
17
+ expect(Hutch::Logging.logger).to receive(:info)
18
+ .with('caught SIGQUIT, stopping hutch...')
19
+
20
+ start_kill_thread('QUIT')
21
+ described_class.wait_until_signaled
22
+ end
23
+ end
24
+
25
+ context 'a TERM signal is received' do
26
+ it 'logs that hutch is stopping' do
27
+ expect(Hutch::Logging.logger).to receive(:info)
28
+ .with('caught SIGTERM, stopping hutch...')
29
+
30
+ start_kill_thread('TERM')
31
+ described_class.wait_until_signaled
32
+ end
33
+ end
34
+
35
+ context 'a INT signal is received' do
36
+ it 'logs that hutch is stopping' do
37
+ expect(Hutch::Logging.logger).to receive(:info)
38
+ .with('caught SIGINT, stopping hutch...')
39
+
40
+ start_kill_thread('INT')
41
+ described_class.wait_until_signaled
28
42
  end
29
43
  end
30
44
  end
31
45
 
32
46
  describe described_class::SHUTDOWN_SIGNALS do
33
- it "includes only things in Signal.list.keys" do
47
+ it 'includes only things in Signal.list.keys' do
34
48
  expect(described_class).to eq(described_class & Signal.list.keys)
35
49
  end
36
50
  end
@@ -45,9 +45,27 @@ describe Hutch::Worker do
45
45
  end
46
46
 
47
47
  it 'sets up a subscription' do
48
- expect(queue).to receive(:subscribe).with(manual_ack: true)
48
+ expect(queue).to receive(:subscribe).with(consumer_tag: %r(^hutch\-.{36}$), manual_ack: true)
49
49
  worker.setup_queue(consumer)
50
50
  end
51
+
52
+ context 'with a configured consumer tag prefix' do
53
+ before { Hutch::Config.set(:consumer_tag_prefix, 'appname') }
54
+
55
+ it 'sets up a subscription with the configured tag prefix' do
56
+ expect(queue).to receive(:subscribe).with(consumer_tag: %r(^appname\-.{36}$), manual_ack: true)
57
+ worker.setup_queue(consumer)
58
+ end
59
+ end
60
+
61
+ context 'with a configured consumer tag prefix that is too long' do
62
+ let(:maximum_size) { 255 - SecureRandom.uuid.size - 1 }
63
+ before { Hutch::Config.set(:consumer_tag_prefix, 'a'.*(maximum_size + 1)) }
64
+
65
+ it 'raises an error' do
66
+ expect { worker.setup_queue(consumer) }.to raise_error(/Tag must be 255 bytes long at most/)
67
+ end
68
+ end
51
69
  end
52
70
 
53
71
  describe '#handle_message' do
@@ -0,0 +1,44 @@
1
+ require 'hutch/message'
2
+ require 'hutch/serializers/identity'
3
+ require 'hutch/tracers'
4
+
5
+ RSpec.describe Hutch::Tracers::Opbeat do
6
+ let(:consumer) { double('the-consumer') }
7
+
8
+ subject(:tracer) { described_class.new(consumer) }
9
+
10
+ let(:message) do
11
+ Hutch::Message.new(double('the-delivery-info', routing_key: 'foo.bar',
12
+ exchange: 'foo'),
13
+ double('the-properties', message_id: 'the-id',
14
+ timestamp: 'the-time'),
15
+ double('the-payload', to_s: 'the-body'),
16
+ Hutch::Serializers::Identity)
17
+ end
18
+
19
+ it 'formats messages as extra information' do
20
+ expected_extra = {
21
+ body: 'the-body',
22
+ message_id: 'the-id',
23
+ timestamp: 'the-time',
24
+ routing_key: 'foo.bar'
25
+ }
26
+ expect(Opbeat).to receive(:transaction).with(anything,
27
+ 'messaging.hutch',
28
+ extra: expected_extra) {
29
+ double('done-callback', done: true)
30
+ }
31
+
32
+ tracer.handle(message)
33
+ end
34
+
35
+ it 'presents consumer class name as Opbeat tracing signature' do
36
+ expect(Opbeat).to receive(:transaction).with(consumer.class.name,
37
+ 'messaging.hutch',
38
+ anything) {
39
+ double('done-callback', done: true)
40
+ }
41
+
42
+ tracer.handle(message)
43
+ end
44
+ end
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.23.1
4
+ version: 0.24.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-10-19 00:00:00.000000000 Z
11
+ date: 2017-02-01 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.6.0
19
+ version: 2.6.3
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.6.0
26
+ version: 2.6.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: carrot-top
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,20 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '4.2'
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '6'
62
65
  type: :runtime
63
66
  prerelease: false
64
67
  version_requirements: !ruby/object:Gem::Requirement
65
68
  requirements:
66
69
  - - ">="
67
70
  - !ruby/object:Gem::Version
68
- version: '0'
71
+ version: '4.2'
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '6'
69
75
  description: Hutch is a Ruby library for enabling asynchronous inter-service communication
70
76
  using RabbitMQ.
71
77
  email:
@@ -88,8 +94,6 @@ files:
88
94
  - bin/hutch
89
95
  - examples/consumer.rb
90
96
  - examples/producer.rb
91
- - gemfiles/Gemfile.activesupport4
92
- - gemfiles/Gemfile.activesupport5
93
97
  - hutch.gemspec
94
98
  - lib/hutch.rb
95
99
  - lib/hutch/acknowledgements/base.rb
@@ -116,6 +120,7 @@ files:
116
120
  - lib/hutch/tracers.rb
117
121
  - lib/hutch/tracers/newrelic.rb
118
122
  - lib/hutch/tracers/null_tracer.rb
123
+ - lib/hutch/tracers/opbeat.rb
119
124
  - lib/hutch/version.rb
120
125
  - lib/hutch/waiter.rb
121
126
  - lib/hutch/worker.rb
@@ -137,6 +142,7 @@ files:
137
142
  - spec/hutch/worker_spec.rb
138
143
  - spec/hutch_spec.rb
139
144
  - spec/spec_helper.rb
145
+ - spec/tracers/opbeat_spec.rb
140
146
  - templates/default/class/html/settings.erb
141
147
  - templates/default/class/setup.rb
142
148
  - templates/default/fulldoc/html/css/hutch.css
@@ -166,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
172
  version: '0'
167
173
  requirements: []
168
174
  rubyforge_project:
169
- rubygems_version: 2.4.8
175
+ rubygems_version: 2.5.1
170
176
  signing_key:
171
177
  specification_version: 4
172
178
  summary: Easy inter-service communication using RabbitMQ.
@@ -187,3 +193,4 @@ test_files:
187
193
  - spec/hutch/worker_spec.rb
188
194
  - spec/hutch_spec.rb
189
195
  - spec/spec_helper.rb
196
+ - spec/tracers/opbeat_spec.rb
@@ -1,2 +0,0 @@
1
- eval_gemfile File.expand_path('../../Gemfile', __FILE__)
2
- gem 'activesupport', '~> 4.0'
@@ -1,2 +0,0 @@
1
- eval_gemfile File.expand_path('../../Gemfile', __FILE__)
2
- gem 'activesupport', '>= 4.0'