logstash-output-awslogs 0.1.28 → 0.1.29

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: 4fb080097b3946429995c6e7e7f937a4f05bd416c9c21060186af4237cfd8f5a
4
- data.tar.gz: 6c0d9183dc2e0aa601f74c7202033160f2fe9ed29f616342c09db2b82c7a3b42
3
+ metadata.gz: a6d187d9a46e3d3b58b9cc7782499de7de990eca4eb2ba212b03abe8ff29d42e
4
+ data.tar.gz: 217c5ae517cfc1333ec150499be174543087a9063374a1a65ae66fcc3525f909
5
5
  SHA512:
6
- metadata.gz: 780c474b5299be93ed86071830ed410deb327d118c0d10c2952d350c31fd771fe88d1f9a7fffe36206134fdf9811076984b96617eb3e056826e38a5f63cf46d3
7
- data.tar.gz: 3dbe092d6b64511a997879d595d56d6221b8d106e4c8b97e92fe08545364825b4feca4b8a48f0e75bbb6e0db8b5c545c1421dfc151d1369f8f8ee43d48c6329c
6
+ metadata.gz: deccb83b39e6b80517fc1682fd877a385c60c1ff0ff82854dc87f12950a6399a7d9a025cb14602965ea841e7daee35a6be3e0d3eaa62ad8c969e56f26982f2fb
7
+ data.tar.gz: eec9cb42b0ffc31a6b7a39ca1d53fb0eea33bc4494b47e2a80dfd1d7efb1dd08fb12ffc3b843476ca9ae3ee06d2a518064d5701f4486fe624c53fc76066ffff6
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
1
  source 'https://rubygems.org'
2
- gemspec
2
+ gemspec
@@ -3,7 +3,7 @@
3
3
  require 'logstash/outputs/base'
4
4
  require 'logstash/namespace'
5
5
  require 'logstash/plugin_mixins/aws_config'
6
- require 'aws-sdk-cloudwatchlogs'
6
+ require 'aws-sdk'
7
7
 
8
8
  Aws.eager_autoload!
9
9
 
@@ -28,6 +28,7 @@ class LogStash::Outputs::Awslogs < LogStash::Outputs::Base
28
28
 
29
29
  def multi_receive_encoded(events_and_encoded)
30
30
  to_send = {}
31
+ sequence_tokens = {}
31
32
 
32
33
  events_and_encoded.each do |event, encoded|
33
34
  event_log_stream_name = event.sprintf(log_stream_name)
@@ -50,6 +51,43 @@ class LogStash::Outputs::Awslogs < LogStash::Outputs::Base
50
51
  end
51
52
  end
52
53
 
54
+ group_names = []
55
+ to_send.each do |event_log_names, _events|
56
+ event_log_group_name = event_log_names[0]
57
+ event_log_stream_name = event_log_names[1]
58
+ next_sequence_token_key = [event_log_group_name, event_log_stream_name]
59
+ next if @next_sequence_tokens.keys.include? next_sequence_token_key
60
+ unless group_names.include? event_log_group_name
61
+ group_names.push(event_log_group_name)
62
+ end
63
+ end
64
+
65
+ group_names.each do |log_group_name|
66
+ unless sequence_tokens.keys.include? log_group_name
67
+ sequence_tokens.store(log_group_name, {})
68
+ end
69
+ begin
70
+ @client.describe_log_streams({log_group_name: log_group_name}).each do |response|
71
+ response.log_streams.each do |log_stream_data|
72
+ unless log_stream_data.upload_sequence_token&.empty?
73
+ sequence_tokens[log_group_name][log_stream_data.log_stream_name.to_s] = log_stream_data.upload_sequence_token.to_s
74
+ end
75
+ end
76
+ end
77
+ rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException => e
78
+ @logger.info("Will create log group #{log_group_name} and retry")
79
+ begin
80
+ @client.create_log_group({log_group_name: log_group_name})
81
+ rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => e
82
+ @logger.info("Log group #{log_group_name} already exists")
83
+ end
84
+ retry
85
+ rescue Aws::CloudWatchLogs::Errors::ThrottlingException => e
86
+ @logger.info('Describe streams throttling, retry')
87
+ retry
88
+ end
89
+ end
90
+
53
91
  to_send.each do |event_log_names, log_events|
54
92
  event_log_group_name = event_log_names[0]
55
93
  event_log_stream_name = event_log_names[1]
@@ -65,30 +103,60 @@ class LogStash::Outputs::Awslogs < LogStash::Outputs::Base
65
103
 
66
104
  if @next_sequence_tokens.keys.include? next_sequence_token_key
67
105
  send_opts[:sequence_token] = @next_sequence_tokens[next_sequence_token_key]
106
+ elsif !sequence_tokens[event_log_group_name][event_log_stream_name]&.empty?
107
+ send_opts[:sequence_token] = sequence_tokens[event_log_group_name][event_log_stream_name]
68
108
  else
69
109
  begin
70
- resp = @client.put_log_events(send_opts)
71
- @next_sequence_tokens.store(next_sequence_token_key, resp.next_sequence_token)
72
- rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException => _e
110
+ @client.create_log_stream(ident_opts)
111
+ rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException => e
73
112
  @logger.info('Will create log group/stream and retry')
74
113
  begin
75
114
  @client.create_log_group({log_group_name: send_opts[:log_group_name]})
76
- rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => _e
115
+ rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => e
77
116
  @logger.info("Log group #{send_opts[:log_group_name]} already exists")
78
117
  end
79
118
  begin
80
119
  @client.create_log_stream({log_group_name: send_opts[:log_group_name], log_stream_name: send_opts[:log_stream_name]})
81
- rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => _e
120
+ rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => e
82
121
  @logger.info("Log stream #{send_opts[:log_stream_name]} already exists")
83
122
  end
84
123
  retry
85
- rescue Aws::CloudWatchLogs::Errors::InvalidSequenceTokenException => e
86
- send_opts[:sequence_token] = e.expected_sequence_token
87
- retry
88
- rescue Aws::CloudWatchLogs::Errors::LimitExceededException => e
89
- @logger.info('Logs throttling, retry')
124
+ rescue Aws::CloudWatchLogs::Errors::ThrottlingException => e
125
+ @logger.info('Creating log streams throttling, retry')
90
126
  retry
127
+ rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => e
128
+ @logger.info("Log stream #{send_opts[:log_stream_name]} already exists")
129
+ end
130
+ end
131
+ begin
132
+ resp = @client.put_log_events(send_opts)
133
+ @next_sequence_tokens.store(next_sequence_token_key, resp.next_sequence_token)
134
+ rescue Aws::CloudWatchLogs::Errors::ResourceNotFoundException => e
135
+ @logger.info('Will create log group/stream and retry')
136
+ begin
137
+ @client.create_log_group({log_group_name: send_opts[:log_group_name]})
138
+ rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => e
139
+ @logger.info("Log group #{send_opts[:log_group_name]} already exists")
140
+ end
141
+ begin
142
+ @client.create_log_stream({log_group_name: send_opts[:log_group_name], log_stream_name: send_opts[:log_stream_name]})
143
+ rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException => e
144
+ @logger.info("Log stream #{send_opts[:log_stream_name]} already exists")
145
+ end
146
+ retry
147
+ rescue Aws::CloudWatchLogs::Errors::InvalidSequenceTokenException => e
148
+ @logger.info(e.code)
149
+ response = @client.describe_log_streams({log_group_name: send_opts[:log_group_name], log_stream_name_prefix: send_opts[:log_stream_name]})
150
+ response.log_streams.each do |stream_data|
151
+ if stream_data.log_stream_name == send_opts[:log_stream_name]
152
+ send_opts[:sequence_token] = stream_data.upload_sequence_token
153
+ break
154
+ end
91
155
  end
156
+ retry
157
+ rescue Aws::CloudWatchLogs::Errors::ThrottlingException => e
158
+ @logger.info('Logs throttling, retry')
159
+ retry
92
160
  end
93
161
  end
94
162
  end # def multi_receive_encodeds
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-awslogs'
3
- s.version = '0.1.28'
3
+ s.version = '0.1.29'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = 'Writes events to AWS CloudWatch logs.'
6
6
  s.homepage = 'https://github.com/rickycook/logstash-output-awslogs'
@@ -20,6 +20,6 @@ Gem::Specification.new do |s|
20
20
  s.add_runtime_dependency "logstash-core-plugin-api", "~> 2.0"
21
21
  s.add_runtime_dependency "logstash-codec-plain"
22
22
  s.add_runtime_dependency 'logstash-mixin-aws', '>= 4.3.0'
23
- s.add_runtime_dependency 'aws-sdk-cloudwatchlogs'
24
23
  s.add_development_dependency "logstash-devutils"
24
+ s.add_development_dependency "aws-sdk-cloudwatchlogs"
25
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-awslogs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.28
4
+ version: 0.1.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Klyba
@@ -58,9 +58,9 @@ dependencies:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
- name: aws-sdk-cloudwatchlogs
61
+ name: logstash-devutils
62
62
  prerelease: false
63
- type: :runtime
63
+ type: :development
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
@@ -72,7 +72,7 @@ dependencies:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
- name: logstash-devutils
75
+ name: aws-sdk-cloudwatchlogs
76
76
  prerelease: false
77
77
  type: :development
78
78
  version_requirements: !ruby/object:Gem::Requirement