sensu-transport 3.3.0 → 4.0.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/lib/sensu/transport/base.rb +32 -12
- data/lib/sensu/transport/patches/amqp.rb +1 -1
- data/lib/sensu/transport/rabbitmq.rb +106 -39
- data/lib/sensu/transport/redis.rb +12 -10
- data/sensu-transport.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ce225a451ad7f61802de97848a4cc88153f3ebb
|
4
|
+
data.tar.gz: 2a206e0652fc6c6735a86aeb7be35b218ee14c0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24be969e850d8a38bdf898a01c61a4923e970a77cf38bc31b4ef0e2b771785fdc7fca9bbb6b848383f3dc9d467a568666b0b2a43384ba0979465919a656ce196
|
7
|
+
data.tar.gz: 52c1e08b2a6daf56195866c649e465951a3f925f0267c7e3c42101659ba8d4941c7e34f5c5c8a5312db23419269e8e42a73a46f3187085734698270f943884a9
|
data/lib/sensu/transport/base.rb
CHANGED
@@ -71,10 +71,10 @@ module Sensu
|
|
71
71
|
# @param options [Hash] the options to publish the message with.
|
72
72
|
# @yield [info] passes publish info to an optional callback/block.
|
73
73
|
# @yieldparam info [Hash] contains publish information, which
|
74
|
-
# may contain an error object.
|
75
|
-
def publish(type, pipe, message, options={}
|
74
|
+
# may contain an error object (:error).
|
75
|
+
def publish(type, pipe, message, options={})
|
76
76
|
info = {:error => nil}
|
77
|
-
|
77
|
+
yield(info) if block_given?
|
78
78
|
end
|
79
79
|
|
80
80
|
# Subscribe to a transport pipe and/or funnel.
|
@@ -89,30 +89,31 @@ module Sensu
|
|
89
89
|
# the consumer callback/block.
|
90
90
|
# @yieldparam info [Hash] contains message information.
|
91
91
|
# @yieldparam message [String] message.
|
92
|
-
def subscribe(type, pipe, funnel=nil, options={}
|
92
|
+
def subscribe(type, pipe, funnel=nil, options={})
|
93
93
|
info = {}
|
94
94
|
message = ''
|
95
|
-
|
95
|
+
yield(info, message)
|
96
96
|
end
|
97
97
|
|
98
98
|
# Unsubscribe from all transport pipes and/or funnels.
|
99
99
|
#
|
100
100
|
# @yield [info] passes info to an optional callback/block.
|
101
101
|
# @yieldparam info [Hash] contains unsubscribe information.
|
102
|
-
def unsubscribe
|
102
|
+
def unsubscribe
|
103
103
|
info = {}
|
104
|
-
|
104
|
+
yield(info) if block_given?
|
105
105
|
end
|
106
106
|
|
107
107
|
# Acknowledge the delivery of a message from the transport.
|
108
108
|
#
|
109
109
|
# @param info [Hash] message information, eg. contains its id.
|
110
110
|
# @yield [info] passes acknowledgment info to an optional callback/block.
|
111
|
-
def acknowledge(info
|
112
|
-
|
111
|
+
def acknowledge(info)
|
112
|
+
yield(info) if block_given?
|
113
113
|
end
|
114
114
|
|
115
|
-
# Alias for acknowledge()
|
115
|
+
# Alias for acknowledge(). This should be superseded by a proper
|
116
|
+
# alias via alias_method in the transport class.
|
116
117
|
def ack(*args, &callback)
|
117
118
|
acknowledge(*args, &callback)
|
118
119
|
end
|
@@ -121,9 +122,11 @@ module Sensu
|
|
121
122
|
#
|
122
123
|
# @param funnel [String] the transport funnel to get stats for.
|
123
124
|
# @param options [Hash] the options to get funnel stats with.
|
124
|
-
|
125
|
+
# @yield [info] passes funnel stats a callback/block.
|
126
|
+
# @yieldparam info [Hash] contains funnel stats.
|
127
|
+
def stats(funnel, options={})
|
125
128
|
info = {}
|
126
|
-
|
129
|
+
yield(info) if block_given?
|
127
130
|
end
|
128
131
|
|
129
132
|
# Discover available transports (Subclasses)
|
@@ -132,6 +135,23 @@ module Sensu
|
|
132
135
|
klass < self
|
133
136
|
end
|
134
137
|
end
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
# Catch transport errors and call the on_error callback,
|
142
|
+
# providing it with the error object as an argument. This method
|
143
|
+
# is intended to be applied where necessary, not to be confused
|
144
|
+
# with a catch-all. Not all transports will need this.
|
145
|
+
#
|
146
|
+
# @yield [] callback/block to execute within a rescue block to
|
147
|
+
# catch transport errors.
|
148
|
+
def catch_errors
|
149
|
+
begin
|
150
|
+
yield
|
151
|
+
rescue => error
|
152
|
+
@on_error.call(error)
|
153
|
+
end
|
154
|
+
end
|
135
155
|
end
|
136
156
|
end
|
137
157
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module AMQP
|
2
2
|
class Session
|
3
3
|
def send_heartbeat
|
4
|
-
if tcp_connection_established? && !reconnecting?
|
4
|
+
if tcp_connection_established? && !reconnecting? && !closed?
|
5
5
|
send_frame(AMQ::Protocol::HeartbeatFrame)
|
6
6
|
if !@handling_skipped_heartbeats && @last_server_heartbeat
|
7
7
|
if @last_server_heartbeat < (Time.now - (self.heartbeat_interval * 2))
|
@@ -8,6 +8,9 @@ require File.join(File.dirname(__FILE__), "patches", "amqp")
|
|
8
8
|
module Sensu
|
9
9
|
module Transport
|
10
10
|
class RabbitMQ < Base
|
11
|
+
# RabbitMQ connection setup.
|
12
|
+
#
|
13
|
+
# @param options [Hash, String]
|
11
14
|
def connect(options={})
|
12
15
|
reset
|
13
16
|
set_connection_options(options)
|
@@ -15,6 +18,9 @@ module Sensu
|
|
15
18
|
connect_with_eligible_options
|
16
19
|
end
|
17
20
|
|
21
|
+
# Reconnect to RabbitMQ.
|
22
|
+
#
|
23
|
+
# @param force [Boolean] the reconnect.
|
18
24
|
def reconnect(force=false)
|
19
25
|
unless @reconnecting
|
20
26
|
@reconnecting = true
|
@@ -24,70 +30,134 @@ module Sensu
|
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
33
|
+
# Indicates if connected to RabbitMQ.
|
34
|
+
#
|
35
|
+
# @return [TrueClass, FalseClass]
|
27
36
|
def connected?
|
28
37
|
@connection.connected?
|
29
38
|
end
|
30
39
|
|
40
|
+
# Close the RabbitMQ connection.
|
31
41
|
def close
|
32
42
|
callback = Proc.new { @connection.close }
|
33
43
|
connected? ? callback.call : EM.next_tick(callback)
|
34
44
|
end
|
35
45
|
|
36
|
-
|
37
|
-
|
38
|
-
|
46
|
+
# Publish a message to RabbitMQ.
|
47
|
+
#
|
48
|
+
# @param type [Symbol] the RabbitMQ exchange type, possible
|
49
|
+
# values are: :direct and :fanout.
|
50
|
+
# @param pipe [String] the RabbitMQ exchange name.
|
51
|
+
# @param message [String] the message to be published to
|
52
|
+
# RabbitMQ.
|
53
|
+
# @param options [Hash] the options to publish the message with.
|
54
|
+
# @yield [info] passes publish info to an optional
|
55
|
+
# callback/block.
|
56
|
+
# @yieldparam info [Hash] contains publish information.
|
57
|
+
def publish(type, pipe, message, options={})
|
58
|
+
catch_errors do
|
59
|
+
@channel.method(type.to_sym).call(pipe, options).publish(message) do
|
39
60
|
info = {}
|
40
|
-
|
61
|
+
yield(info) if block_given?
|
41
62
|
end
|
42
|
-
rescue => error
|
43
|
-
info = {:error => error}
|
44
|
-
callback.call(info) if callback
|
45
63
|
end
|
46
64
|
end
|
47
65
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
66
|
+
# Subscribe to a RabbitMQ queue.
|
67
|
+
#
|
68
|
+
# @param type [Symbol] the RabbitMQ exchange type, possible
|
69
|
+
# values are: :direct and :fanout.
|
70
|
+
# @param pipe [String] the RabbitMQ exhange name.
|
71
|
+
# @param funnel [String] the RabbitMQ queue.
|
72
|
+
# @param options [Hash] the options to consume messages with.
|
73
|
+
# @yield [info, message] passes message info and content to the
|
74
|
+
# consumer callback/block.
|
75
|
+
# @yieldparam info [Hash] contains message information.
|
76
|
+
# @yieldparam message [String] message.
|
77
|
+
def subscribe(type, pipe, funnel="", options={}, &callback)
|
78
|
+
catch_errors do
|
79
|
+
previously_declared = @queues.has_key?(funnel)
|
80
|
+
@queues[funnel] ||= @channel.queue!(funnel, :auto_delete => true)
|
81
|
+
queue = @queues[funnel]
|
82
|
+
queue.bind(@channel.method(type.to_sym).call(pipe))
|
83
|
+
unless previously_declared
|
84
|
+
queue.subscribe(options, &callback)
|
85
|
+
end
|
55
86
|
end
|
56
87
|
end
|
57
88
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
89
|
+
# Unsubscribe from all RabbitMQ queues.
|
90
|
+
#
|
91
|
+
# @yield [info] passes info to an optional callback/block.
|
92
|
+
# @yieldparam info [Hash] contains unsubscribe information.
|
93
|
+
def unsubscribe
|
94
|
+
catch_errors do
|
95
|
+
@queues.values.each do |queue|
|
96
|
+
if connected?
|
64
97
|
queue.unsubscribe
|
98
|
+
else
|
99
|
+
queue.before_recovery do
|
100
|
+
queue.unsubscribe
|
101
|
+
end
|
65
102
|
end
|
66
103
|
end
|
104
|
+
@queues = {}
|
105
|
+
@channel.recover if connected?
|
67
106
|
end
|
68
|
-
@queues = {}
|
69
|
-
@channel.recover if connected?
|
70
107
|
super
|
71
108
|
end
|
72
109
|
|
73
|
-
|
74
|
-
|
75
|
-
|
110
|
+
# Acknowledge the delivery of a message from RabbitMQ.
|
111
|
+
#
|
112
|
+
# @param info [Hash] message info containing its delivery tag.
|
113
|
+
# @yield [info] passes acknowledgment info to an optional
|
114
|
+
# callback/block.
|
115
|
+
def acknowledge(info)
|
116
|
+
catch_errors do
|
117
|
+
info.ack
|
118
|
+
end
|
119
|
+
super
|
76
120
|
end
|
77
121
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
122
|
+
# A proper alias for acknowledge().
|
123
|
+
alias_method :ack, :acknowledge
|
124
|
+
|
125
|
+
# RabbitMQ queue stats, including message and consumer counts.
|
126
|
+
#
|
127
|
+
# @param funnel [String] the RabbitMQ queue to get stats for.
|
128
|
+
# @param options [Hash] the options to get queue stats with.
|
129
|
+
# @yield [info] passes queue stats to the callback/block.
|
130
|
+
# @yieldparam info [Hash] contains queue stats.
|
131
|
+
def stats(funnel, options={})
|
132
|
+
catch_errors do
|
133
|
+
options = options.merge(:auto_delete => true)
|
134
|
+
@channel.queue(funnel, options).status do |messages, consumers|
|
135
|
+
info = {
|
136
|
+
:messages => messages,
|
137
|
+
:consumers => consumers
|
138
|
+
}
|
139
|
+
yield(info)
|
140
|
+
end
|
86
141
|
end
|
87
142
|
end
|
88
143
|
|
89
144
|
private
|
90
145
|
|
146
|
+
# Catch RabbitMQ errors and call the on_error callback,
|
147
|
+
# providing it with the error object as an argument. This method
|
148
|
+
# is intended to be applied where necessary, not to be confused
|
149
|
+
# with a catch-all.
|
150
|
+
#
|
151
|
+
# @yield [] callback/block to execute within a rescue block to
|
152
|
+
# catch RabbitMQ errors.
|
153
|
+
def catch_errors
|
154
|
+
begin
|
155
|
+
yield
|
156
|
+
rescue AMQP::Error => error
|
157
|
+
@on_error.call(error)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
91
161
|
def reset
|
92
162
|
@queues = {}
|
93
163
|
@connection_timeout.cancel if @connection_timeout
|
@@ -111,11 +181,8 @@ module Sensu
|
|
111
181
|
@eligible_options.shift
|
112
182
|
end
|
113
183
|
|
114
|
-
def
|
115
|
-
Proc.new { reconnect }
|
116
|
-
end
|
117
|
-
|
118
|
-
def setup_connection(options={}, &callback)
|
184
|
+
def setup_connection(options={})
|
185
|
+
reconnect_callback = Proc.new { reconnect }
|
119
186
|
@connection = AMQP.connect(options, {
|
120
187
|
:on_tcp_connection_failure => reconnect_callback,
|
121
188
|
:on_possible_authentication_failure => reconnect_callback
|
@@ -123,7 +190,7 @@ module Sensu
|
|
123
190
|
@connection.logger = @logger
|
124
191
|
@connection.on_open do
|
125
192
|
@connection_timeout.cancel
|
126
|
-
|
193
|
+
yield if block_given?
|
127
194
|
end
|
128
195
|
@connection.on_tcp_connection_loss(&reconnect_callback)
|
129
196
|
@connection.on_skipped_heartbeats(&reconnect_callback)
|
@@ -112,7 +112,7 @@ module Sensu
|
|
112
112
|
#
|
113
113
|
# @yield [info] passes info to an optional callback/block.
|
114
114
|
# @yieldparam info [Hash] empty hash.
|
115
|
-
def unsubscribe
|
115
|
+
def unsubscribe
|
116
116
|
@connections.each do |name, connection|
|
117
117
|
case name
|
118
118
|
when "pubsub"
|
@@ -131,13 +131,15 @@ module Sensu
|
|
131
131
|
#
|
132
132
|
# @param funnel [String] the transport funnel to get stats for.
|
133
133
|
# @param options [Hash] IGNORED by this transport.
|
134
|
-
|
134
|
+
# @yield [info] passes list stats to the callback/block.
|
135
|
+
# @yieldparam info [Hash] contains list stats.
|
136
|
+
def stats(funnel, options={})
|
135
137
|
redis_connection("redis").llen(funnel) do |messages|
|
136
138
|
info = {
|
137
139
|
:messages => messages,
|
138
140
|
:consumers => 0
|
139
141
|
}
|
140
|
-
|
142
|
+
yield(info)
|
141
143
|
end
|
142
144
|
end
|
143
145
|
|
@@ -215,11 +217,11 @@ module Sensu
|
|
215
217
|
# @yield [info] passes publish info to an optional callback/block.
|
216
218
|
# @yieldparam info [Hash] contains publish information.
|
217
219
|
# @yieldparam subscribers [String] current subscriber count.
|
218
|
-
def pubsub_publish(pipe, message
|
220
|
+
def pubsub_publish(pipe, message)
|
219
221
|
channel = redis_key("channel", pipe)
|
220
222
|
redis_connection("redis").publish(channel, message) do |subscribers|
|
221
223
|
info = {:subscribers => subscribers}
|
222
|
-
|
224
|
+
yield(info) if block_given?
|
223
225
|
end
|
224
226
|
end
|
225
227
|
|
@@ -240,7 +242,7 @@ module Sensu
|
|
240
242
|
# the consumer/method callback/block.
|
241
243
|
# @yieldparam info [Hash] contains the channel name.
|
242
244
|
# @yieldparam message [String] message content.
|
243
|
-
def pubsub_subscribe(pipe
|
245
|
+
def pubsub_subscribe(pipe)
|
244
246
|
channel = redis_key("channel", pipe)
|
245
247
|
redis_connection("pubsub").subscribe(channel) do |type, channel, message|
|
246
248
|
case type
|
@@ -250,7 +252,7 @@ module Sensu
|
|
250
252
|
@logger.debug("unsubscribed from redis channel: #{channel}") if @logger
|
251
253
|
when "message"
|
252
254
|
info = {:channel => channel}
|
253
|
-
|
255
|
+
yield(info, message)
|
254
256
|
end
|
255
257
|
end
|
256
258
|
end
|
@@ -265,11 +267,11 @@ module Sensu
|
|
265
267
|
# @yield [info] passes publish info to an optional callback/block.
|
266
268
|
# @yieldparam info [Hash] contains publish information.
|
267
269
|
# @yieldparam queued [String] current list size.
|
268
|
-
def list_publish(pipe, message
|
270
|
+
def list_publish(pipe, message)
|
269
271
|
list = redis_key("list", pipe)
|
270
272
|
redis_connection("redis").rpush(list, message) do |queued|
|
271
273
|
info = {:queued => queued}
|
272
|
-
|
274
|
+
yield(info) if block_given?
|
273
275
|
end
|
274
276
|
end
|
275
277
|
|
@@ -287,7 +289,7 @@ module Sensu
|
|
287
289
|
# @yieldparam message [String] message content.
|
288
290
|
def list_blpop(list, &callback)
|
289
291
|
redis_connection(list).blpop(list, 0) do |_, message|
|
290
|
-
EM::next_tick {list_blpop(list, &callback)}
|
292
|
+
EM::next_tick { list_blpop(list, &callback) }
|
291
293
|
callback.call({}, message)
|
292
294
|
end
|
293
295
|
end
|
data/sensu-transport.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-transport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Porter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eventmachine
|
@@ -172,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
172
|
version: '0'
|
173
173
|
requirements: []
|
174
174
|
rubyforge_project:
|
175
|
-
rubygems_version: 2.
|
175
|
+
rubygems_version: 2.4.5.1
|
176
176
|
signing_key:
|
177
177
|
specification_version: 4
|
178
178
|
summary: The Sensu transport abstraction library
|