logstash-output-qingstor 0.1.1 → 0.1.2
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/lib/logstash/outputs/qingstor/rotation_policy.rb +71 -0
- data/lib/logstash/outputs/qingstor.rb +2 -14
- data/logstash-output-qingstor.gemspec +2 -2
- data/spec/outputs/qingstor/rotation_policy_spec.rb +81 -0
- data/spec/outputs/qingstor/uploader_spec.rb +1 -1
- metadata +6 -10
- data/lib/logstash/outputs/qingstor/size_and_time_rotation_policy.rb +0 -24
- data/spec/outputs/qingstor/size_and_time_rotation_policy_spec.rb +0 -39
- data/spec/outputs/qingstor/size_rotation_policy_spec.rb +0 -25
- data/spec/outputs/qingstor/time_rotation_policy_spec.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2ac88521a301ed4c893e420a8d445a66abd4df8
|
4
|
+
data.tar.gz: cd922893c84aedfee1654f4e689bf3402f0fa034
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c20dfb1dcc93ec3342bcdc1664638bcdd4abf4f73e343f33333eedf12a510d52b7062ad527cd002d508d9c83eaea1d21ee8d51be19fc3f5debacfd0258153874
|
7
|
+
data.tar.gz: 9dba748ec32b6d7567f253a1d945df6d9262ddb961b939cbc41dcd45a6aced67f9893fcf77a4467cebf7efa11afecbc1f6fd9018f294a4ae7355c6f4f734873f
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LogStash
|
3
|
+
module Outputs
|
4
|
+
class Qingstor
|
5
|
+
class RotationPolicy
|
6
|
+
|
7
|
+
def initialize(policy, file_size, file_time)
|
8
|
+
@policy = policy
|
9
|
+
case policy
|
10
|
+
when "time"
|
11
|
+
init_time(file_time)
|
12
|
+
when "size"
|
13
|
+
init_size(file_size)
|
14
|
+
when "size_and_time"
|
15
|
+
init_size(file_size)
|
16
|
+
init_time(file_time)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def init_size(file_size)
|
21
|
+
if file_size <= 0
|
22
|
+
raise LogStash::ConfigurationError, "'file_size' need to be greater than 0"
|
23
|
+
end
|
24
|
+
@file_size = file_size
|
25
|
+
end
|
26
|
+
|
27
|
+
def init_time(file_time)
|
28
|
+
if file_time <= 0
|
29
|
+
raise LogStash::ConfigurationError, "'file_time' need to be greater than 0"
|
30
|
+
end
|
31
|
+
@file_time = file_time
|
32
|
+
end
|
33
|
+
|
34
|
+
def rotate?(file)
|
35
|
+
case @policy
|
36
|
+
when "time"
|
37
|
+
time_rotate?(file)
|
38
|
+
when "size"
|
39
|
+
size_rotate?(file)
|
40
|
+
when "size_and_time"
|
41
|
+
size_and_time_rotate?(file)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def size_and_time_rotate?(file)
|
46
|
+
size_rotate?(file) || time_rotate?(file)
|
47
|
+
end
|
48
|
+
|
49
|
+
def size_rotate?(file)
|
50
|
+
file.size >= @file_size
|
51
|
+
end
|
52
|
+
|
53
|
+
def time_rotate?(file)
|
54
|
+
file.size > 0 && (Time.now - file.ctime) >= @file_time
|
55
|
+
end
|
56
|
+
|
57
|
+
def needs_periodic?
|
58
|
+
case @policy
|
59
|
+
when "time" then
|
60
|
+
true
|
61
|
+
when "size_and_time" then
|
62
|
+
true
|
63
|
+
else
|
64
|
+
false
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -10,9 +10,7 @@ class LogStash::Outputs::Qingstor < LogStash::Outputs::Base
|
|
10
10
|
require "logstash/outputs/qingstor/temporary_file"
|
11
11
|
require "logstash/outputs/qingstor/temporary_file_factory"
|
12
12
|
require "logstash/outputs/qingstor/file_repository"
|
13
|
-
require "logstash/outputs/qingstor/
|
14
|
-
require "logstash/outputs/qingstor/time_rotation_policy"
|
15
|
-
require "logstash/outputs/qingstor/size_and_time_rotation_policy"
|
13
|
+
require "logstash/outputs/qingstor/rotation_policy"
|
16
14
|
require "logstash/outputs/qingstor/uploader"
|
17
15
|
require "logstash/outputs/qingstor/qingstor_validator"
|
18
16
|
|
@@ -101,7 +99,7 @@ class LogStash::Outputs::Qingstor < LogStash::Outputs::Base
|
|
101
99
|
|
102
100
|
@file_repository = FileRepository.new(@tags, @encoding, @tmpdir)
|
103
101
|
|
104
|
-
@rotation = rotation_strategy
|
102
|
+
@rotation = RotationPolicy.new(@rotation_strategy, @file_size, @file_time)
|
105
103
|
|
106
104
|
executor = Concurrent::ThreadPoolExecutor.new({
|
107
105
|
:min_threads => 1,
|
@@ -141,16 +139,6 @@ class LogStash::Outputs::Qingstor < LogStash::Outputs::Base
|
|
141
139
|
rotate_if_needed(prefix_written_to)
|
142
140
|
end # def multi_receive_encoded
|
143
141
|
|
144
|
-
def rotation_strategy
|
145
|
-
case @rotation_strategy
|
146
|
-
when "size"
|
147
|
-
SizeRotationPolicy.new(@file_size)
|
148
|
-
when "time"
|
149
|
-
TimeRotationPolicy.new(@file_time)
|
150
|
-
when "size_and_time"
|
151
|
-
SizeAndTimeRotationPolicy.new(@file_size, @file_time)
|
152
|
-
end
|
153
|
-
end
|
154
142
|
|
155
143
|
def rotate_if_needed(prefixs)
|
156
144
|
prefixs.each do |prefix|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-qingstor'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.2'
|
4
4
|
s.licenses = ['Apache License (2.0)']
|
5
5
|
s.summary = 'logstash output plugin for qingstor'
|
6
|
-
s.description = 'Collect the
|
6
|
+
s.description = 'Collect the outputs of logstash and store into Qingstor'
|
7
7
|
s.homepage = 'https://github.com/tacinight/logstash-output-qingstor'
|
8
8
|
s.authors = ['Evan Zhao']
|
9
9
|
s.email = 'tacingiht@gmail.com'
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/devutils/rspec/spec_helper"
|
3
|
+
require "logstash/outputs/qingstor/temporary_file"
|
4
|
+
require "logstash/outputs/qingstor/rotation_policy"
|
5
|
+
|
6
|
+
describe LogStash::Outputs::Qingstor::RotationPolicy do
|
7
|
+
let(:size_file) { 1024 * 2 }
|
8
|
+
let(:time_file) { 2 }
|
9
|
+
let(:name) { "foobar" }
|
10
|
+
let(:tmp_file) { Stud::Temporary.file }
|
11
|
+
let(:tmp_dir) { tmp_file.path }
|
12
|
+
let(:file) { LogStash::Outputs::Qingstor::TemporaryFile.new(name, tmp_file, tmp_dir) }
|
13
|
+
let(:content) { "May the code be with you" * 100 }
|
14
|
+
|
15
|
+
|
16
|
+
context "when size_and_time policy" do
|
17
|
+
subject { described_class.new("size_and_time", size_file, time_file) }
|
18
|
+
|
19
|
+
it "raise error if time_file is no grater then 0" do
|
20
|
+
expect{ described_class.new("size_and_time", 0, 0) }.to raise_error(LogStash::ConfigurationError)
|
21
|
+
expect{ described_class.new("size_and_time", -1, 0) }.to raise_error(LogStash::ConfigurationError)
|
22
|
+
expect{ described_class.new("size_and_time", 0, -1) }.to raise_error(LogStash::ConfigurationError)
|
23
|
+
expect{ described_class.new("size_and_time", -1, -1) }.to raise_error(LogStash::ConfigurationError)
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
it "return false if the file is not old enough" do
|
28
|
+
expect(subject.rotate?(file)).to be_falsey
|
29
|
+
end
|
30
|
+
|
31
|
+
it "return false if the file is old enough with file size 0" do
|
32
|
+
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
33
|
+
expect(subject.rotate?(file)).to be_falsey
|
34
|
+
end
|
35
|
+
|
36
|
+
it "return truth if the file is old enough and non-empty" do
|
37
|
+
file.write(content)
|
38
|
+
file.fsync
|
39
|
+
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
40
|
+
expect(subject.rotate?(file)).to be_truthy
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when size policy" do
|
45
|
+
subject { described_class.new("size", size_file, time_file) }
|
46
|
+
it "raise error if size_file is no grater then 0" do
|
47
|
+
expect{described_class.new("size", 0, 0)}.to raise_error(LogStash::ConfigurationError)
|
48
|
+
expect{described_class.new("size", -1, 0)}.to raise_error(LogStash::ConfigurationError)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "return true if the file has a bigger size value then 'size_file'" do
|
52
|
+
file.write(content)
|
53
|
+
file.fsync
|
54
|
+
expect(subject.rotate?(file)).to be_truthy
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when time policy" do
|
59
|
+
subject { described_class.new("time", size_file, time_file) }
|
60
|
+
it "raise error if time_file is no grater then 0" do
|
61
|
+
expect{described_class.new("time", 0, 0)}.to raise_error(LogStash::ConfigurationError)
|
62
|
+
expect{described_class.new("time", 0, -1)}.to raise_error(LogStash::ConfigurationError)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "return false if the file is not old enough" do
|
66
|
+
expect(subject.rotate?(file)).to be_falsey
|
67
|
+
end
|
68
|
+
|
69
|
+
it "return false if the file is old enough with file size 0" do
|
70
|
+
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
71
|
+
expect(subject.rotate?(file)).to be_falsey
|
72
|
+
end
|
73
|
+
|
74
|
+
it "return truth if the file is old enough and non-empty" do
|
75
|
+
file.write(content)
|
76
|
+
file.fsync
|
77
|
+
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
78
|
+
expect(subject.rotate?(file)).to be_truthy
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -38,7 +38,7 @@ describe LogStash::Outputs::Qingstor::Uploader do
|
|
38
38
|
|
39
39
|
it "upload file to the qingstor bucket" do
|
40
40
|
subject.upload(file)
|
41
|
-
expect(list_remote_file.size).to eq(
|
41
|
+
expect(list_remote_file.size).to eq(1)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "execute a callback when the upload is complete" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-qingstor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Zhao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,7 +94,7 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
-
description: Collect the
|
97
|
+
description: Collect the outputs of logstash and store into Qingstor
|
98
98
|
email: tacingiht@gmail.com
|
99
99
|
executables: []
|
100
100
|
extensions: []
|
@@ -111,7 +111,7 @@ files:
|
|
111
111
|
- lib/logstash/outputs/qingstor.rb
|
112
112
|
- lib/logstash/outputs/qingstor/file_repository.rb
|
113
113
|
- lib/logstash/outputs/qingstor/qingstor_validator.rb
|
114
|
-
- lib/logstash/outputs/qingstor/
|
114
|
+
- lib/logstash/outputs/qingstor/rotation_policy.rb
|
115
115
|
- lib/logstash/outputs/qingstor/size_rotation_policy.rb
|
116
116
|
- lib/logstash/outputs/qingstor/temporary_file.rb
|
117
117
|
- lib/logstash/outputs/qingstor/temporary_file_factory.rb
|
@@ -120,11 +120,9 @@ files:
|
|
120
120
|
- logstash-output-qingstor.gemspec
|
121
121
|
- spec/outputs/qingstor/file_repository_spec.rb
|
122
122
|
- spec/outputs/qingstor/qingstor_validator_spec.rb
|
123
|
-
- spec/outputs/qingstor/
|
124
|
-
- spec/outputs/qingstor/size_rotation_policy_spec.rb
|
123
|
+
- spec/outputs/qingstor/rotation_policy_spec.rb
|
125
124
|
- spec/outputs/qingstor/temporary_file_factory_spec.rb
|
126
125
|
- spec/outputs/qingstor/temporary_file_spec.rb
|
127
|
-
- spec/outputs/qingstor/time_rotation_policy_spec.rb
|
128
126
|
- spec/outputs/qingstor/uploader_spec.rb
|
129
127
|
- spec/outputs/qingstor_spec.rb
|
130
128
|
- spec/outputs/qs_access_helper.rb
|
@@ -158,11 +156,9 @@ summary: logstash output plugin for qingstor
|
|
158
156
|
test_files:
|
159
157
|
- spec/outputs/qingstor/file_repository_spec.rb
|
160
158
|
- spec/outputs/qingstor/qingstor_validator_spec.rb
|
161
|
-
- spec/outputs/qingstor/
|
162
|
-
- spec/outputs/qingstor/size_rotation_policy_spec.rb
|
159
|
+
- spec/outputs/qingstor/rotation_policy_spec.rb
|
163
160
|
- spec/outputs/qingstor/temporary_file_factory_spec.rb
|
164
161
|
- spec/outputs/qingstor/temporary_file_spec.rb
|
165
|
-
- spec/outputs/qingstor/time_rotation_policy_spec.rb
|
166
162
|
- spec/outputs/qingstor/uploader_spec.rb
|
167
163
|
- spec/outputs/qingstor_spec.rb
|
168
164
|
- spec/outputs/qs_access_helper.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/outputs/qingstor/size_rotation_policy"
|
3
|
-
require "logstash/outputs/qingstor/time_rotation_policy"
|
4
|
-
|
5
|
-
module LogStash
|
6
|
-
module Outputs
|
7
|
-
class Qingstor
|
8
|
-
class SizeAndTimeRotationPolicy
|
9
|
-
def initialize(size_file, time_file)
|
10
|
-
@size_strategy = SizeRotationPolicy.new(size_file)
|
11
|
-
@time_strategy = TimeRotationPolicy.new(time_file)
|
12
|
-
end
|
13
|
-
|
14
|
-
def rotate?(file)
|
15
|
-
@size_strategy.rotate?(file) || @time_strategy.rotate?(file)
|
16
|
-
end
|
17
|
-
|
18
|
-
def needs_periodic?
|
19
|
-
true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/devutils/rspec/spec_helper"
|
3
|
-
require "logstash/outputs/qingstor/temporary_file"
|
4
|
-
require "logstash/outputs/qingstor/size_and_time_rotation_policy"
|
5
|
-
|
6
|
-
describe LogStash::Outputs::Qingstor::SizeAndTimeRotationPolicy do
|
7
|
-
let(:size_file) { 1024 * 2 }
|
8
|
-
let(:time_file) { 2 }
|
9
|
-
let(:name) { "foobar" }
|
10
|
-
let(:tmp_file) { Stud::Temporary.file }
|
11
|
-
let(:tmp_dir) { tmp_file.path }
|
12
|
-
let(:file) { LogStash::Outputs::Qingstor::TemporaryFile.new(name, tmp_file, tmp_dir) }
|
13
|
-
let(:content) { "May the code be with you" * 100 }
|
14
|
-
subject { described_class.new(size_file, time_file) }
|
15
|
-
|
16
|
-
it "raise error if time_file is no grater then 0" do
|
17
|
-
expect{ described_class.new(0, 0) }.to raise_error(LogStash::ConfigurationError)
|
18
|
-
expect{ described_class.new(-1, 0) }.to raise_error(LogStash::ConfigurationError)
|
19
|
-
expect{ described_class.new(0, -1) }.to raise_error(LogStash::ConfigurationError)
|
20
|
-
expect{ described_class.new(-1, -1) }.to raise_error(LogStash::ConfigurationError)
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
it "return false if the file is not old enough" do
|
25
|
-
expect(subject.rotate?(file)).to be_falsey
|
26
|
-
end
|
27
|
-
|
28
|
-
it "return false if the file is old enough with file size 0" do
|
29
|
-
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
30
|
-
expect(subject.rotate?(file)).to be_falsey
|
31
|
-
end
|
32
|
-
|
33
|
-
it "return truth if the file is old enough and non-empty" do
|
34
|
-
file.write(content)
|
35
|
-
file.fsync
|
36
|
-
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
37
|
-
expect(subject.rotate?(file)).to be_truthy
|
38
|
-
end
|
39
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/devutils/rspec/spec_helper"
|
3
|
-
require "logstash/outputs/qingstor/temporary_file"
|
4
|
-
require "logstash/outputs/qingstor/size_rotation_policy"
|
5
|
-
|
6
|
-
describe LogStash::Outputs::Qingstor::SizeRotationPolicy do
|
7
|
-
let(:size_file) { 1024 * 2 }
|
8
|
-
let(:name) { "foobar" }
|
9
|
-
let(:tmp_file) { Stud::Temporary.file }
|
10
|
-
let(:tmp_dir) { tmp_file.path }
|
11
|
-
let(:file) { LogStash::Outputs::Qingstor::TemporaryFile.new(name, tmp_file, tmp_dir) }
|
12
|
-
let(:content) { "May the code be with you" * 100 }
|
13
|
-
subject { described_class.new(size_file) }
|
14
|
-
|
15
|
-
it "raise error if size_file is no grater then 0" do
|
16
|
-
expect{described_class.new(0)}.to raise_error(LogStash::ConfigurationError)
|
17
|
-
expect{described_class.new(-1)}.to raise_error(LogStash::ConfigurationError)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "return true if the file has a bigger size value then 'size_file'" do
|
21
|
-
file.write(content)
|
22
|
-
file.fsync
|
23
|
-
expect(subject.rotate?(file)).to be_truthy
|
24
|
-
end
|
25
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/devutils/rspec/spec_helper"
|
3
|
-
require "logstash/outputs/qingstor/temporary_file"
|
4
|
-
require "logstash/outputs/qingstor/time_rotation_policy"
|
5
|
-
|
6
|
-
describe LogStash::Outputs::Qingstor::TimeRotationPolicy do
|
7
|
-
let(:time_file) { 2 }
|
8
|
-
let(:name) { "foobar" }
|
9
|
-
let(:tmp_file) { Stud::Temporary.file }
|
10
|
-
let(:tmp_dir) { tmp_file.path }
|
11
|
-
let(:file) { LogStash::Outputs::Qingstor::TemporaryFile.new(name, tmp_file, tmp_dir) }
|
12
|
-
let(:content) { "May the code be with you" * 100 }
|
13
|
-
subject { described_class.new(time_file) }
|
14
|
-
|
15
|
-
it "raise error if time_file is no grater then 0" do
|
16
|
-
expect{described_class.new(0)}.to raise_error(LogStash::ConfigurationError)
|
17
|
-
expect{described_class.new(-1)}.to raise_error(LogStash::ConfigurationError)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "return false if the file is not old enough" do
|
21
|
-
expect(subject.rotate?(file)).to be_falsey
|
22
|
-
end
|
23
|
-
|
24
|
-
it "return false if the file is old enough with file size 0" do
|
25
|
-
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
26
|
-
expect(subject.rotate?(file)).to be_falsey
|
27
|
-
end
|
28
|
-
|
29
|
-
it "return truth if the file is old enough and non-empty" do
|
30
|
-
file.write(content)
|
31
|
-
file.fsync
|
32
|
-
allow(file).to receive(:ctime).and_return(Time.now - (time_file * 2 * 60))
|
33
|
-
expect(subject.rotate?(file)).to be_truthy
|
34
|
-
end
|
35
|
-
end
|