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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/sensu/transport/snssqs.rb +206 -67
- metadata +27 -23
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 37c15a1d42a378b0f35b29ede4c9884787d591e11be8c52f7f790d77c11b1f64
|
4
|
+
data.tar.gz: a405e3cd49768d82ae291545edaa98d9f1edcf8fab3f3e7fcf04c2511e5769b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7339f3c05fab0a9ba77580bbaa63bb93997251bab8494c7decc3e47ed69ee45e4b569a5a484c018bab4a7c678d366573d3a11d835ba7dc2f6e671d69e02cc745
|
7
|
+
data.tar.gz: 39e257529c1eddc20b66e5e229b95dec85d0724edac051ff59f3e8c0859ffe033f14436e8319116b6ee57d23fa9c2e33c84f4df456f5e337182d8a847c4bd0fa
|
checksums.yaml.gz.sig
CHANGED
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 =
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
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?
|
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
|
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
|
-
|
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,
|
106
|
+
def subscribe(type, pipe, funnel = nil, _options = {}, &callback)
|
94
107
|
if type == :fanout
|
95
|
-
|
108
|
+
logger.debug("skipping unsupported fanout subscription type=#{type}, pipe=#{pipe}, funnel=#{funnel}")
|
96
109
|
return
|
97
110
|
end
|
98
111
|
|
99
|
-
|
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
|
-
|
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
|
-
{ :
|
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(:
|
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
|
-
|
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
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
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:
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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:
|
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
|
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
|