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 +4 -4
- data/README.md +6 -1
- data/lib/logstash/outputs/monasca_log_api.rb +21 -1
- data/logstash-output-monasca_log_api.gemspec +3 -2
- data/spec/outputs/monasca_log_api_spec.rb +2 -53
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e01dc0526076f71ea01ecd92d2040f3695ee006
|
4
|
+
data.tar.gz: fcd4afa2854382dd30cb63b4c2d244eeb113132c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
*
|
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
|
-
|
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
|
+
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',
|
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.
|
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
|
+
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.
|
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.
|
138
|
+
version: 0.60.0
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
requirement: !ruby/object:Gem::Requirement
|
127
141
|
requirements:
|