logstash-output-monasca_log_api 1.0.3 → 1.0.4

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