fluent-plugin-cloudwatch-ingest 1.7.0.rc2 → 1.7.0.rc4

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: bbcd4224819737806362f26aa66a2e57e3193a76
4
- data.tar.gz: 9a78d22537a00b9525e4ca7f92eb0c515ac21ab0
3
+ metadata.gz: 9c42dca008805bb5f68165fb13411d8a8d6485aa
4
+ data.tar.gz: 8e0ad98f42b5dde7dbdad9d7966b957a72b3754f
5
5
  SHA512:
6
- metadata.gz: ccbef5e546fe897d07a90ea7195862e668351b2732e704ae1843c751f01048ff14fe753847f6661b9303349ec015bbc5cd5d262b80ada917a3d5cc2e95655162
7
- data.tar.gz: 839333d681717ea4e5af0913c9460b3f40b9afb47ae5efbb8a803b3f2ca51aa632d355c2909ac902d666c91b462af6918a645ce01a575cd0c64ba407ff918e61
6
+ metadata.gz: 661cc11d5233d808792d5d1b9b23a740141277d45f1631a3c05edf24eeab3836d337c3c9d1a00b630c42036ba31cc92f37805ef9b71275403a57f1fb661cbe79
7
+ data.tar.gz: b38414fb62cce41769e7ab52e7f762f1d1020780ec4d6d02b5afe921a6c466745e5b124756d83bd0c11326a852a81df962a0f4f955dfc6982c782e12b95cdd09
data/README.md CHANGED
@@ -41,13 +41,14 @@ Or install it yourself as:
41
41
  state_file_name /mnt/nfs/cloudwatch.state
42
42
  interval 60
43
43
  max_log_streams_per_group 50
44
- error_interval 5 # Time to wait between error conditions before retry
45
- limit_events 10000 # Number of events to fetch in any given iteration
46
- event_start_time 0 # Do not fetch events before this time (UNIX epoch, miliseconds)
47
- oldest_logs_first false # When true fetch the oldest logs first
48
- drop_blank_events true # Fluentd may throw an exception if a blank event is emitted
49
- telemetry false # Produce statsd telemetry
50
- statsd_endpoint localhost # Endpoint to which telemetry should be sent
44
+ error_interval 5 # Time to wait between error conditions before retry
45
+ get_log_events_interval 0.0 # Time to pause between get_log_events to reduce throttle error
46
+ limit_events 10000 # Number of events to fetch in any given iteration
47
+ event_start_time 0 # Do not fetch events before this time (UNIX epoch, miliseconds)
48
+ oldest_logs_first false # When true fetch the oldest logs first
49
+ drop_blank_events true # Fluentd may throw an exception if a blank event is emitted
50
+ telemetry false # Produce statsd telemetry
51
+ statsd_endpoint localhost # Endpoint to which telemetry should be sent
51
52
  <parse>
52
53
  @type cloudwatch_ingest
53
54
  expression /^(?<message>.+)$/
@@ -2,7 +2,7 @@ module Fluent
2
2
  module Plugin
3
3
  module Cloudwatch
4
4
  module Ingest
5
- VERSION = '1.7.0.rc2'.freeze
5
+ VERSION = '1.7.0.rc4'.freeze
6
6
  end
7
7
  end
8
8
  end
@@ -34,6 +34,8 @@ module Fluent::Plugin
34
34
  desc 'Time to pause between error conditions'
35
35
  config_param :error_interval, :time, default: 5
36
36
  config_param :api_interval, :time, default: nil
37
+ desc 'Time to pause between get_log_events to reduce throttle error'
38
+ config_param :get_log_events_interval, :float, default: 0.0
37
39
  desc 'Tag to apply to record'
38
40
  config_param :tag, :string, default: 'cloudwatch'
39
41
  desc 'Enable AWS SDK logging'
@@ -254,16 +256,51 @@ module Fluent::Plugin
254
256
 
255
257
  def process_stream(group, stream, next_token, start_time, state)
256
258
  event_count = 0
259
+ has_stream_timestamp = true if state.store[group][stream]['timestamp']
257
260
 
258
261
  metric(:increment, 'api.calls.getlogevents.attempted')
259
- response = @aws.get_log_events(
260
- log_group_name: group,
261
- log_stream_name: stream,
262
- next_token: next_token,
263
- limit: @limit_events,
264
- start_time: start_time,
265
- start_from_head: @oldest_logs_first
266
- )
262
+ begin
263
+ param_next_token = next_token
264
+ param_start_time = start_time
265
+ retried = false
266
+
267
+ begin
268
+ log.info('log_group_name' => group, 'log_stream_name' => stream,
269
+ 'next_token' => param_next_token, 'limit' => @limit_events,
270
+ 'start_time' => param_start_time,
271
+ 'start_from_head' => @oldest_logs_first)
272
+ sleep @get_log_events_interval
273
+ response = @aws.get_log_events(
274
+ log_group_name: group,
275
+ log_stream_name: stream,
276
+ next_token: param_next_token,
277
+ limit: @limit_events,
278
+ start_time: param_start_time,
279
+ start_from_head: @oldest_logs_first
280
+ )
281
+ rescue Aws::CloudWatchLogs::Errors::InvalidParameterException
282
+ raise if retried
283
+
284
+ metric(:increment, 'api.calls.getlogevents.invalid_token')
285
+ log.error(
286
+ 'cloudwatch token is expired or broken. '\
287
+ 'trying with timestamp.'
288
+ )
289
+ param_next_token = nil
290
+ param_start_time = state.store[group][stream]['timestamp']
291
+ param_start_time ||= @event_start_time
292
+ retried = true
293
+ retry
294
+ end
295
+ rescue Aws::CloudWatchLogs::Errors::ThrottlingException,
296
+ Aws::CloudWatchLogs::Errors::ServiceUnavailableException,
297
+ Seahorse::Client::NetworkingError
298
+ # on temporary error, save the current state to retry next time
299
+ if has_stream_timestamp
300
+ state.new_store[group][stream] = state.store[group][stream]
301
+ end
302
+ raise # handle as error in run method
303
+ end
267
304
 
268
305
  response.events.each do |e|
269
306
  begin
@@ -276,8 +313,6 @@ module Fluent::Plugin
276
313
 
277
314
  log.info("#{event_count} events processed for stream #{stream}")
278
315
 
279
- has_stream_timestamp = true if state.store[group][stream]['timestamp']
280
-
281
316
  if !has_stream_timestamp && response.events.count.zero?
282
317
  # This stream has returned no data ever.
283
318
  # In this case, don't save state (token could be an invalid one)
@@ -333,33 +368,6 @@ module Fluent::Plugin
333
368
  @event_start_time,
334
369
  state
335
370
  )
336
- rescue Aws::CloudWatchLogs::Errors::InvalidParameterException
337
- metric(:increment, 'api.calls.getlogevents.invalid_token')
338
- log.error(
339
- 'cloudwatch token is expired or broken. '\
340
- 'trying with timestamp.'
341
- )
342
-
343
- # try again with timestamp instead of forward token
344
- begin
345
- timestamp = state.store[group][stream]['timestamp']
346
- timestamp ||= @event_start_time
347
-
348
- event_count += process_stream(group,
349
- stream,
350
- nil,
351
- timestamp,
352
- state)
353
- rescue StandardError => boom
354
- log.error(
355
- 'Unable to retrieve events for stream '\
356
- "#{stream} in group #{group}: "\
357
- "#{boom.inspect}"\
358
- )
359
- metric(:increment, 'api.calls.getlogevents.failed')
360
- sleep @error_interval
361
- next
362
- end
363
371
  rescue StandardError => boom
364
372
  log.error("Unable to retrieve events for stream #{stream} "\
365
373
  "in group #{group}: #{boom.inspect}")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-cloudwatch-ingest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0.rc2
4
+ version: 1.7.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Pointer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-12 00:00:00.000000000 Z
11
+ date: 2018-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler