vx-common-amqp 0.2.8 → 0.3.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: 6f440f62a17a2b97081c546964d60bd0b555db04
4
- data.tar.gz: 67e2480a6d58df8f1a11b5cdce8b8a27c4145c7c
3
+ metadata.gz: 85cc179ec72270468903a0aa0de0ea77aa2b11fa
4
+ data.tar.gz: 3bb45885f9845f638981c9aa91b23e0b4c176fe4
5
5
  SHA512:
6
- metadata.gz: 796af64304db9e66df0cc9205ce6392050b263867075506c09ab6d11d2c02f5278b8bdf7a0a1ac2658e33226596f48c2d61016fc2f6da6782240e15999a77f44
7
- data.tar.gz: ba09542be35c3991ec44bf3baff50751a4a0fc669f477ec426efff536070557f8e125c6146c0ed9b988e0d7b71f561aa6d69407c8478cbe6d6f90a585fb6308a
6
+ metadata.gz: 9154ed670fa2c0ff153d4ad05dc94fa0cb862ef32b285ad234c1d3b389005f90330072ca35ef13becedcbece50c8762fd4dac9ffe93996f7a3193280a8a52b72
7
+ data.tar.gz: f92e3d96b49d225f2fe20cddcd8d6b94c571a357cbf03bc3f76329237d84ee868fe3be3ee7c04d750e5d51a895cab4588d344f4d3a9d6c1a2663054194c4271d
@@ -14,8 +14,7 @@ module Vx
14
14
  autoload :Threaded, File.expand_path("../amqp/supervisor/threaded", __FILE__)
15
15
  end
16
16
 
17
- autoload :Logger, File.expand_path("../amqp/mixins/logger", __FILE__)
18
- autoload :Callbacks, File.expand_path("../amqp/mixins/callbacks", __FILE__)
17
+ autoload :Instrument, File.expand_path("../amqp/mixins/instrument", __FILE__)
19
18
 
20
19
  extend self
21
20
 
@@ -46,14 +45,6 @@ module Vx
46
45
  session.close
47
46
  end
48
47
 
49
- def logger
50
- config.logger
51
- end
52
-
53
- def logger=(val)
54
- config.logger = val
55
- end
56
-
57
48
  def shutdown
58
49
  Common::AMQP::Session.shutdown
59
50
  Vx::Common::AMQP::Supervisor::Threaded.shutdown
@@ -63,6 +54,18 @@ module Vx
63
54
  Common::AMQP::Session.shutdown?
64
55
  end
65
56
 
57
+ def instrument(name, payload, &block)
58
+ if config.debug?
59
+ STDOUT.puts "name: #{name} payload: #{payload.inspect}"
60
+ end
61
+
62
+ if config && config.instrumenter
63
+ config.instrumenter.instrument(name, payload, &block)
64
+ else
65
+ yield if block_given?
66
+ end
67
+ end
68
+
66
69
  end
67
70
  end
68
71
  end
@@ -8,7 +8,7 @@ module Vx
8
8
 
9
9
  attr_accessor :url, :default_exchange_options, :default_queue_options,
10
10
  :default_publish_options, :default_exchange_type, :logger, :pool_timeout,
11
- :heartbeat, :spawn_attempts, :content_type, :callbacks
11
+ :heartbeat, :spawn_attempts, :content_type, :instrumenter, :debug
12
12
 
13
13
  def initialize
14
14
  reset!
@@ -18,22 +18,14 @@ module Vx
18
18
  Common::AMQP::Formatter
19
19
  end
20
20
 
21
- %w{ before after }.each do |p|
22
- %w{ subscribe publish recieve }.each do |m|
23
- define_method "#{p}_#{m}" do |&callback|
24
- callbacks["#{p}_#{m}".to_sym] = callback
25
- end
26
- end
27
- end
28
-
29
- def on_error(&block)
30
- callbacks[:on_error] = block
31
- end
32
-
33
21
  def default_exchange_name
34
22
  "amq.#{default_exchange_type}"
35
23
  end
36
24
 
25
+ def debug?
26
+ @debug || ENV['VX_COMMON_AMQP_DEBUG']
27
+ end
28
+
37
29
  def reset!
38
30
  @url = nil
39
31
  @logger = ::Logger.new(STDOUT)
@@ -50,6 +42,7 @@ module Vx
50
42
  @content_type = 'application/json'
51
43
 
52
44
  @callbacks = {}
45
+ @instrumenter = nil
53
46
 
54
47
  @default_exchange_options = {
55
48
  durable: true,
@@ -11,12 +11,13 @@ module Vx
11
11
  autoload :Sleep, File.expand_path("../consumer/sleep", __FILE__)
12
12
  autoload :Ack, File.expand_path("../consumer/ack", __FILE__)
13
13
 
14
+ include Common::AMQP::Instrument
14
15
  include Common::AMQP::Consumer::Ack
15
- include Common::AMQP::Logger
16
16
 
17
17
  attr_accessor :delivery_info
18
18
  attr_accessor :properties
19
19
  attr_accessor :channel
20
+ attr_accessor :uuid
20
21
 
21
22
  @@classes = []
22
23
 
@@ -34,8 +35,7 @@ module Vx
34
35
  include Common::AMQP::Consumer::Configuration
35
36
  include Common::AMQP::Consumer::Publish
36
37
  include Common::AMQP::Consumer::Subscribe
37
- include Common::AMQP::Logger
38
- include Common::AMQP::Callbacks
38
+ include Common::AMQP::Instrument
39
39
 
40
40
  def shutdown?
41
41
  Common::AMQP.shutdown?
@@ -4,13 +4,26 @@ module Vx
4
4
  module Consumer::Ack
5
5
 
6
6
  def ack!(multiple = false)
7
+ instrumentation = {
8
+ consumer_id: self.class.consumer_id,
9
+ consumer: self.class.consumer_name,
10
+ multiple: multiple,
11
+ uuid: uuid,
12
+ }
7
13
  self.class.session.channel.ack delivery_info.delivery_tag, multiple
8
- debug "commit ##{delivery_info.delivery_tag.to_i}"
14
+ instrument("ack.consumer.amqp", instrumentation)
9
15
  end
10
16
 
11
17
  def nack!(multiple = false, requeue = false)
18
+ instrumentation = {
19
+ consumer_id: self.class.consumer_id,
20
+ consumer: self.class.consumer_name,
21
+ multiple: multiple,
22
+ requeue: requeue,
23
+ uuid: uuid,
24
+ }
12
25
  self.class.session.channel.ack delivery_info.delivery_tag, multiple, requeue
13
- debug "reject ##{delivery_info.delivery_tag.to_i}"
26
+ instrument("nack.consumer.amqp", instrumentation)
14
27
  end
15
28
 
16
29
  end
@@ -13,12 +13,18 @@ module Vx
13
13
 
14
14
  x = declare_exchange
15
15
 
16
- run_callbacks(:publish, message: message, exchange: x, name: consumer_id) do
16
+ instrumentation = {
17
+ message: message.inspect,
18
+ exchange: x.name,
19
+ consumer: consumer_id
20
+ }
21
+
22
+ instrument("start_publishing.consumer.amqp", instrumentation)
23
+ instrument("process_publishing.consumer.amqp", instrumentation) do
17
24
  m = serialize_message message, options[:content_type]
18
25
  x.publish m, options
19
26
  end
20
27
 
21
- debug "published #{message.inspect} to #{x.name}"
22
28
  self
23
29
  end
24
30
 
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  module Vx
2
4
  module Common
3
5
  module AMQP
@@ -16,15 +18,13 @@ module Vx
16
18
  x = declare_exchange
17
19
  q = declare_queue
18
20
 
19
- run_callbacks(:subscribe, exchange: x, queue: q, name: consumer_id) do
20
- debug "subscribing to #{q.name}:#{x.name} using #{bind_options.inspect}"
21
- q.bind(x, bind_options)
22
- debug "successfuly subscribed to #{q.name}:#{x.name}"
21
+ instrumentation = { exchange: x.name, queue: q.name, consumer: consumer_id }
22
+ instrument("start.consumer.amqp", instrumentation)
23
23
 
24
- rs = yield(x, q) if block_given?
25
- end
24
+ q.bind(x, bind_options)
25
+ rs = yield(x, q) if block_given?
26
26
 
27
- debug "shutdown"
27
+ instrument("shutdown.consumer.amqp", instrumentation)
28
28
  end
29
29
  rs
30
30
  end
@@ -33,9 +33,16 @@ module Vx
33
33
  unpacked = nil
34
34
  delivery_info, properties, payload = q.pop(ack: ack)
35
35
 
36
+ instrumentation = {
37
+ properties: properties,
38
+ consumer_id: consumer_id,
39
+ consumer: consumer_name
40
+ }
41
+
36
42
  if payload
37
- debug "recieve ##{delivery_info.delivery_tag.to_i} #{payload.inspect}"
38
- unpacked = deserialize_message properties, payload
43
+ instrument("unpacking.consumer.amqp", instrumentation) do
44
+ unpacked = deserialize_message properties, payload
45
+ end
39
46
  end
40
47
 
41
48
  [unpacked, delivery_info, properties]
@@ -51,10 +58,22 @@ module Vx
51
58
 
52
59
  if payload
53
60
  result = nil
54
-
55
- debug "recieve ##{delivery_info.delivery_tag.to_i} #{payload.inspect}"
56
- result = run_instance delivery_info, properties, payload
57
- debug "done ##{delivery_info.delivery_tag.to_i}"
61
+ uuid = SecureRandom.uuid
62
+
63
+ instrumentation = {
64
+ properties: properties,
65
+ consumer_id: consumer_id,
66
+ consumer: consumer_name,
67
+ uuid: uuid
68
+ }
69
+
70
+ instrument("start_processing.consumer.amqp", instrumentation)
71
+ instrument("process.consumer.amqp", instrumentation) do
72
+ instrument("unpacking.consumer.amqp", instrumentation) do
73
+ payload = deserialize_message properties, payload
74
+ end
75
+ result = run_instance delivery_info, properties, payload, uuid
76
+ end
58
77
 
59
78
  break if result == :shutdown
60
79
  else
@@ -63,21 +82,20 @@ module Vx
63
82
  end
64
83
  end
65
84
 
66
- def run_instance(delivery_info, properties, payload)
67
- payload = deserialize_message properties, payload
68
-
69
- run_callbacks :recieve, payload: payload, name: consumer_id do
70
- new.tap do |inst|
71
- inst.properties = properties
72
- inst.delivery_info = delivery_info
73
- end.perform payload
74
- end
85
+ def run_instance(delivery_info, properties, payload, uuid)
86
+ new.tap do |inst|
87
+ inst.properties = properties
88
+ inst.delivery_info = delivery_info
89
+ inst.uuid = uuid
90
+ end.perform payload
75
91
  end
76
92
 
77
93
  def deserialize_message(properties, payload)
78
- Common::AMQP::Formatter.unpack properties[:content_type],
79
- model,
80
- payload
94
+ Common::AMQP::Formatter.unpack(
95
+ properties[:content_type],
96
+ model,
97
+ payload
98
+ )
81
99
  end
82
100
 
83
101
  end
@@ -0,0 +1,13 @@
1
+ module Vx
2
+ module Common
3
+ module AMQP
4
+ module Instrument
5
+
6
+ def instrument(name, payload, &block)
7
+ Common::AMQP.instrument name, payload, &block
8
+ end
9
+
10
+ end
11
+ end
12
+ end
13
+ end
@@ -6,7 +6,7 @@ module Vx
6
6
  module AMQP
7
7
  class Session
8
8
 
9
- include Common::AMQP::Logger
9
+ include Common::AMQP::Instrument
10
10
 
11
11
  CHANNEL_KEY = :vx_amqp_channel
12
12
 
@@ -31,18 +31,15 @@ module Vx
31
31
  def close
32
32
  if open?
33
33
  @@session_lock.synchronize do
34
- info "closing connection"
35
34
  begin
36
35
  conn.close
37
36
  rescue Bunny::ChannelError => e
38
37
  warn e
39
38
  end
40
- info "wait..."
41
39
  while conn.status != :closed
42
40
  sleep 0.01
43
41
  end
44
42
  @conn = nil
45
- info "connection closed"
46
43
  end
47
44
  end
48
45
  end
@@ -55,14 +52,19 @@ module Vx
55
52
 
56
53
  @conn ||= Bunny.new config.url, heartbeat: :server
57
54
 
58
- unless conn.open?
59
- info "connecting to #{conn_info}"
60
- conn.start
61
- info "wait connection to #{conn_info}"
62
- while conn.connecting?
63
- sleep 0.01
55
+ instrumentation = {
56
+ info: conn_info
57
+ }
58
+
59
+ instrument("start_connecting.consumer.amqp", instrumentation)
60
+
61
+ instrument("connect.consumer.amqp", instrumentation) do
62
+ unless conn.open?
63
+ conn.start
64
+ while conn.connecting?
65
+ sleep 0.01
66
+ end
64
67
  end
65
- info "connected successfuly (#{server_name})"
66
68
  end
67
69
  end
68
70
 
@@ -114,7 +116,7 @@ module Vx
114
116
 
115
117
  def conn_info
116
118
  if conn
117
- "#{conn.user}:#{conn.host}:#{conn.port}/#{conn.vhost}"
119
+ "amqp://#{conn.user}@#{conn.host}:#{conn.port}/#{conn.vhost}"
118
120
  end
119
121
  end
120
122
 
@@ -5,8 +5,7 @@ module Vx
5
5
  module AMQP
6
6
  class Supervisor::Threaded
7
7
 
8
- include Common::AMQP::Logger
9
- include Common::AMQP::Callbacks
8
+ include Common::AMQP::Instrument
10
9
 
11
10
  POOL_INTERVAL = 0.5
12
11
 
@@ -136,7 +135,8 @@ module Vx
136
135
  new_task.attempt = attempt
137
136
  new_task.start_at = Time.now
138
137
  new_task.freeze
139
- debug "spawn #{new_task.inspect}"
138
+ instrument("spawn.consumer.ampq", task: new_task)
139
+ new_task
140
140
  end
141
141
  end
142
142
 
@@ -148,8 +148,13 @@ module Vx
148
148
  nil
149
149
  rescue Exception => e
150
150
  STDERR.puts "#{e.inspect} in #{task.inspect}"
151
- STDERR.puts e.backtrace.join("\n")
152
- run_on_error_callback(e)
151
+ STDERR.puts e.backtrace.map{|b| " #{b}" }.join("\n")
152
+
153
+ instrument("exception.consumer.amqp", payload: {
154
+ exception: e,
155
+ task: task.inspect
156
+ })
157
+
153
158
  e
154
159
  end
155
160
  end
@@ -1,7 +1,7 @@
1
1
  module Vx
2
2
  module Common
3
3
  module AMQP
4
- VERSION = "0.2.8"
4
+ VERSION = "0.3.0"
5
5
  end
6
6
  end
7
7
  end
@@ -3,30 +3,4 @@ require 'spec_helper'
3
3
  describe Vx::Common::AMQP::Config do
4
4
  let(:config) { described_class.new }
5
5
 
6
- context '(callbacks)' do
7
- %w{ before after }.each do |p|
8
- %w{ subscribe recieve publish }.each do |m|
9
- name = "#{p}_#{m}"
10
- it name do
11
- config.public_send name do |value|
12
- value
13
- end
14
-
15
- val = config.callbacks[name.to_sym].call("value")
16
- expect(val).to eq 'value'
17
- end
18
- end
19
- end
20
-
21
- context "on_error" do
22
- it "should be success" do
23
- config.on_error do |e|
24
- e
25
- end
26
- val = config.callbacks[:on_error].call "value"
27
- expect(val).to eq 'value'
28
- end
29
- end
30
- end
31
-
32
6
  end
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,8 @@ require File.expand_path '../../lib/vx/common/amqp', __FILE__
2
2
 
3
3
  require 'rspec/autorun'
4
4
 
5
+ ENV['VX_COMMON_AMQP_DEBUG'] = "1"
6
+
5
7
  Dir[File.expand_path("../..", __FILE__) + "/spec/support/**.rb"].each {|f| require f}
6
8
 
7
9
  RSpec.configure do |config|
data/spec/support/amqp.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  def delete_queue(q)
2
- Vx::Common::AMQP.logger.info "[AMQP] delete queue #{q.inspect[0..30]}"
2
+ STDOUT.puts "[AMQP] delete queue #{q.inspect[0..30]}"
3
3
  if q
4
4
  q.purge
5
5
  q.delete if_unused: false, if_empty: false
@@ -8,7 +8,7 @@ def delete_queue(q)
8
8
  end
9
9
 
10
10
  def delete_exchange(x)
11
- Vx::Common::AMQP.logger.info "[AMQP] delete exchnage #{x.inspect[0..30]}"
11
+ STDOUT.puts "[AMQP] delete exchnage #{x.inspect[0..30]}"
12
12
  x.delete if x
13
13
  true
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vx-common-amqp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Galinsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-28 00:00:00.000000000 Z
11
+ date: 2014-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -119,8 +119,7 @@ files:
119
119
  - lib/vx/common/amqp/consumer/publish.rb
120
120
  - lib/vx/common/amqp/consumer/subscribe.rb
121
121
  - lib/vx/common/amqp/formatter.rb
122
- - lib/vx/common/amqp/mixins/callbacks.rb
123
- - lib/vx/common/amqp/mixins/logger.rb
122
+ - lib/vx/common/amqp/mixins/instrument.rb
124
123
  - lib/vx/common/amqp/session.rb
125
124
  - lib/vx/common/amqp/supervisor/threaded.rb
126
125
  - lib/vx/common/amqp/testing.rb
@@ -130,7 +129,6 @@ files:
130
129
  - spec/lib/amqp/config_spec.rb
131
130
  - spec/lib/amqp/consumer_spec.rb
132
131
  - spec/lib/amqp/formatter_spec.rb
133
- - spec/lib/amqp/mixins/callbacks_spec.rb
134
132
  - spec/lib/amqp/session_spec.rb
135
133
  - spec/lib/amqp/supervisor/threaded_spec.rb
136
134
  - spec/lib/amqp_spec.rb
@@ -168,10 +166,10 @@ test_files:
168
166
  - spec/lib/amqp/config_spec.rb
169
167
  - spec/lib/amqp/consumer_spec.rb
170
168
  - spec/lib/amqp/formatter_spec.rb
171
- - spec/lib/amqp/mixins/callbacks_spec.rb
172
169
  - spec/lib/amqp/session_spec.rb
173
170
  - spec/lib/amqp/supervisor/threaded_spec.rb
174
171
  - spec/lib/amqp_spec.rb
175
172
  - spec/spec_helper.rb
176
173
  - spec/support/amqp.rb
177
174
  - spec/support/ignore_me_error.rb
175
+ has_rdoc:
@@ -1,35 +0,0 @@
1
- module Vx
2
- module Common
3
- module AMQP
4
- module Callbacks
5
-
6
- def run_callbacks(name, *args)
7
- before = "before_#{name}".to_sym
8
- after = "after_#{name}".to_sym
9
- if f = Common::AMQP.config.callbacks[before]
10
- f.call(*args)
11
- end
12
-
13
- rs = yield if block_given?
14
-
15
- if f = Common::AMQP.config.callbacks[after]
16
- f.call(*args)
17
- end
18
-
19
- rs
20
- end
21
-
22
- def run_on_error_callback(e)
23
- if f = Common::AMQP.config.callbacks[:on_error]
24
- begin
25
- f.call e
26
- rescue Exception => e
27
- $stderr.puts "ERROR on error callback: #{e.inspect}"
28
- end
29
- end
30
- end
31
-
32
- end
33
- end
34
- end
35
- end
@@ -1,17 +0,0 @@
1
- module Vx
2
- module Common
3
- module AMQP
4
- module Logger
5
-
6
- %w{ debug info warn }.each do |m|
7
- define_method m do |msg|
8
- if log = Common::AMQP.logger
9
- log.send(m, "[AMQP] #{msg}")
10
- end
11
- end
12
- end
13
-
14
- end
15
- end
16
- end
17
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Vx::Common::AMQP::Callbacks do
4
- let(:output) { [] }
5
- let(:object) { Object.new.extend described_class }
6
-
7
- before do
8
- Vx::Common::AMQP.config.reset!
9
- Vx::Common::AMQP.configure do |c|
10
- c.before_publish { |v| output << "before:#{v}" }
11
- c.after_publish { |v| output << "after:#{v}" }
12
- end
13
- end
14
-
15
- after { Vx::Common::AMQP.config.reset! }
16
-
17
- context 'run_callbacks' do
18
- it "should be success" do
19
- object.run_callbacks :publish, "call" do
20
- output << "call"
21
- end
22
- expect(output).to eq %w{ before:call call after:call }
23
- end
24
- end
25
- end
26
-