sensu-transport-snssqs-ng 2.3.0 → 3.0.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
- SHA1:
3
- metadata.gz: 5a81f87bd81a52f4c7d63c2526bba641302ab2ef
4
- data.tar.gz: 71c3d8300dbfdf1f90576f8402d4ac4a1f656bd5
2
+ SHA256:
3
+ metadata.gz: 37c15a1d42a378b0f35b29ede4c9884787d591e11be8c52f7f790d77c11b1f64
4
+ data.tar.gz: a405e3cd49768d82ae291545edaa98d9f1edcf8fab3f3e7fcf04c2511e5769b7
5
5
  SHA512:
6
- metadata.gz: 5a90f9b9b46f517f87626383c725fcfc1460d49a443da051757fde45501ab2a72b548be88b7a6d0a49e838aaa1ebd052805107a04df46d297572f9160cd103dd
7
- data.tar.gz: f9f459d29e5be04e02a763b8687a5623cb2738373304b947e4534584b8c5a2affe1428d4a10e07a24be9ad4e88106f80e93d1d048ba67e2b7ccb12e2e15da5c1
6
+ metadata.gz: 7339f3c05fab0a9ba77580bbaa63bb93997251bab8494c7decc3e47ed69ee45e4b569a5a484c018bab4a7c678d366573d3a11d835ba7dc2f6e671d69e02cc745
7
+ data.tar.gz: 39e257529c1eddc20b66e5e229b95dec85d0724edac051ff59f3e8c0859ffe033f14436e8319116b6ee57d23fa9c2e33c84f4df456f5e337182d8a847c4bd0fa
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -10,14 +10,18 @@ module Sensu
10
10
  class SNSSQS < Sensu::Transport::Base
11
11
  attr_accessor :logger
12
12
 
13
- STRING_STR = "String".freeze
14
- KEEPALIVES_STR = "keepalives".freeze
15
- PIPE_STR = "pipe".freeze
16
- TYPE_STR = "type".freeze
13
+ STRING_STR = 'String'.freeze
14
+ NUMBER_STR = 'Number'.freeze
15
+ KEEPALIVES_STR = 'keepalives'.freeze
16
+ PIPE_STR = 'pipe'.freeze
17
+ TYPE_STR = 'type'.freeze
17
18
 
18
19
  def initialize
19
20
  @connected = false
20
21
  @subscribing = false
22
+ @history = {}
23
+ @metrics_buffer = ''
24
+ @metrics_last_flush = 0
21
25
 
22
26
  # as of sensu 0.23.0 we need to call succeed when we have
23
27
  # successfully connected to SQS.
@@ -27,10 +31,12 @@ module Sensu
27
31
  #
28
32
  # See:
29
33
  # https://github.com/sensu/sensu/blob/cdc25b29169ef2dcd2e056416eab0e83dbe000bb/CHANGELOG.md#0230---2016-04-04
30
- succeed()
34
+ succeed
31
35
  end
32
36
 
33
- def connected?; @connected; end
37
+ def connected?
38
+ @connected
39
+ end
34
40
 
35
41
  def connect(settings)
36
42
  @settings = settings
@@ -39,7 +45,7 @@ module Sensu
39
45
  @keepalives_callback = proc {}
40
46
  # Sensu Windows install does not include a valid cert bundle for AWS
41
47
  Aws.use_bundled_cert! if Gem.win_platform?
42
- aws_client_settings = {region: @settings[:region]}
48
+ aws_client_settings = { region: @settings[:region] }
43
49
  unless @settings[:access_key_id].nil?
44
50
  aws_client_settings[:access_key_id] = @settings[:access_key_id]
45
51
  aws_client_settings[:secret_access_key] = @settings[:secret_access_key]
@@ -49,13 +55,20 @@ module Sensu
49
55
 
50
56
  # connect to statsd, if necessary
51
57
  @statsd = nil
52
- if !@settings[:statsd_addr].nil? and @settings[:statsd_addr] != ""
58
+ if !@settings[:statsd_addr].nil? && @settings[:statsd_addr] != ''
53
59
  pieces = @settings[:statsd_addr].split(':')
54
- @statsd = Statsd.new(pieces[0], pieces[1].to_i).tap { |sd|
60
+ @statsd = Statsd.new(pieces[0], pieces[1].to_i).tap do |sd|
55
61
  sd.namespace = @settings[:statsd_namespace]
56
- }
62
+ end
57
63
  @statsd_sample_rate = @settings[:statsd_sample_rate].to_f
58
64
  end
65
+
66
+ # setup custom buffer
67
+ @settings[:buffer_messages] = @settings.fetch(:buffer_messages, true)
68
+ @settings[:check_min_ok] = @settings.fetch(:check_min_ok, 10)
69
+ @settings[:check_max_delay] = @settings.fetch(:check_max_delay, 1800)
70
+ @settings[:metrics_max_size] = @settings.fetch(:metrics_max_size, 102_400)
71
+ @settings[:metrics_max_delay] = @settings.fetch(:metrics_max_delay, 900)
59
72
  end
60
73
 
61
74
  def statsd_incr(stat)
@@ -67,7 +80,7 @@ module Sensu
67
80
  # do we actually report it.
68
81
  start = Time.now
69
82
  result = yield
70
- if !@statsd.nil?
83
+ unless @statsd.nil?
71
84
  @statsd.timing(stat, ((Time.now - start) * 1000).round(5), @statsd_sample_rate)
72
85
  end
73
86
  result
@@ -90,13 +103,13 @@ module Sensu
90
103
  # called when there is a message for you to consume.
91
104
  #
92
105
  # "funnel" and "type" parameters are completely ignored.
93
- def subscribe(type, pipe, funnel = nil, options = {}, &callback)
106
+ def subscribe(type, pipe, funnel = nil, _options = {}, &callback)
94
107
  if type == :fanout
95
- self.logger.debug("skipping unsupported fanout subscription type=#{type}, pipe=#{pipe}, funnel=#{funnel}")
108
+ logger.debug("skipping unsupported fanout subscription type=#{type}, pipe=#{pipe}, funnel=#{funnel}")
96
109
  return
97
110
  end
98
111
 
99
- self.logger.info("subscribing to type=#{type}, pipe=#{pipe}, funnel=#{funnel}")
112
+ logger.info("subscribing to type=#{type}, pipe=#{pipe}, funnel=#{funnel}")
100
113
 
101
114
  if pipe == KEEPALIVES_STR
102
115
  @keepalives_callback = callback
@@ -105,31 +118,138 @@ module Sensu
105
118
  end
106
119
 
107
120
  unless @subscribing
108
- do_all_the_time {
121
+ do_all_the_time do
109
122
  EM::Iterator.new(receive_messages, 10).each do |msg, iter|
110
- statsd_time("sqs.#{@settings[:consuming_sqs_queue_url]}.process_timing") {
123
+ statsd_time("sqs.#{@settings[:consuming_sqs_queue_url]}.process_timing") do
111
124
  if msg.message_attributes[PIPE_STR].string_value == KEEPALIVES_STR
112
125
  @keepalives_callback.call(msg, msg.body)
113
126
  else
114
127
  @results_callback.call(msg, msg.body)
115
128
  end
116
- }
129
+ end
117
130
  iter.next
118
131
  end
119
- }
132
+ end
120
133
  @subscribing = true
121
134
  end
122
135
  end
123
136
 
124
137
  # acknowledge will delete the given message from the SQS queue.
125
138
  def acknowledge(info, &callback)
126
- EM.defer {
139
+ EM.defer do
127
140
  @sqs.delete_message(
128
141
  queue_url: @settings[:consuming_sqs_queue_url],
129
- receipt_handle: info.receipt_handle,
142
+ receipt_handle: info.receipt_handle
130
143
  )
131
144
  statsd_incr("sqs.#{@settings[:consuming_sqs_queue_url]}.message.deleted")
132
- callback.call(info) if callback
145
+ yield(info) if callback
146
+ end
147
+ end
148
+
149
+ def handleBuffer(raw_message)
150
+ json_message = ::JSON.parse raw_message
151
+ drop = false
152
+
153
+ if @settings[:buffer_messages] && json_message.key?('check') && json_message.key?('client')
154
+ if json_message['check']['type'] != 'metric'
155
+ return handleBufferCheckMessage(raw_message, json_message)
156
+ elsif json_message['check']['type'] == 'metric'
157
+ return handleBufferMetricMessage(raw_message, json_message)
158
+ end
159
+ end
160
+
161
+ {
162
+ 'raw_message' => raw_message,
163
+ 'json_message' => json_message,
164
+ 'drop' => drop
165
+ }
166
+ end
167
+
168
+ def handleBufferCheckMessage(raw_message, json_message)
169
+ drop = false
170
+ json_message['check']['type'] = 'standard' unless json_message['check'].key?('type')
171
+
172
+ # create initial client history
173
+ unless @history.key? json_message['client']
174
+ logger.debug("[transport-snssqs] creating event history for client #{json_message['client']}")
175
+ @history[json_message['client']] = {}
176
+ end
177
+ # create initial check history
178
+ unless @history[json_message['client']].key? json_message['check']['name']
179
+ logger.debug("[transport-snssqs] creating event history for check #{json_message['check']['name']}")
180
+ @history[json_message['client']][json_message['check']['name']] = { 'ok_count' => 0, 'last_event' => 0 }
181
+ end
182
+
183
+ # handle ok events
184
+ if json_message['check']['status'] == 0 && json_message['check'].key?('aggregate') == false && json_message['check'].key?('ttl') == false && json_message['check'].key?('force_resolve') == false
185
+ @history[json_message['client']][json_message['check']['name']]['ok_count'] += 1
186
+
187
+ if @history[json_message['client']][json_message['check']['name']]['ok_count'] < @settings[:check_min_ok]
188
+ # history ok_count is too low
189
+ logger.debug("[transport-snssqs] sending event because history ok_count #{@history[json_message['client']][json_message['check']['name']]['ok_count']} is too low for #{json_message['check']['name']}")
190
+ @history[json_message['client']][json_message['check']['name']]['last_event'] = Time.now.to_i
191
+ else
192
+ max_delay = @settings[:check_max_delay]
193
+ if json_message['check']['name'] == 'keepalive' && json_message['check'].key?('thresholds')
194
+ max_delay = json_message['check']['thresholds']['warning'] if json_message['check']['thresholds'].key?('warning')
195
+ end
196
+ if @history[json_message['client']][json_message['check']['name']]['last_event'] < (Time.now.to_i - max_delay)
197
+ # history last_event is too old
198
+ logger.debug("[transport-snssqs] sending event because last_event history #{Time.now.to_i - @history[json_message['client']][json_message['check']['name']]['last_event']} is too old for #{json_message['check']['name']}")
199
+ @history[json_message['client']][json_message['check']['name']]['last_event'] = Time.now.to_i
200
+ else
201
+ # history last_event is recent
202
+ logger.debug("[transport-snssqs] skipping event because last_event history #{Time.now.to_i - @history[json_message['client']][json_message['check']['name']]['last_event']} is recent for #{json_message['check']['name']}")
203
+ # ignore whole message
204
+ drop = true
205
+ end
206
+ end
207
+ # handle error events
208
+ else
209
+ # reset history
210
+ logger.debug("[transport-snssqs] reseting event history for #{json_message['check']['name']}")
211
+ @history[json_message['client']][json_message['check']['name']]['ok_count'] = 0
212
+ @history[json_message['client']][json_message['check']['name']]['last_event'] = 0
213
+ end
214
+
215
+ {
216
+ 'raw_message' => raw_message,
217
+ 'json_message' => json_message,
218
+ 'drop' => drop
219
+ }
220
+ end
221
+
222
+ def handleBufferMetricMessage(raw_message, json_message)
223
+ drop = false
224
+
225
+ if json_message['check']['status'] == 0 && json_message['check'].key?('force_resolve') == false
226
+
227
+ @metrics_buffer += json_message['check']['output']
228
+ if @metrics_buffer.length > 102_400 || @metrics_last_flush < ((Time.now.to_i - @settings[:metrics_max_delay]))
229
+ json_message['check']['name'] = 'combined_metrics'
230
+ json_message['check']['command'] = 'combined metrics by snssqs'
231
+ json_message['check']['interval'] = @settings[:metrics_max_delay]
232
+ json_message['check']['output'] = @metrics_buffer
233
+
234
+ raw_message = json_message.to_json
235
+ logger.info("[transport-snssqs] flushing metrics buffer #{@metrics_buffer.length}")
236
+ @metrics_buffer = ''
237
+ @metrics_last_flush = Time.now.to_i
238
+ else
239
+ # ignore whole message
240
+ logger.debug("[transport-snssqs] storing output in metrics buffer #{@metrics_buffer.length}")
241
+ drop = true
242
+ end
243
+ end
244
+
245
+ if json_message['check']['status'] != 0
246
+ drop = true
247
+ end
248
+
249
+ {
250
+ 'raw_message' => raw_message,
251
+ 'json_message' => json_message,
252
+ 'drop' => drop
133
253
  }
134
254
  end
135
255
 
@@ -138,10 +258,27 @@ module Sensu
138
258
  # The type, pipe, and options are transformed into SNS message
139
259
  # attributes and included with the message.
140
260
  def publish(type, pipe, message, options = {}, &callback)
261
+ result = handleBuffer(message)
262
+ if result['drop']
263
+ return
264
+ else
265
+ message = result['raw_message']
266
+ json_message = result['json_message']
267
+ end
268
+
141
269
  attributes = {
142
270
  TYPE_STR => str_attr(type),
143
271
  PIPE_STR => str_attr(pipe)
144
272
  }
273
+
274
+ attributes['client'] = str_attr(json_message['client']) if json_message.key?('client')
275
+ if json_message.key?('check')
276
+ attributes['check_name'] = str_attr(json_message['check']['name']) if json_message['check'].key?('name')
277
+ attributes['check_type'] = str_attr(json_message['check']['type']) if json_message['check'].key?('type')
278
+ attributes['check_status'] = int_attr(json_message['check']['status']) if json_message['check'].key?('status')
279
+ attributes['check_force_resolve'] = int_attr(json_message['check']['status']) if json_message['check'].key?('check_force_resolve')
280
+ end
281
+
145
282
  options.each do |k, v|
146
283
  attributes[k.to_s] = str_attr(v.to_s)
147
284
  end
@@ -151,7 +288,11 @@ module Sensu
151
288
  private
152
289
 
153
290
  def str_attr(str)
154
- { :data_type => STRING_STR, :string_value => str }
291
+ { data_type: STRING_STR, string_value: str }
292
+ end
293
+
294
+ def int_attr(nr)
295
+ { data_type: NUMBER_STR, string_value: nr.to_s }
155
296
  end
156
297
 
157
298
  def do_all_the_time(&blk)
@@ -163,7 +304,7 @@ module Sensu
163
304
 
164
305
  def send_message(msg, attributes, &callback)
165
306
  resp = '' if false # need to set this before the retries block
166
- with_retries(:max_tries => 2, :base_sleep_seconds => 5.0, :max_sleep_seconds => 15.0) do
307
+ with_retries(max_tries: 2, base_sleep_seconds: 5.0, max_sleep_seconds: 15.0) do
167
308
  resp = @sns.publish(
168
309
  target_arn: @settings[:publishing_sns_topic_arn],
169
310
  message: msg,
@@ -171,60 +312,58 @@ module Sensu
171
312
  )
172
313
  end
173
314
  statsd_incr("sns.#{@settings[:publishing_sns_topic_arn]}.message.published")
174
- callback.call({ :response => resp }) if callback
315
+ yield({ response: resp }) if callback
175
316
  end
176
317
 
177
- PIPE_ARR = [PIPE_STR]
318
+ PIPE_ARR = [PIPE_STR].freeze
178
319
 
179
320
  # receive_messages returns an array of SQS messages
180
321
  # for the consuming queue
181
322
  def receive_messages
182
- begin
183
- resp = @sqs.receive_message(
184
- message_attribute_names: PIPE_ARR,
185
- queue_url: @settings[:consuming_sqs_queue_url],
186
- wait_time_seconds: @settings[:wait_time_seconds],
187
- max_number_of_messages: @settings[:max_number_of_messages],
188
- )
189
- resp.messages.select do |msg|
190
- # switching whether to transform the message based on the existance of message_attributes
191
- # if this is a raw SNS message, it exists in the root of the message and no conversion is needed
192
- # if it doesn't, it is an encapsulated messsage (meaning the SNS message is a stringified JSON in the body of the SQS message)
193
- begin
194
- self.logger.debug('[transport-snssqs] msg parse start')
195
- unless msg.key? 'message_attributes'
196
- # extracting original SNS message
197
- tmp_body = ::JSON.parse msg.body
198
- self.logger.debug('[transport-snssqs] msg parsed from JSON')
199
- # if there is no Message, this isn't a SNS message and something has gone terribly wrong
200
- unless tmp_body.key? 'Message'
201
- self.logger.info('[transport-snssqs] msg body without SNS Message received')
202
- next
203
- end
204
- # replacing the body with the SNS message (as it would be in a raw delivered SNS-SQS message)
205
- msg.body = tmp_body['Message']
206
- msg.message_attributes = {}
207
- # discarding messages without attributes, since this would lead to an exception in subscribe
208
- unless tmp_body.key? 'MessageAttributes'
209
- self.logger.info('[transport-snssqs] msg body without message attributes received')
210
- next
211
- end
212
- # parsing the message_attributes
213
- tmp_body['MessageAttributes'].each do |name, value|
214
- msg.message_attributes[name] = Aws::SQS::Types::MessageAttributeValue.new
215
- msg.message_attributes[name].string_value = value['Value']
216
- msg.message_attributes[name].data_type = 'String'
217
- end
323
+ resp = @sqs.receive_message(
324
+ message_attribute_names: PIPE_ARR,
325
+ queue_url: @settings[:consuming_sqs_queue_url],
326
+ wait_time_seconds: @settings[:wait_time_seconds],
327
+ max_number_of_messages: @settings[:max_number_of_messages]
328
+ )
329
+ resp.messages.select do |msg|
330
+ # switching whether to transform the message based on the existance of message_attributes
331
+ # if this is a raw SNS message, it exists in the root of the message and no conversion is needed
332
+ # if it doesn't, it is an encapsulated messsage (meaning the SNS message is a stringified JSON in the body of the SQS message)
333
+ begin
334
+ logger.debug('[transport-snssqs] msg parse start')
335
+ unless msg.key? 'message_attributes'
336
+ # extracting original SNS message
337
+ json_message = ::JSON.parse msg.body
338
+ logger.debug('[transport-snssqs] msg parsed from JSON')
339
+ # if there is no Message, this isn't a SNS message and something has gone terribly wrong
340
+ unless json_message.key? 'Message'
341
+ logger.info('[transport-snssqs] msg body without SNS Message received')
342
+ next
343
+ end
344
+ # replacing the body with the SNS message (as it would be in a raw delivered SNS-SQS message)
345
+ msg.body = json_message['Message']
346
+ msg.message_attributes = {}
347
+ # discarding messages without attributes, since this would lead to an exception in subscribe
348
+ unless json_message.key? 'MessageAttributes'
349
+ logger.info('[transport-snssqs] msg body without message attributes received')
350
+ next
351
+ end
352
+ # parsing the message_attributes
353
+ json_message['MessageAttributes'].each do |name, value|
354
+ msg.message_attributes[name] = Aws::SQS::Types::MessageAttributeValue.new
355
+ msg.message_attributes[name].string_value = value['Value']
356
+ msg.message_attributes[name].data_type = 'String'
218
357
  end
219
- self.logger.debug('[transport-snssqs] msg parsed successfully')
220
- msg
221
- rescue ::JSON::JSONError => e
222
- self.logger.info(e)
223
358
  end
359
+ logger.debug('[transport-snssqs] msg parsed successfully')
360
+ msg
361
+ rescue ::JSON::JSONError => e
362
+ logger.info(e)
224
363
  end
225
- rescue Aws::SQS::Errors::ServiceError => e
226
- self.logger.info(e)
227
364
  end
365
+ rescue Aws::SQS::Errors::ServiceError => e
366
+ logger.info(e)
228
367
  end
229
368
  end
230
369
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-transport-snssqs-ng
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Troy Ready
@@ -10,28 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDjjCCAnagAwIBAgIBATANBgkqhkiG9w0BAQUFADBGMRgwFgYDVQQDDA90cm95
14
- LnJlYWR5X2dlbXMxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixk
15
- ARkWA2NvbTAeFw0xNzEyMTUxOTM0MDRaFw0xODEyMTUxOTM0MDRaMEYxGDAWBgNV
16
- BAMMD3Ryb3kucmVhZHlfZ2VtczEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYK
17
- CZImiZPyLGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
18
- ywror+ArPIPXWa9P0fGvNL73zPDiu1/EjZHQDXtakFkETZNGpf6TR4yynXqJdUvl
19
- LQ5NzjvvZkJK7YBsMTX4VnWjelI5boJ2xrtEiDKqMNHonWT6C8rvjIHHYNjYjSQi
20
- nNonKQlnK5h7FPoCRTiIwmogqx0XPeTjSScIZsnMpv/e4xw3WxB2Hu/Yoqe/Mcrk
21
- XQ6xvksQPaFQZXT/HVvtW15AKv800kUR3/SUJcRNVx+Od6KgX36YL0KHXYXZA4EY
22
- QkQEnjoREcWL0ciLzWGUqKyxR1kuGcbchqOni1BbJlhAZTo2mMDF7ZR1rfQf8Jyg
23
- NGpT/Xf1y62KjAnQ1vqMQQIDAQABo4GGMIGDMAkGA1UdEwQCMAAwCwYDVR0PBAQD
24
- AgSwMB0GA1UdDgQWBBR3lIzPlCK2hz6B2pyVSNqp8wlVujAkBgNVHREEHTAbgRl0
25
- cm95LnJlYWR5K2dlbXNAZ21haWwuY29tMCQGA1UdEgQdMBuBGXRyb3kucmVhZHkr
26
- Z2Vtc0BnbWFpbC5jb20wDQYJKoZIhvcNAQEFBQADggEBAAOP9/8njs7dzLMhCnqy
27
- eCYmGsQEiRd/2jla1Hn1PZrc5IKvJR6syZFeMKWwL7qT9KOfx8ln2xzIN30miOPu
28
- MtnmQ5uZoGCNap9jrfrqhgAvnDwT53R7sWZ2PiIysT910aoIKsUb/4tgGQtmYd8p
29
- YTPA+oIqTPacW7S6bEuSiF+S49R6KPlXcdnTwMVj+zHD81BtH+tmaKNq002zHjmh
30
- O3wvp+/AxNyLkXeKmeHOVBVgt8o/y4AY7IJDB2qCqoZ/ueyXCoDaeCyWhj8TrVnw
31
- 3bGxRLYSqDA00eoErnfFHDhB/9MxG009am2GmRStJEwLbWbXnB6xXq7CZAtEE2pH
32
- 0iY=
13
+ MIIEVjCCAr6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAqMSgwJgYDVQQDDB90cm95
14
+ LnJlYWR5X2dlbXMvREM9Z21haWwvREM9Y29tMB4XDTE5MDMwNTE3NDE1MFoXDTIw
15
+ MDMwNDE3NDE1MFowKjEoMCYGA1UEAwwfdHJveS5yZWFkeV9nZW1zL0RDPWdtYWls
16
+ L0RDPWNvbTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMDsoIc24Hja
17
+ /aYTEUDiLTcTyg0Ovgp24ZQ8ivjX+QkNM09OuKt6oxvIZXRfsIMPnJagMtk3VlkZ
18
+ OBZn6SPS5qWGnBq6Zimo/vexnC0W1m9JXuK+jIDFZeEkBPDrSJnlLazNyYUlIsQi
19
+ p3+C/GfjHH+rqKnS+pmf0W6ut/Gz1nWOMXKfkuLsvBogzDVSjW3aSm6awkWoRrl1
20
+ dDAUmiEtZNhrZJ8BKJrsPHT6fA9jUElgV+HEoEZJrvgsSl39IcJLr/+U2u2NJ2YD
21
+ 3FVQ98jaGKv8YIIOrUtR1I/NBfPkz1G9/KoiVy77YicE2YGi/68Ag5ZvXS5xLTjn
22
+ vQLRYcOCgdVOyH+zSeddxrSSR3sXEGGfZdTQ0MU/jb1N8q8OMERZarZQyf6+44cA
23
+ rhYDTmZGm6vm8fGczx7SIi5D96qFhSG/m6K89Fo4zjAXXXVVnQSnplaJPo2r9gGQ
24
+ jFGejCQIJyn9AQFjuzk4h3wqHsKN/vYaxYc+jBvFbjM8yxbgTvoaxQIDAQABo4GG
25
+ MIGDMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBRPYJEge5sGgd+a
26
+ Bu0l6hdHdj8eTzAkBgNVHREEHTAbgRl0cm95LnJlYWR5K2dlbXNAZ21haWwuY29t
27
+ MCQGA1UdEgQdMBuBGXRyb3kucmVhZHkrZ2Vtc0BnbWFpbC5jb20wDQYJKoZIhvcN
28
+ AQELBQADggGBAC8Fq7zuVn0wG8V+vdG6gQNm0o5PuKbESe760PkibcLjW0qk2CFJ
29
+ ZYEM9Vrg1+gOE/6a5NNGZCsGE3pDBySa3bmOe7Ypnfi/Wrd3Q+hmLNBYXc+xCP+n
30
+ pT1luYFUFov85LbXdkWe5Iy/judl9K3wID9263e6ulFrPr4KWx2Uo24OUbKODwIJ
31
+ /ys403OZyWmT1i0lPzNW7Lf1OkBJ/VSsAm0PSOM/C3z5XSy4EeRMwdQYwZa/sJ5f
32
+ MLBGpJSyK1gBT7bRKt65lGSIhRmbbsWxDd1nXC+3avdaMGzmNbQk6q8zWPmUaTS7
33
+ rDgdv7cWXNeXAVdgYOEkhL4fVtb5ZsEZMs4nXWGdl28vMWUFc1sMwnrdTdDxp4vd
34
+ nnizKdqZryaUdg4zjv8KAmkGasjr+GCxOOuR7d3tcLaIFsn+258DBSX1gioEfEkQ
35
+ oqY6PqijLtfNghfuRilqSeV6NX7HkdYaSQSI6Yfrt4ly6705dUAK6XPEnZFW6Wd1
36
+ hHL4/sAb8WavLw==
33
37
  -----END CERTIFICATE-----
34
- date: 2018-05-24 00:00:00.000000000 Z
38
+ date: 2019-03-05 00:00:00.000000000 Z
35
39
  dependencies:
36
40
  - !ruby/object:Gem::Dependency
37
41
  name: aws-sdk-sns
@@ -130,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
134
  version: '0'
131
135
  requirements: []
132
136
  rubyforge_project:
133
- rubygems_version: 2.6.14
137
+ rubygems_version: 2.7.6
134
138
  signing_key:
135
139
  specification_version: 4
136
140
  summary: Sensu transport over Amazon SNS & SQS
metadata.gz.sig CHANGED
Binary file