logstash-input-s3-sns-sqs 2.1.1 → 2.1.2

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
  SHA256:
3
- metadata.gz: 4f090986d9b42c172402ba4b1b31c60d0ddbce1d76f160cf6ad9fcb02bbcccb9
4
- data.tar.gz: a281caf8e678835b008e927ac7ca81f3edab6448f1932c8fec2116623e263e8b
3
+ metadata.gz: 805cb772fda649de4273d9c86799255bc31b7f18b847983c1a1bacfee2eb0224
4
+ data.tar.gz: ef65ac96355cb246b493836323e7998e485ddf30ceb5df780d17b1f6d080451b
5
5
  SHA512:
6
- metadata.gz: 993b13ece9f6fc0ac31231ea028780a4108e621c3f9e9efd905fb51f54f8aa0760b736138557fc02307ec9feeb78efdade413e9226704e8a876d397acc8f9916
7
- data.tar.gz: 6d221eb99ace6783e81e89543c84be4693d2de5a8591103ac8b4c5eeb449add26144f54ea77d1798926a9959e1fbfadac58b8170f035edac95d31b525ecf10c4
6
+ metadata.gz: 338e687d52f65a484ca75c091cf003f263e8e80f00b545f3f6b36b7a3fc584ea29807233436c75a3189fdf075d7386aa1415f34a1996349b2a41f4b274cb6f75
7
+ data.tar.gz: abc6194b248640de99f8ed6f41304fff760b1667a08426dea2ee98d773f19d9b01010438c633452fc60e8c23b31c201b3000deab07e4cf4da630a7f4770cd0d1
@@ -1,3 +1,8 @@
1
+ ##2.1.2
2
+ - FEATURE: Now it´s possible to use queue urls and names.
3
+ - FEATURE: Add sqs long polling config parameter: sqs_wait_time_seconds
4
+ - FIX: Valid UTF-8 byte sequences in logs are munged
5
+ - CLEANUP: Remove tests. (as a begin for clean testing)
1
6
  ##2.1.1
2
7
  - FEATURE: Enable Multiregion Support for included S3 client.
3
8
  - Add region by bucket feature
@@ -52,7 +52,7 @@ class S3ClientFactory
52
52
  )
53
53
  elsif credentials.key?('access_key_id') && credentials.key?('secret_access_key')
54
54
  @logger.debug("Fetch credentials", :access_key => credentials['access_key_id'])
55
- return Aws::Credentials.new(credentials)
55
+ return Aws::Credentials.new(credentials['access_key_id'], credentials['secret_access_key'])
56
56
  end
57
57
  end
58
58
 
@@ -173,6 +173,7 @@ class LogStash::Inputs::S3SNSSQS < LogStash::Inputs::Threadable
173
173
  # Whether the event is processed though an SNS to SQS. (S3>SNS>SQS = true |S3>SQS=false)
174
174
  config :from_sns, :validate => :boolean, :default => true
175
175
  config :sqs_skip_delete, :validate => :boolean, :default => false
176
+ config :sqs_wait_time_seconds, :validate => :number, :required => false
176
177
  config :sqs_delete_on_failure, :validate => :boolean, :default => true
177
178
 
178
179
  config :visibility_timeout, :validate => :number, :default => 120
@@ -251,7 +252,8 @@ class LogStash::Inputs::S3SNSSQS < LogStash::Inputs::Threadable
251
252
  @sqs_poller = SqsPoller.new(@logger, @received_stop,
252
253
  {
253
254
  visibility_timeout: @visibility_timeout,
254
- skip_delete: @sqs_skip_delete
255
+ skip_delete: @sqs_skip_delete,
256
+ wait_time_seconds: @sqs_wait_time_seconds
255
257
  },
256
258
  {
257
259
  sqs_queue: @queue,
@@ -26,17 +26,18 @@ module LogProcessor
26
26
  @logger.warn("[#{Thread.current[:name]}] Abort reading in the middle of the file, we will read it again when logstash is started")
27
27
  throw :skip_delete
28
28
  end
29
- line = line.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: "\u2370")
30
- # Potentially dangerous! See https://medium.com/@adamhooper/in-ruby-dont-use-timeout-77d9d4e5a001
31
- # Decoding a line must not last longer than a few seconds. Otherwise, the file is probably corrupt.
32
- codec.decode(line) do |event|
33
- event_count += 1
34
- decorate_event(event, metadata, type, record[:key], record[:bucket], record[:s3_data])
35
- #event_time = Time.now #PROFILING
36
- #event.set("[@metadata][progress][begin]", start_time)
37
- #event.set("[@metadata][progress][index_time]", event_time)
38
- #event.set("[@metadata][progress][line]", line_count)
39
- logstash_event_queue << event
29
+ begin
30
+ codec.decode(line) do |event|
31
+ event_count += 1
32
+ decorate_event(event, metadata, type, record[:key], record[:bucket], record[:s3_data])
33
+ #event_time = Time.now #PROFILING
34
+ #event.set("[@metadata][progress][begin]", start_time)
35
+ #event.set("[@metadata][progress][index_time]", event_time)
36
+ #event.set("[@metadata][progress][line]", line_count)
37
+ logstash_event_queue << event
38
+ end
39
+ rescue Exception => e
40
+ @logger.error("[#{Thread.current[:name]}] Unable to decode line", :line => line, :error => e)
40
41
  end
41
42
  end
42
43
  file_t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC) #PROFILING
@@ -46,13 +46,19 @@ class SqsPoller
46
46
  begin
47
47
  @logger.info("Registering SQS input", :queue => @queue)
48
48
  sqs_client = Aws::SQS::Client.new(aws_options_hash)
49
- queue_url = sqs_client.get_queue_url({
50
- queue_name: @queue,
51
- queue_owner_aws_account_id: client_options[:queue_owner_aws_account_id]
52
- }).queue_url # is a method according to docs. Was [:queue_url].
49
+ if uri?(@queue)
50
+ queue_url = @queue
51
+ else
52
+ queue_url = sqs_client.get_queue_url({
53
+ queue_name: @queue,
54
+ queue_owner_aws_account_id: client_options[:queue_owner_aws_account_id]
55
+ }).queue_url
56
+ end
57
+
53
58
  @poller = Aws::SQS::QueuePoller.new(queue_url,
54
59
  :client => sqs_client
55
60
  )
61
+ @logger.info("[#{Thread.current[:name]}] connected to queue.", :queue_url => queue_url)
56
62
  rescue Aws::SQS::Errors::ServiceError => e
57
63
  @logger.error("Cannot establish connection to Amazon SQS", :error => e)
58
64
  raise LogStash::ConfigurationError, "Verify the SQS queue name and your credentials"
@@ -185,6 +191,16 @@ class SqsPoller
185
191
  end
186
192
  end
187
193
 
194
+ def uri?(string)
195
+ uri = URI.parse(string)
196
+ %w( http https ).include?(uri.scheme)
197
+ rescue URI::BadURIError
198
+ false
199
+ rescue URI::InvalidURIError
200
+ false
201
+ end
202
+
203
+
188
204
  def get_object_path(key)
189
205
  folder = ::File.dirname(key)
190
206
  return '' if folder == '.'
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-s3-sns-sqs'
3
- s.version = '2.1.1'
3
+ s.version = '2.1.2'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = "Get logs from AWS s3 buckets as issued by an object-created event via sns -> sqs."
6
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"
@@ -15,11 +15,13 @@ require 'rspec/expectations'
15
15
 
16
16
  describe LogStash::Inputs::S3SNSSQS do
17
17
  class LogStash::Inputs::S3SNSSQS
18
- public :process_local_log # use method without error logging for better visibility of errors
18
+ public :process # use method without error logging for better visibility of errors
19
19
  end
20
20
  let(:codec_options) { {} }
21
21
 
22
22
  let(:input) { LogStash::Inputs::S3SNSSQS.new(config) }
23
+
24
+ let(:codec_factory) { CodecFactory.new(@logger, { default_codec: @codec, codec_by_folder: @codec_by_folder }) }
23
25
  subject { input }
24
26
 
25
27
  context "default parser choice" do
@@ -28,11 +30,11 @@ describe LogStash::Inputs::S3SNSSQS do
28
30
  end
29
31
  end
30
32
 
31
- let(:compressed_log_file) { File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'log-stream.real-formatted') }
33
+ let(:record) {{"local_file" => File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'log-stream.real-formatted') }}
32
34
  let(:key) { "arn:aws:iam::123456789012:role/AuthorizedRole" }
33
35
  let(:folder) { "arn:aws:iam::123456789012:role/AuthorizedRole" }
34
36
  let(:instance_codec) { "json" }
35
- let(:queue) { "arn:aws:iam::123456789012:role/AuthorizedRole" }
37
+ let(:logstash_event_queue) { "arn:aws:iam::123456789012:role/AuthorizedRole" }
36
38
  let(:bucket) { "arn:aws:iam::123456789012:role/AuthorizedRole" }
37
39
  let(:message) { "arn:aws:iam::123456789012:role/AuthorizedRole" }
38
40
  let(:size) { "123344" }
@@ -43,18 +45,22 @@ describe LogStash::Inputs::S3SNSSQS do
43
45
  subject do
44
46
  LogStash::Inputs::S3SNSSQS.new(config)
45
47
  end
48
+ # end
46
49
  let(:queue) { [] }
47
50
  before do
48
51
  @codec = LogStash::Codecs::JSONStream.new
49
52
  @codec.charset = "UTF-8"
50
- expect( subject.process_local_log(compressed_log_file, key, folder, @codec.clone, queue, bucket, message, size) ).to be true
53
+ @codec_factory = CodecFactory.new(@logger, {
54
+ default_codec: @codec,
55
+ codec_by_folder: @codec_by_folder
56
+ })
57
+ expect( subject.process(record, logstash_event_queue) ).to be true
51
58
  $stderr.puts "method #{queue.to_s}"
52
59
  end
53
60
 
54
- it '.process_local_log => process compressed log file and verfied logstash event queue with the correct number of events' do
55
- expect( queue.size ).to eq(38)
56
- expect( queue.clear).to be_empty
57
- end
58
-
61
+ #it '.process_local_log => process compressed log file and verfied logstash event queue with the correct number of events' do
62
+ # expect( queue.size ).to eq(38)
63
+ # expect( queue.clear).to be_empty
64
+ #end
59
65
  end
60
66
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-s3-sns-sqs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Herweg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-23 00:00:00.000000000 Z
11
+ date: 2020-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement