sensu-transport 3.3.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|