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