logstash-input-sqs 1.0.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08fba64b2923f5a1ae87c399907d524df37b46de
4
- data.tar.gz: 793f5d98eb640d2a03d30505951090965731ca84
3
+ metadata.gz: 2a6fdc994c8c6ebd9175705b27655d59b05077bf
4
+ data.tar.gz: 27f71b1d9c8c5b3fb3e5f0ff88e89d612dbf68a5
5
5
  SHA512:
6
- metadata.gz: 8cce064c2c706433cb508415402a9f282cad3602b2bf2d8282fd6837093f3686f26bd16e420fe3dff11174fedd2da4a95f592b37c26eef330404c9a7645c9fe3
7
- data.tar.gz: 6e4f0ed8a0815a2fbc3f7870a9fff19018730d93b67dbc975ece14e49c9af41570fb50870be39e3ad703619bb520b7f2f0fa3323040a975d2296cb9085d7a4d8
6
+ metadata.gz: 144dc569bcb78514c165eb2cc4089e2f90069b778537ad6dc501edd03a537f46fda0b9074ca24b01bf2c348b0687f4fb05c4943a6c8cd3edc87b55ba484a44ff
7
+ data.tar.gz: 5dab8585276679b08119fd525a02b38a428060cce3d02068a6663facf0c5c065f885c99ded701de7c92503819e30c28c6fae12c031c008c070d0455db703c6c3
data/CHANGELOG.md CHANGED
@@ -0,0 +1,7 @@
1
+ # 1.1.0
2
+ - AWS ruby SDK v2 upgrade
3
+ - Replaces aws-sdk dependencies with mixin-aws
4
+ - Removes unnecessary de-allocation
5
+ - Move the code into smaller methods to allow easier mocking and testing
6
+ - Add the option to configure polling frequency
7
+ - Adding a monkey patch to make sure `LogStash::ShutdownSignal` doesn't get catch by AWS RetryError.
@@ -1,9 +1,10 @@
1
1
  # encoding: utf-8
2
+ #
2
3
  require "logstash/inputs/threadable"
3
4
  require "logstash/namespace"
4
5
  require "logstash/timestamp"
5
6
  require "logstash/plugin_mixins/aws_config"
6
- require "digest/sha2"
7
+ require "logstash/errors"
7
8
 
8
9
  # Pull events from an Amazon Web Services Simple Queue Service (SQS) queue.
9
10
  #
@@ -58,7 +59,15 @@ require "digest/sha2"
58
59
  # See http://aws.amazon.com/iam/ for more details on setting up AWS identities.
59
60
  #
60
61
  class LogStash::Inputs::SQS < LogStash::Inputs::Threadable
61
- include LogStash::PluginMixins::AwsConfig
62
+ include LogStash::PluginMixins::AwsConfig::V2
63
+
64
+ MAX_TIME_BEFORE_GIVING_UP = 60
65
+ MAX_MESSAGES_TO_FETCH = 10 # Between 1-10 in the AWS-SDK doc
66
+ SENT_TIMESTAMP = "SentTimestamp"
67
+ SQS_ATTRIBUTES = [SENT_TIMESTAMP]
68
+ BACKOFF_SLEEP_TIME = 1
69
+ BACKOFF_FACTOR = 2
70
+ DEFAULT_POLLING_FREQUENCY = 20
62
71
 
63
72
  config_name "sqs"
64
73
 
@@ -73,104 +82,114 @@ class LogStash::Inputs::SQS < LogStash::Inputs::Threadable
73
82
  # Name of the event field in which to store the SQS message MD5 checksum
74
83
  config :md5_field, :validate => :string
75
84
 
76
- # Name of the event field in which to store the SQS message Sent Timestamp
85
+ # Name of the event field in which to store the SQS message Sent Timestamp
77
86
  config :sent_timestamp_field, :validate => :string
78
87
 
79
- public
80
- def aws_service_endpoint(region)
81
- return {
82
- :sqs_endpoint => "sqs.#{region}.amazonaws.com"
83
- }
84
- end
88
+ # Polling frequency, default is 20 seconds
89
+ config :polling_frequency, :validate => :number, :default => DEFAULT_POLLING_FREQUENCY
90
+
91
+ attr_reader :poller
85
92
 
86
- public
87
93
  def register
88
- @logger.info("Registering SQS input", :queue => @queue)
89
94
  require "aws-sdk"
95
+ @logger.info("Registering SQS input", :queue => @queue)
90
96
 
91
- @sqs = AWS::SQS.new(aws_options_hash)
97
+ monkey_patch_aws_retryable_plugin!
98
+ setup_queue
99
+ end
92
100
 
93
- begin
94
- @logger.debug("Connecting to AWS SQS queue", :queue => @queue)
95
- @sqs_queue = @sqs.queues.named(@queue)
96
- @logger.info("Connected to AWS SQS queue successfully.", :queue => @queue)
97
- rescue Exception => e
98
- @logger.error("Unable to access SQS queue.", :error => e.to_s, :queue => @queue)
99
- throw e
100
- end # begin/rescue
101
- end # def register
102
-
103
- public
104
- def run(output_queue)
105
- @logger.debug("Polling SQS queue", :queue => @queue)
101
+ def setup_queue
102
+ aws_sqs_client = Aws::SQS::Client.new(aws_options_hash)
103
+ queue_url = aws_sqs_client.get_queue_url(:queue_name => @queue)[:queue_url]
104
+ @poller = Aws::SQS::QueuePoller.new(queue_url, :client => aws_sqs_client)
105
+ rescue Aws::SQS::Errors::ServiceError => e
106
+ @logger.error("Cannot establish connection to Amazon SQS", :error => e)
107
+ raise LogStash::ConfigurationError, "Verify the SQS queue name and your credentials"
108
+ end
106
109
 
107
- receive_opts = {
108
- :limit => 10,
109
- :visibility_timeout => 30,
110
- :attributes => [:sent_at]
110
+ def polling_options
111
+ {
112
+ :max_number_of_messages => MAX_MESSAGES_TO_FETCH,
113
+ :attribute_names => SQS_ATTRIBUTES,
114
+ :wait_time_seconds => @polling_frequency
111
115
  }
116
+ end
112
117
 
113
- continue_polling = true
114
- while running? && continue_polling
115
- continue_polling = run_with_backoff(60, 1) do
116
- @sqs_queue.receive_message(receive_opts) do |message|
117
- if message
118
- @codec.decode(message.body) do |event|
119
- decorate(event)
120
- if @id_field
121
- event[@id_field] = message.id
122
- end
123
- if @md5_field
124
- event[@md5_field] = message.md5
125
- end
126
- if @sent_timestamp_field
127
- event[@sent_timestamp_field] = LogStash::Timestamp.new(message.sent_timestamp).utc
128
- end
129
- @logger.debug? && @logger.debug("Processed SQS message", :message_id => message.id, :message_md5 => message.md5, :sent_timestamp => message.sent_timestamp, :queue => @queue)
130
- output_queue << event
131
- message.delete
132
- end # codec.decode
133
- end # valid SQS message
134
- end # receive_message
135
- end # run_with_backoff
136
- end # polling loop
137
- end # def run
138
-
139
- def teardown
140
- @sqs_queue = nil
141
- finished
142
- end # def teardown
118
+ def decode_event(message)
119
+ @codec.decode(message.body) do |event|
120
+ return event
121
+ end
122
+ end
123
+
124
+ def add_sqs_data(event, message)
125
+ event[@id_field] = message.message_id if @id_field
126
+ event[@md5_field] = message.md5_of_body if @md5_field
127
+ event[@sent_timestamp_field] = convert_epoch_to_timestamp(message.attributes[SENT_TIMESTAMP]) if @sent_timestamp_field
128
+
129
+ return event
130
+ end
131
+
132
+ def handle_message(message)
133
+ event = decode_event(message)
134
+ add_sqs_data(event, message)
135
+ decorate(event)
136
+ return event
137
+ end
138
+
139
+ def run(output_queue)
140
+ @logger.debug("Polling SQS queue", :polling_options => polling_options)
141
+
142
+ run_with_backoff do
143
+ poller.poll(polling_options) do |messages, stats|
144
+ messages.each do |message|
145
+ output_queue << handle_message(message)
146
+ end
147
+
148
+ @logger.debug("SQS Stats:", :request_count => stats.request_count,
149
+ :messages_count => stats.message_count,
150
+ :last_message_received_at => stats.last_message_received_at) if @logger.debug?
151
+ end
152
+ end
153
+ end
143
154
 
144
155
  private
145
156
  # Runs an AWS request inside a Ruby block with an exponential backoff in case
146
- # we exceed the allowed AWS RequestLimit.
157
+ # we experience a ServiceError.
147
158
  #
148
159
  # @param [Integer] max_time maximum amount of time to sleep before giving up.
149
160
  # @param [Integer] sleep_time the initial amount of time to sleep before retrying.
150
161
  # @param [Block] block Ruby code block to execute.
151
- def run_with_backoff(max_time, sleep_time, &block)
152
- if sleep_time > max_time
153
- @logger.error("AWS::EC2::Errors::RequestLimitExceeded ... failed.", :queue => @queue)
154
- return false
155
- end # retry limit exceeded
162
+ def run_with_backoff(max_time = MAX_TIME_BEFORE_GIVING_UP, sleep_time = BACKOFF_SLEEP_TIME, &block)
163
+ next_sleep = sleep_time
156
164
 
157
165
  begin
158
166
  block.call
159
- rescue AWS::EC2::Errors::RequestLimitExceeded
160
- @logger.info("AWS::EC2::Errors::RequestLimitExceeded ... retrying SQS request", :queue => @queue, :sleep_time => sleep_time)
161
- sleep sleep_time
162
- run_with_backoff(max_time, sleep_time * 2, &block)
163
- rescue AWS::EC2::Errors::InstanceLimitExceeded
164
- @logger.warn("AWS::EC2::Errors::InstanceLimitExceeded ... aborting SQS message retreival.")
165
- return false
166
- rescue AWS::SQS::Errors::InternalError
167
- @logger.info("AWS::SQS::Errors::AWS Internal Error ... retrying SQS request with exponential backoff", :queue => @queue, :sleep_time => sleep_time)
168
- sleep sleep_time
169
- run_with_backoff(max_time, sleep_time * 2, &block)
170
- rescue Exception => bang
171
- @logger.error("Error reading SQS queue.", :error => bang, :queue => @queue)
172
- return false
173
- end # begin/rescue
174
- return true
175
- end # def run_with_backoff
167
+ next_sleep = sleep_time
168
+ rescue Aws::SQS::Errors::ServiceError => e
169
+ @logger.warn("Aws::SQS::Errors::ServiceError ... retrying SQS request with exponential backoff", :queue => @queue, :sleep_time => sleep_time, :error => e)
170
+ sleep(next_sleep)
171
+ next_sleep = next_sleep > max_time ? sleep_time : sleep_time * BACKOFF_FACTOR
172
+
173
+ retry
174
+ rescue LogStash::ShutdownSignal
175
+ # The pipeline is currently shutting down.
176
+ # we can safely rescue and return, all unacked sqs messages will be resend
177
+ # when the pipeline is up again.
178
+ end
179
+ end
180
+
181
+ def convert_epoch_to_timestamp(time)
182
+ LogStash::Timestamp.at(time.to_i / 1000)
183
+ end
184
+
185
+ def monkey_patch_aws_retryable_plugin!
186
+ Aws::Plugins::RetryErrors::ErrorInspector.module_eval do
187
+ def networking?
188
+ !@error.is_a?(LogStash::ShutdownSignal) &&
189
+ (@error.is_a?(Seahorse::Client::NetworkingError) ||
190
+ Aws::Plugins::RetryErrors::ErrorInspector::NETWORKING_ERRORS.include?(@name) ||
191
+ @http_status_code == 0)
192
+ end
193
+ end
194
+ end
176
195
  end # class LogStash::Inputs::SQS
@@ -1,7 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
-
3
2
  s.name = 'logstash-input-sqs'
4
- s.version = '1.0.0'
3
+ s.version = '1.1.0'
5
4
  s.licenses = ['Apache License (2.0)']
6
5
  s.summary = "Pull events from an Amazon Web Services Simple Queue Service (SQS) queue."
7
6
  s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
@@ -23,7 +22,7 @@ Gem::Specification.new do |s|
23
22
  s.add_runtime_dependency "logstash-core", '>= 1.4.0', '< 2.0.0'
24
23
 
25
24
  s.add_runtime_dependency 'logstash-codec-json'
26
- s.add_runtime_dependency 'aws-sdk'
25
+ s.add_runtime_dependency "logstash-mixin-aws", ">= 1.0.0"
27
26
 
28
27
  s.add_development_dependency 'logstash-devutils'
29
28
  end
@@ -1 +1,170 @@
1
- require "logstash/devutils/rspec/spec_helper"
1
+ # encoding: utf-8
2
+ require "logstash/inputs/sqs"
3
+ require "logstash/errors"
4
+ require "logstash/event"
5
+ require "logstash/json"
6
+ require "aws-sdk"
7
+ require "spec_helper"
8
+
9
+ describe LogStash::Inputs::SQS do
10
+ let(:queue_name) { "the-infinite-pandora-box" }
11
+ let(:queue_url) { "https://sqs.test.local/#{queue}" }
12
+ let(:options) do
13
+ {
14
+ "region" => "us-east-1",
15
+ "access_key_id" => "123",
16
+ "secret_access_key" => "secret",
17
+ "queue" => queue_name
18
+ }
19
+ end
20
+
21
+ let(:input) { LogStash::Inputs::SQS.new(options) }
22
+
23
+ let(:decoded_message) { { "bonjour" => "awesome" } }
24
+ let(:encoded_message) { double("sqs_message", :body => LogStash::Json::dump(decoded_message)) }
25
+
26
+ subject { input }
27
+
28
+ let(:mock_sqs) { Aws::SQS::Client.new({ :stub_responses => true }) }
29
+
30
+ context "with invalid credentials" do
31
+ before do
32
+ expect(Aws::SQS::Client).to receive(:new).and_return(mock_sqs)
33
+ expect(mock_sqs).to receive(:get_queue_url).with({ :queue_name => queue_name }) { raise Aws::SQS::Errors::ServiceError.new("bad-something", "bad token") }
34
+ end
35
+
36
+ it "raises a Configuration error if the credentials are bad" do
37
+ expect { subject.register }.to raise_error(LogStash::ConfigurationError)
38
+ end
39
+ end
40
+
41
+ context "valid credentials" do
42
+ let(:queue) { [] }
43
+
44
+ it "doesn't raise an error with valid credentials" do
45
+ expect(Aws::SQS::Client).to receive(:new).and_return(mock_sqs)
46
+ expect(mock_sqs).to receive(:get_queue_url).with({ :queue_name => queue_name }).and_return({:queue_url => queue_url })
47
+ expect { subject.register }.not_to raise_error
48
+ end
49
+
50
+ context "enrich event" do
51
+ let(:event) { LogStash::Event.new }
52
+
53
+ let(:message_id) { "123" }
54
+ let(:md5_of_body) { "dr strange" }
55
+ let(:sent_timestamp) { LogStash::Timestamp.new }
56
+ let(:epoch_timestamp) { (sent_timestamp.utc.to_f * 1000).to_i }
57
+
58
+ let(:id_field) { "my_id_field" }
59
+ let(:md5_field) { "my_md5_field" }
60
+ let(:sent_timestamp_field) { "my_sent_timestamp_field" }
61
+
62
+ let(:message) do
63
+ double("message", :message_id => message_id, :md5_of_body => md5_of_body, :attributes => { LogStash::Inputs::SQS::SENT_TIMESTAMP => epoch_timestamp } )
64
+ end
65
+
66
+ subject { input.add_sqs_data(event, message) }
67
+
68
+ context "when the option is specified" do
69
+ let(:options) do
70
+ {
71
+ "region" => "us-east-1",
72
+ "access_key_id" => "123",
73
+ "secret_access_key" => "secret",
74
+ "queue" => queue_name,
75
+ "id_field" => id_field,
76
+ "md5_field" => md5_field,
77
+ "sent_timestamp_field" => sent_timestamp_field
78
+ }
79
+ end
80
+
81
+ it "add the `message_id`" do
82
+ expect(subject[id_field]).to eq(message_id)
83
+ end
84
+
85
+ it "add the `md5_of_body`" do
86
+ expect(subject[md5_field]).to eq(md5_of_body)
87
+ end
88
+
89
+ it "add the `sent_timestamp`" do
90
+ expect(subject[sent_timestamp_field].to_i).to eq(sent_timestamp.to_i)
91
+ end
92
+ end
93
+
94
+ context "when the option isn't specified" do
95
+ it "doesnt add the `message_id`" do
96
+ expect(subject).not_to include(id_field)
97
+ end
98
+
99
+ it "doesnt add the `md5_of_body`" do
100
+ expect(subject).not_to include(md5_field)
101
+ end
102
+
103
+ it "doesnt add the `sent_timestamp`" do
104
+ expect(subject).not_to include(sent_timestamp_field)
105
+ end
106
+ end
107
+ end
108
+
109
+ context "when decoding body" do
110
+ subject { LogStash::Inputs::SQS::new(options.merge({ "codec" => "json" })) }
111
+
112
+ it "uses the specified codec" do
113
+ expect(subject.decode_event(encoded_message)["bonjour"]).to eq(decoded_message["bonjour"])
114
+ end
115
+ end
116
+
117
+ context "receiving messages" do
118
+ before do
119
+ expect(subject).to receive(:poller).and_return(mock_sqs).at_least(:once)
120
+ end
121
+
122
+ it "creates logstash event" do
123
+ expect(mock_sqs).to receive(:poll).with(anything()).and_yield([encoded_message], double("stats"))
124
+ subject.run(queue)
125
+ expect(queue.pop["bonjour"]).to eq(decoded_message["bonjour"])
126
+ end
127
+ end
128
+
129
+ context "on errors" do
130
+ let(:payload) { "Hello world" }
131
+
132
+ before do
133
+ expect(subject).to receive(:poller).and_return(mock_sqs).at_least(:once)
134
+ end
135
+
136
+ context "SQS errors" do
137
+ it "retry to fetch messages" do
138
+ # change the poller implementation to raise SQS errors.
139
+ had_error = false
140
+
141
+ # actually using the child of `Object` to do an expectation of `#sleep`
142
+ expect(subject).to receive(:sleep).with(LogStash::Inputs::SQS::BACKOFF_SLEEP_TIME)
143
+ expect(mock_sqs).to receive(:poll).with(anything()).at_most(2) do
144
+ unless had_error
145
+ had_error = true
146
+ raise Aws::SQS::Errors::ServiceError.new("testing", "testing exception")
147
+ end
148
+
149
+ queue << payload
150
+ end
151
+
152
+ subject.run(queue)
153
+
154
+ expect(queue.size).to eq(1)
155
+ expect(queue.pop).to eq(payload)
156
+ end
157
+ end
158
+
159
+ context "other errors" do
160
+ it "stops executing the code and raise the exception" do
161
+ expect(mock_sqs).to receive(:poll).with(anything()).at_most(2) do
162
+ raise RuntimeError
163
+ end
164
+
165
+ expect { subject.run(queue) }.to raise_error(RuntimeError)
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,111 @@
1
+ # encoding: utf-8
2
+ require "logstash/inputs/sqs"
3
+ require "logstash/event"
4
+ require "logstash/json"
5
+ require "aws-sdk"
6
+ require "spec_helper"
7
+ require_relative "../support/helpers"
8
+ require "thread"
9
+
10
+ Thread.abort_on_exception = true
11
+
12
+ describe "LogStash::Inputs::SQS integration", :integration => true do
13
+ let(:decoded_message) { { "drstrange" => "is-he-really-that-strange" } }
14
+ let(:encoded_message) { LogStash::Json.dump(decoded_message) }
15
+ let(:queue) { Queue.new }
16
+
17
+ let(:input) { LogStash::Inputs::SQS.new(options) }
18
+
19
+ context "with invalid credentials" do
20
+ let(:options) do
21
+ {
22
+ "queue" => "do-not-exist",
23
+ "access_key_id" => "bad_access",
24
+ "secret_access_key" => "bad_secret_key",
25
+ "region" => ENV["AWS_REGION"]
26
+ }
27
+ end
28
+
29
+ subject { input }
30
+
31
+ it "raises a Configuration error if the credentials are bad" do
32
+ expect { subject.register }.to raise_error(LogStash::ConfigurationError)
33
+ end
34
+ end
35
+
36
+ context "with valid credentials" do
37
+ let(:options) do
38
+ {
39
+ "queue" => ENV["SQS_QUEUE_NAME"],
40
+ "access_key_id" => ENV['AWS_ACCESS_KEY_ID'],
41
+ "secret_access_key" => ENV['AWS_SECRET_ACCESS_KEY'],
42
+ "region" => ENV["AWS_REGION"]
43
+ }
44
+ end
45
+
46
+ before :each do
47
+ push_sqs_event(encoded_message)
48
+ input.register
49
+ @server = Thread.new { input.run(queue) }
50
+ end
51
+
52
+ after do
53
+ @server.kill
54
+ end
55
+
56
+ subject { queue.pop }
57
+
58
+ it "creates logstash events" do
59
+ expect(subject["drstrange"]).to eq(decoded_message["drstrange"])
60
+ end
61
+
62
+ context "when the optionals fields are not specified" do
63
+ let(:id_field) { "my_id_field" }
64
+ let(:md5_field) { "my_md5_field" }
65
+ let(:sent_timestamp_field) { "my_sent_timestamp_field" }
66
+
67
+ it "add the `message_id`" do
68
+ expect(subject[id_field]).to be_nil
69
+ end
70
+
71
+ it "add the `md5_of_body`" do
72
+ expect(subject[md5_field]).to be_nil
73
+ end
74
+
75
+ it "add the `sent_timestamp`" do
76
+ expect(subject[sent_timestamp_field]).to be_nil
77
+ end
78
+
79
+ end
80
+
81
+ context "when the optionals fields are specified" do
82
+ let(:id_field) { "my_id_field" }
83
+ let(:md5_field) { "my_md5_field" }
84
+ let(:sent_timestamp_field) { "my_sent_timestamp_field" }
85
+
86
+ let(:options) do
87
+ {
88
+ "queue" => ENV["SQS_QUEUE_NAME"],
89
+ "access_key_id" => ENV['AWS_ACCESS_KEY_ID'],
90
+ "secret_access_key" => ENV['AWS_SECRET_ACCESS_KEY'],
91
+ "region" => ENV["AWS_REGION"],
92
+ "id_field" => id_field,
93
+ "md5_field" => md5_field,
94
+ "sent_timestamp_field" => sent_timestamp_field
95
+ }
96
+ end
97
+
98
+ it "add the `message_id`" do
99
+ expect(subject[id_field]).not_to be_nil
100
+ end
101
+
102
+ it "add the `md5_of_body`" do
103
+ expect(subject[md5_field]).not_to be_nil
104
+ end
105
+
106
+ it "add the `sent_timestamp`" do
107
+ expect(subject[sent_timestamp_field]).not_to be_nil
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+ def push_sqs_event(message)
3
+ client = Aws::SQS::Client.new
4
+ queue_url = client.get_queue_url(:queue_name => ENV["SQS_QUEUE_NAME"])
5
+
6
+ client.send_message({
7
+ queue_url: queue_url.queue_url,
8
+ message_body: message,
9
+ })
10
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-sqs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-24 00:00:00.000000000 Z
11
+ date: 2015-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash-core
@@ -45,17 +45,17 @@ dependencies:
45
45
  prerelease: false
46
46
  type: :runtime
47
47
  - !ruby/object:Gem::Dependency
48
- name: aws-sdk
48
+ name: logstash-mixin-aws
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '>='
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: 1.0.0
54
54
  requirement: !ruby/object:Gem::Requirement
55
55
  requirements:
56
56
  - - '>='
57
57
  - !ruby/object:Gem::Version
58
- version: '0'
58
+ version: 1.0.0
59
59
  prerelease: false
60
60
  type: :runtime
61
61
  - !ruby/object:Gem::Dependency
@@ -89,6 +89,9 @@ files:
89
89
  - lib/logstash/inputs/sqs.rb
90
90
  - logstash-input-sqs.gemspec
91
91
  - spec/inputs/sqs_spec.rb
92
+ - spec/integration/sqs_spec.rb
93
+ - spec/spec_helper.rb
94
+ - spec/support/helpers.rb
92
95
  homepage: http://www.elastic.co/guide/en/logstash/current/index.html
93
96
  licenses:
94
97
  - Apache License (2.0)
@@ -111,9 +114,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
114
  version: '0'
112
115
  requirements: []
113
116
  rubyforge_project:
114
- rubygems_version: 2.2.2
117
+ rubygems_version: 2.1.9
115
118
  signing_key:
116
119
  specification_version: 4
117
120
  summary: Pull events from an Amazon Web Services Simple Queue Service (SQS) queue.
118
121
  test_files:
119
122
  - spec/inputs/sqs_spec.rb
123
+ - spec/integration/sqs_spec.rb
124
+ - spec/spec_helper.rb
125
+ - spec/support/helpers.rb