logstash-output-awslogs 0.1.28 → 0.1.29

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
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