logstash-output-monasca_log_api 1.0.3 → 1.0.4

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
  SHA1:
3
- metadata.gz: 375ed1a143e91cddf640eada2f64c431d6957e8b
4
- data.tar.gz: 9347e47c599a7c364e18025dc0968b5eaae5769e
3
+ metadata.gz: 6e01dc0526076f71ea01ecd92d2040f3695ee006
4
+ data.tar.gz: fcd4afa2854382dd30cb63b4c2d244eeb113132c
5
5
  SHA512:
6
- metadata.gz: 10dae2e9ac05afc48211da532a5090ed9b28f1cacb2f2a1c2590edc343f50d1aa472d20955285ceaef67ea36de1d9214fe81dc17e09af7c37378896b47b3e6a9
7
- data.tar.gz: 840994418f26066851bf9d96965b51f0d3ff857d1688492a6402a368707b2289eff76a9fe8c0d21a5793b0e0d9ac81eaaa984620d28f639f5a035594c359bf93
6
+ metadata.gz: 6f56d1f2a6fc39105ec0bc18ffcfd66a259cc2df32017ecae5d2bb140549b19f97ff6fcff42b030e0947320b64e43d0c4fc4d1187855ef63a22dc4bb782fa75f
7
+ data.tar.gz: fc0ca2aeccbbbf9e158f42f48ad71ceb6669d1306a17be4f3a3c10900d5d31f3f513cb03286bf661bbe00005b9abaf503271ec07af675beea6169cdb29e307b4
data/README.md CHANGED
@@ -224,6 +224,11 @@ input {
224
224
 
225
225
  **Important:** The user which is sending the data on behalf of other tenants requires a specific role. This role is defined in the configuration file of the monasca-log-api as ```delegate_roles```.
226
226
 
227
+ #### Exception handling
228
+
229
+ This output plugin will sleep for maximum 60 seconds after the request to
230
+ Monasca API fails and will retry the request until successful.
231
+
227
232
  ## Open tasks
228
233
  * Language translations (Replace hardcoded String messages with a configuration/language file)
229
- * Exception handling (monasca-api requests)
234
+ * Unit tests for failed requests handling
@@ -209,6 +209,7 @@ class LogStash::Outputs::MonascaLogApi < LogStash::Outputs::Base
209
209
 
210
210
  def stop_time_check
211
211
  #ensure that entries buffered in queue will be handled before stop
212
+ @stopping = true
212
213
  @mutex.synchronize do
213
214
  send_logs
214
215
  end
@@ -226,6 +227,7 @@ class LogStash::Outputs::MonascaLogApi < LogStash::Outputs::Base
226
227
  token = LogStash::Outputs::Keystone::Token.instance
227
228
  @logger.debug("Sending #{@logs[JSON_LOGS].size} logs")
228
229
  retry_tries = 5
230
+ attempt = 0
229
231
  begin
230
232
  tries ||= retry_tries
231
233
  @monasca_log_api_client.send_logs(@logs, token.id, @cross_tenant)
@@ -241,10 +243,19 @@ class LogStash::Outputs::MonascaLogApi < LogStash::Outputs::Base
241
243
  else
242
244
  @logger.error("Unauthorized: #{e}. Requesting new token failed "\
243
245
  "after #{retry_tries} retries.")
246
+
247
+ sleep_for_retry(60)
248
+ retry
244
249
  end
245
250
  rescue => e
246
- @logger.error('Sending event to monasca-log-api threw exception',
251
+ attempt += 1
252
+ sleep_for = get_sleep_time(attempt)
253
+ @logger.error("Sending event to monasca-log-api threw exception, "\
254
+ "will sleep for #{sleep_for} seconds.",
247
255
  :exceptionew => e)
256
+
257
+ sleep_for_retry(sleep_for)
258
+ retry
248
259
  end
249
260
  @logs.clear
250
261
  initialize_logs_object
@@ -270,4 +281,13 @@ class LogStash::Outputs::MonascaLogApi < LogStash::Outputs::Base
270
281
  raise LogStash::ConfigurationError, err
271
282
  end
272
283
  end
284
+
285
+ def get_sleep_time(attempt)
286
+ sleep_for = attempt**2
287
+ sleep_for <= 60 ? sleep_for : 60
288
+ end
289
+
290
+ def sleep_for_retry(duration)
291
+ Stud.stoppable_sleep(duration) { @stopping }
292
+ end
273
293
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-monasca_log_api'
3
- s.version = '1.0.3'
3
+ s.version = '1.0.4'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = 'This gem is a logstash output plugin to connect via http to monasca-log-api.'
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'
@@ -22,10 +22,11 @@ Gem::Specification.new do |s|
22
22
  s.add_runtime_dependency 'logstash-core', '~> 2.0'
23
23
  s.add_runtime_dependency 'logstash-codec-plain', '~> 2.0'
24
24
  s.add_runtime_dependency 'logstash-codec-json', '~> 2.0'
25
+ s.add_runtime_dependency 'stud', '~> 0.0.22'
25
26
  s.add_development_dependency 'logstash-devutils', '~> 0.0.14'
26
27
  s.add_development_dependency 'simplecov', '~> 0.10'
27
28
  s.add_development_dependency 'simplecov-rcov', '~> 0.2.0'
28
29
  s.add_development_dependency 'rspec_junit_formatter', '~> 0.2.3'
29
- s.add_development_dependency 'rubocop', '~> 0.37.2'
30
+ s.add_development_dependency 'rubocop', ">= 0.60.0"
30
31
  s.add_development_dependency 'webmock', '~> 2.0'
31
32
  end
@@ -422,23 +422,6 @@ describe 'outputs/monasca_log_api' do
422
422
  end
423
423
  end
424
424
 
425
- context 'when sending logs raise exception' do
426
- it 'logs a failure' do
427
- expect_any_instance_of(Cabin::Channel).to receive(:error)
428
-
429
- monasca_log_api = LogStash::Outputs::MonascaLogApi.new(complete_config)
430
- expect_any_instance_of(LogStash::Outputs::Monasca::MonascaLogApiClient)
431
- .to receive(:send_logs)
432
- .and_raise(Errno::ETIMEDOUT)
433
- expect_any_instance_of(LogStash::Outputs::Keystone::KeystoneClient)
434
- .to receive(:authenticate).and_return(valid_token)
435
-
436
- monasca_log_api.register
437
- monasca_log_api.multi_receive([event, event])
438
- expect { monasca_log_api.multi_receive([event]) }.to_not raise_error
439
- end
440
- end
441
-
442
425
  context 'after sending logs' do
443
426
  it 'clears collected logs' do
444
427
  expect_any_instance_of(LogStash::Outputs::Monasca::MonascaLogApiClient)
@@ -480,42 +463,6 @@ describe 'outputs/monasca_log_api' do
480
463
  monasca_log_api.multi_receive([event, event, event])
481
464
  expect(LogStash::Outputs::Keystone::Token.instance.id).to eq(token_id)
482
465
  end
483
-
484
- it 'if unauthorized, renew it' do
485
- stub_request(:post, monasca_log_api_url_post)
486
- .with(:headers =>
487
- {
488
- 'Accept' => '*/*',
489
- 'Content-Type' => 'application/json',
490
- 'User-Agent' => 'Ruby',
491
- 'X-Auth-Token' => 'f8cdafb7dce94444ad781a53ddaff693'
492
- })
493
- .to_return(:status => 401)
494
-
495
- expect_any_instance_of(LogStash::Outputs::Monasca::MonascaLogApiClient)
496
- .to receive(:handle_response).exactly(5).times
497
- .and_raise(
498
- LogStash::Outputs::Monasca::MonascaLogApiClient::InvalidTokenError
499
- )
500
-
501
- expect_any_instance_of(LogStash::Outputs::Keystone::KeystoneClient)
502
- .to receive(:authenticate).exactly(6).times
503
- .with(
504
- complete_config['username'],
505
- complete_config['user_domain_name'],
506
- complete_config['password'],
507
- complete_config['project_name'],
508
- complete_config['project_domain_name']
509
- )
510
- .and_return(expired_token, valid_token)
511
-
512
- monasca_log_api = LogStash::Outputs::MonascaLogApi.new(complete_config)
513
- allow(monasca_log_api).to receive(:start_time_check)
514
- monasca_log_api.register
515
- expect(LogStash::Outputs::Keystone::Token.instance.id).to eq(old_token_id)
516
- monasca_log_api.multi_receive([event, event, event])
517
- expect(LogStash::Outputs::Keystone::Token.instance.id).to eq(token_id)
518
- end
519
466
  end
520
467
 
521
468
  context 'when stopping plugin' do
@@ -528,4 +475,6 @@ describe 'outputs/monasca_log_api' do
528
475
  end
529
476
  end
530
477
 
478
+ # TODO add testing graceful recovery from exceptions
479
+
531
480
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-monasca_log_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fujitsu Enabling Software Technology GmbH
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-20 00:00:00.000000000 Z
11
+ date: 2018-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.0.22
61
+ name: stud
62
+ prerelease: false
63
+ type: :runtime
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.22
55
69
  - !ruby/object:Gem::Dependency
56
70
  requirement: !ruby/object:Gem::Requirement
57
71
  requirements:
@@ -111,17 +125,17 @@ dependencies:
111
125
  - !ruby/object:Gem::Dependency
112
126
  requirement: !ruby/object:Gem::Requirement
113
127
  requirements:
114
- - - "~>"
128
+ - - ">="
115
129
  - !ruby/object:Gem::Version
116
- version: 0.37.2
130
+ version: 0.60.0
117
131
  name: rubocop
118
132
  prerelease: false
119
133
  type: :development
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - "~>"
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
- version: 0.37.2
138
+ version: 0.60.0
125
139
  - !ruby/object:Gem::Dependency
126
140
  requirement: !ruby/object:Gem::Requirement
127
141
  requirements: