logstash-output-oss 0.1.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +2 -0
  3. data/CONTRIBUTORS +10 -0
  4. data/DEVELOPER.md +10 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE +11 -0
  7. data/README.md +149 -0
  8. data/lib/com/aliyun/aliyun-java-sdk-core/3.4.0/aliyun-java-sdk-core-3.4.0.jar +0 -0
  9. data/lib/com/aliyun/aliyun-java-sdk-ecs/4.2.0/aliyun-java-sdk-ecs-4.2.0.jar +0 -0
  10. data/lib/com/aliyun/aliyun-java-sdk-ram/3.0.0/aliyun-java-sdk-ram-3.0.0.jar +0 -0
  11. data/lib/com/aliyun/aliyun-java-sdk-sts/3.0.0/aliyun-java-sdk-sts-3.0.0.jar +0 -0
  12. data/lib/com/aliyun/oss/aliyun-sdk-oss/3.4.0/aliyun-sdk-oss-3.4.0.jar +0 -0
  13. data/lib/com/sun/jersey/jersey-core/1.9/jersey-core-1.9.jar +0 -0
  14. data/lib/com/sun/jersey/jersey-json/1.9/jersey-json-1.9.jar +0 -0
  15. data/lib/com/sun/xml/bind/jaxb-impl/2.2.3-1/jaxb-impl-2.2.3-1.jar +0 -0
  16. data/lib/commons-codec/commons-codec/1.9/commons-codec-1.9.jar +0 -0
  17. data/lib/commons-logging/commons-logging/1.2/commons-logging-1.2.jar +0 -0
  18. data/lib/javax/activation/activation/1.1/activation-1.1.jar +0 -0
  19. data/lib/javax/xml/bind/jaxb-api/2.2.2/jaxb-api-2.2.2.jar +0 -0
  20. data/lib/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar +0 -0
  21. data/lib/logstash-output-oss_jars.rb +52 -0
  22. data/lib/logstash/outputs/oss.rb +288 -0
  23. data/lib/logstash/outputs/oss/file_generator.rb +69 -0
  24. data/lib/logstash/outputs/oss/file_manager.rb +87 -0
  25. data/lib/logstash/outputs/oss/file_uploader.rb +69 -0
  26. data/lib/logstash/outputs/oss/gzip_file.rb +36 -0
  27. data/lib/logstash/outputs/oss/rotations/hybrid_rotation.rb +24 -0
  28. data/lib/logstash/outputs/oss/rotations/size_based_rotation.rb +25 -0
  29. data/lib/logstash/outputs/oss/rotations/time_based_rotation.rb +25 -0
  30. data/lib/logstash/outputs/oss/temporary_file.rb +59 -0
  31. data/lib/logstash/outputs/oss/version.rb +14 -0
  32. data/lib/org/apache/httpcomponents/httpclient/4.4.1/httpclient-4.4.1.jar +0 -0
  33. data/lib/org/apache/httpcomponents/httpcore/4.4.1/httpcore-4.4.1.jar +0 -0
  34. data/lib/org/codehaus/jackson/jackson-core-asl/1.8.3/jackson-core-asl-1.8.3.jar +0 -0
  35. data/lib/org/codehaus/jackson/jackson-jaxrs/1.8.3/jackson-jaxrs-1.8.3.jar +0 -0
  36. data/lib/org/codehaus/jackson/jackson-mapper-asl/1.8.3/jackson-mapper-asl-1.8.3.jar +0 -0
  37. data/lib/org/codehaus/jackson/jackson-xc/1.8.3/jackson-xc-1.8.3.jar +0 -0
  38. data/lib/org/codehaus/jettison/jettison/1.1/jettison-1.1.jar +0 -0
  39. data/lib/org/jdom/jdom/1.1/jdom-1.1.jar +0 -0
  40. data/lib/stax/stax-api/1.0.1/stax-api-1.0.1.jar +0 -0
  41. data/logstash-output-oss.gemspec +30 -0
  42. data/spec/integration/common.rb +42 -0
  43. data/spec/integration/encoding_spec.rb +92 -0
  44. data/spec/integration/oss_spec.rb +47 -0
  45. data/spec/integration/recover_spec.rb +43 -0
  46. data/spec/outputs/oss/generator_spec.rb +67 -0
  47. data/spec/outputs/oss/rotation_spec.rb +69 -0
  48. data/spec/outputs/oss_spec.rb +58 -0
  49. metadata +206 -0
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logstash/devutils/rspec/spec_helper'
4
+ require 'logstash/logging/logger'
5
+ require 'logstash/outputs/oss'
6
+ require 'stud/temporary'
7
+ java_import 'com.aliyun.oss.model.GetObjectRequest'
8
+
9
+ # This file contains the common logic used by integration tests
10
+ shared_context "plugin initialize" do
11
+ let(:endpoint) { ENV['OSS_ENDPOINT'] }
12
+ let(:bucket) { ENV['OSS_BUCKET'] }
13
+ let(:access_key_id) { ENV['OSS_ACCESS_KEY'] }
14
+ let(:access_key_secret) { ENV['OSS_SECRET_KEY'] }
15
+ let(:prefix) { "logstash" }
16
+ let(:temporary_directory) { Stud::Temporary.pathname }
17
+
18
+ let(:common_configurations) do
19
+ {
20
+ "endpoint" => endpoint,
21
+ "bucket" => bucket,
22
+ "access_key_id" => access_key_id,
23
+ "access_key_secret" => access_key_secret,
24
+ "prefix" => prefix,
25
+ "size_rotate" => 1024,
26
+ "time_rotate" => 60,
27
+ "temporary_directory" => temporary_directory,
28
+ }
29
+ end
30
+
31
+ LogStash::Logging::Logger::configure_logging("debug") if ENV["DEBUG"]
32
+
33
+ let(:oss) { OSSClientBuilder.new().build(endpoint, access_key_id, access_key_secret) }
34
+ subject { LogStash::Outputs::OSS.new(configurations) }
35
+ end
36
+
37
+ # remove object with `prefix`
38
+ def clean_bucket
39
+ oss.listObjects(bucket, prefix).getObjectSummaries().each do |objectSummary|
40
+ oss.deleteObject(bucket, objectSummary.getKey())
41
+ end
42
+ end
@@ -0,0 +1,92 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rspec'
4
+ require_relative 'common'
5
+
6
+ describe 'encoding integration tests', :integration => true do
7
+ include_context 'plugin initialize'
8
+
9
+ let(:number_of_events) { 500 }
10
+ let(:batch_size) { 125 }
11
+ let(:event_encoded) { "Hello world\n" }
12
+ let(:batch) do
13
+ b = {}
14
+ number_of_events.times do
15
+ event = LogStash::Event.new({ "message" => event_encoded, "host" => "localhost", "index" => 1 })
16
+ b[event] = "#{event_encoded}"
17
+ end
18
+ b
19
+ end
20
+
21
+ before do
22
+ subject.register
23
+
24
+ batch.each_slice(batch_size) do |smaller_batch|
25
+ subject.multi_receive_encoded(smaller_batch)
26
+ sleep(1)
27
+ end
28
+
29
+ subject.close
30
+ end
31
+
32
+ after do
33
+ clean_bucket
34
+ end
35
+
36
+ ################### gzip encoding integration test ###################
37
+ describe 'gzip encoding integration tests' do
38
+ let(:configurations) {
39
+ common_configurations.merge(
40
+ {
41
+ "encoding" => "gzip",
42
+ "rotation_strategy" => "time",
43
+ "time_rotate" => 0.01 # 0.01 * 60 = 0.6s
44
+ }
45
+ )
46
+ }
47
+
48
+ it 'compare file content(uncompressed) with original events' do
49
+ # read lines from oss bucket
50
+ copy_file_to_temporary_dir(temporary_directory)
51
+
52
+ expect(Dir.glob(File.join(temporary_directory, prefix, "*.gz")).inject(0) { |sum, f| sum + Zlib::GzipReader.new(File.open(f)).readlines.size }).to eq(number_of_events)
53
+ end
54
+
55
+ it 'creates multiples files' do
56
+ expect(oss.listObjects(bucket, prefix).getObjectSummaries().size).to be_between(3, 4)
57
+ end
58
+ end
59
+
60
+ ################### plain encoding integration test ###################
61
+ describe 'plain encoding integration test' do
62
+ let(:configurations) {
63
+ common_configurations.merge(
64
+ {
65
+ "encoding" => "none",
66
+ "rotation_strategy" => "time",
67
+ "time_rotate" => 0.01 # 0.01 * 60 = 0.6s
68
+ }
69
+ )
70
+ }
71
+
72
+ it 'compare file content with original events' do
73
+ # read lines from oss bucket
74
+ copy_file_to_temporary_dir(temporary_directory)
75
+
76
+ expect(Dir.glob(File.join(temporary_directory, prefix, "*.data")).inject(0) { |sum, f| sum + File.open(f).readlines.size }).to eq(number_of_events)
77
+ end
78
+
79
+ it 'creates multiples files' do
80
+ expect(oss.listObjects(bucket, prefix).getObjectSummaries().size).to be_between(3, 4)
81
+ end
82
+ end
83
+
84
+ def copy_file_to_temporary_dir(temporary_directory)
85
+ FileUtils.rm_rf(temporary_directory)
86
+ FileUtils.mkdir_p(File.join(temporary_directory, prefix))
87
+ oss.listObjects(bucket, prefix).getObjectSummaries().each do |objectSummary|
88
+ request = GetObjectRequest.new(bucket, objectSummary.getKey())
89
+ oss.getObject(request, java.io.File.new(File.join(temporary_directory, objectSummary.getKey())))
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rspec'
4
+ require_relative 'common'
5
+
6
+ describe 'integration tests', :integration => true do
7
+
8
+ include_context 'plugin initialize'
9
+
10
+ let(:number_of_events) { 400000 }
11
+ let(:batch_size) { 400 }
12
+ let(:event_encoded) { "Hello world\n" }
13
+ let(:batch) do
14
+ b = {}
15
+ number_of_events.times do
16
+ event = LogStash::Event.new({ "message" => event_encoded, "host" => "localhost", "index" => Random.rand(3) })
17
+ b[event] = "#{event_encoded}"
18
+ end
19
+ b
20
+ end
21
+
22
+ let(:configurations) {
23
+ common_configurations.merge(
24
+ {
25
+ "prefix" => "logstash/%{index}",
26
+ "size_rotate" => 13631488, # 13MB
27
+ "time_rotate" => 0.15 # 0.15 * 60 = 9s
28
+ }
29
+ )
30
+ }
31
+
32
+ before do
33
+ subject.register
34
+ end
35
+
36
+ after do
37
+ subject.close
38
+
39
+ clean_bucket
40
+ end
41
+
42
+ it 'integration stress tests' do
43
+ 100.times do
44
+ batch.each_slice(batch_size) { |smaller_batch| subject.multi_receive_encoded(smaller_batch) }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rspec'
4
+ require_relative 'common'
5
+
6
+ describe 'recover integration tests', :integration => true do
7
+
8
+ include_context 'plugin initialize'
9
+
10
+ let(:configurations) { common_configurations.merge({}) }
11
+
12
+ before do
13
+ clean_bucket
14
+ end
15
+
16
+ it 'recover files from temporary directory' do
17
+ generate_files(3)
18
+ expect(oss.listObjects(bucket, prefix).getObjectSummaries().size).to eq(3)
19
+ end
20
+
21
+ it 'recover files from empty temporary directory' do
22
+ generate_files(0)
23
+ expect(oss.listObjects(bucket, prefix).getObjectSummaries().size).to eq(0)
24
+ end
25
+
26
+ after do
27
+ clean_bucket
28
+ end
29
+
30
+ def generate_files(number_of_files)
31
+ # generate files in temporary directory
32
+ generator = LogStash::Outputs::OSS::FileGenerator.new(prefix, "gzip", temporary_directory)
33
+ number_of_files.times do
34
+ generator.current_file.write("Hello, world")
35
+ generator.current_file.close
36
+ generator.rotate
37
+ end
38
+
39
+ subject.register
40
+
41
+ subject.close
42
+ end
43
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rspec'
4
+ require "logstash/devutils/rspec/spec_helper"
5
+ require 'logstash/outputs/oss'
6
+ require 'logstash/logging/logger'
7
+
8
+ describe 'file generator unit tests' do
9
+
10
+ let (:temporary_directory) { Stud::Temporary.pathname }
11
+ let (:prefix) { "logstash" }
12
+
13
+ describe 'gzip encoding generator' do
14
+
15
+ it 'gzip' do
16
+ generator = LogStash::Outputs::OSS::FileGenerator.new(prefix, "gzip", temporary_directory)
17
+
18
+ # part-0, ends with part-0.gz
19
+ elements = generator.current_file.path.to_s.split(::File::SEPARATOR)
20
+ file_name = elements.at(elements.size - 1)
21
+ expect(file_name.match(/ls.oss.*.part-0.gz/).to_s).to eq(file_name)
22
+
23
+ generator.rotate
24
+
25
+ # part-1, ends with part-1.gz
26
+ generator.current_file
27
+ elements = generator.current_file.path.to_s.split(::File::SEPARATOR)
28
+ file_name = elements.at(elements.size - 1)
29
+ expect(file_name.match(/ls.oss.*.part-1.gz/).to_s).to eq(file_name)
30
+
31
+ generator.rotate
32
+
33
+ # part-2, ends with part-2.gz
34
+ generator.current_file
35
+ elements = generator.current_file.path.to_s.split(::File::SEPARATOR)
36
+ file_name = elements.at(elements.size - 1)
37
+ expect(file_name.match(/ls.oss.*.part-2.gz/).to_s).to eq(file_name)
38
+ end
39
+ end
40
+
41
+ describe 'plain encoding generator' do
42
+
43
+ it 'plain' do
44
+ generator = LogStash::Outputs::OSS::FileGenerator.new(prefix, "none", temporary_directory)
45
+ # part-0, ends with part-0.data
46
+ elements = generator.current_file.path.to_s.split(::File::SEPARATOR)
47
+ file_name = elements.at(elements.size - 1)
48
+ expect(file_name.match(/ls.oss.*.part-0.data/).to_s).to eq(file_name)
49
+
50
+ generator.rotate
51
+
52
+ # part-1, ends with part-1.data
53
+ generator.current_file
54
+ elements = generator.current_file.path.to_s.split(::File::SEPARATOR)
55
+ file_name = elements.at(elements.size - 1)
56
+ expect(file_name.match(/ls.oss.*.part-1.data/).to_s).to eq(file_name)
57
+
58
+ generator.rotate
59
+
60
+ # part-2, ends with part-2.data
61
+ generator.current_file
62
+ elements = generator.current_file.path.to_s.split(::File::SEPARATOR)
63
+ file_name = elements.at(elements.size - 1)
64
+ expect(file_name.match(/ls.oss.*.part-2.data/).to_s).to eq(file_name)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rspec'
4
+ require 'logstash/devutils/rspec/spec_helper'
5
+ require 'logstash/logging/logger'
6
+ require 'logstash/outputs/oss'
7
+
8
+ describe 'rotation unit tests' do
9
+
10
+ let (:temporary_directory) { Stud::Temporary.pathname }
11
+ let (:prefix) { "logstash" }
12
+ let (:encoding) { "none" }
13
+ let(:event) { "Hello world\n" }
14
+
15
+ it 'size based rotation unit tests' do
16
+ size_based_rotation = LogStash::Outputs::OSS::SizeBasedRotation.new(1024)
17
+ expect(size_based_rotation.needs_periodic_check?).to be(false)
18
+
19
+ generator = LogStash::Outputs::OSS::FileGenerator.new(prefix, encoding, temporary_directory)
20
+
21
+ generator.current_file.write(event)
22
+ expect(size_based_rotation.rotate?(generator.current_file)).to be(false)
23
+
24
+ 1024.times do
25
+ generator.current_file.write(event)
26
+ end
27
+
28
+ expect(size_based_rotation.rotate?(generator.current_file)).to be(true)
29
+
30
+ generator.current_file.write(event)
31
+
32
+ expect(size_based_rotation.rotate?(generator.current_file)).to be(true)
33
+ end
34
+
35
+ it 'time based rotation unit tests' do
36
+ time_based_rotation = LogStash::Outputs::OSS::TimeBasedRotation.new(0.05)
37
+ expect(time_based_rotation.needs_periodic_check?).to be(true)
38
+
39
+ generator = LogStash::Outputs::OSS::FileGenerator.new(prefix, encoding, temporary_directory)
40
+
41
+ generator.current_file.write(event)
42
+ expect(time_based_rotation.rotate?(generator.current_file)).to be(false)
43
+
44
+ sleep(1)
45
+
46
+ expect(time_based_rotation.rotate?(generator.current_file)).to be(false)
47
+
48
+ sleep(2)
49
+
50
+ expect(time_based_rotation.rotate?(generator.current_file)).to be(true)
51
+ end
52
+
53
+ it 'hybrid rotation unit tests' do
54
+ hybrid_rotation = LogStash::Outputs::OSS::HybridRotation.new(1024, 0.05)
55
+ expect(hybrid_rotation.needs_periodic_check?).to be(true)
56
+
57
+ generator = LogStash::Outputs::OSS::FileGenerator.new(prefix, encoding, temporary_directory)
58
+
59
+ generator.current_file.write(event)
60
+
61
+ expect(hybrid_rotation.rotate?(generator.current_file)).to be(false)
62
+
63
+ 1024.times do
64
+ generator.current_file.write(event)
65
+ end
66
+
67
+ expect(hybrid_rotation.rotate?(generator.current_file)).to be(true)
68
+ end
69
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
3
+ require "logstash/outputs/oss"
4
+ require "logstash/codecs/plain"
5
+ require "logstash/event"
6
+
7
+ describe LogStash::Outputs::OSS do
8
+ let(:options) {
9
+ {
10
+ "endpoint" => "oss-cn-zhangjiakou.aliyuncs.com",
11
+ "bucket" => "bucket",
12
+ "prefix" => "logstash/%{index}",
13
+ "recover" => true,
14
+ "access_key_id" => "access_key_id",
15
+ "access_key_secret" => "access_key_secret",
16
+ "encoding" => "none"
17
+ }
18
+ }
19
+
20
+ describe 'invalid configurations' do
21
+ it 'validate rotate' do
22
+ oss = described_class.new(options.merge({ "size_rotate" => -1, "time_rotate" => -1 }))
23
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
24
+
25
+ oss = described_class.new(options.merge({ "size_rotate" => -1 }))
26
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
27
+
28
+ oss = described_class.new(options.merge({ "time_rotate" => -1 }))
29
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
30
+ end
31
+
32
+
33
+ it 'validate upload configurations' do
34
+ oss = described_class.new(options.merge({ "upload_workers_count" => -1, "upload_queue_size" => -1 }))
35
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
36
+
37
+ oss = described_class.new(options.merge({ "upload_workers_count" => -1 }))
38
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
39
+
40
+ oss = described_class.new(options.merge({ "upload_queue_size" => -1 }))
41
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
42
+ end
43
+
44
+ it 'validate invalid temporary directory' do
45
+ dir = 'a_' + Time.now.to_i.to_s
46
+ file_name = dir + '/1.gz'
47
+ system('mkdir -p ' + dir + ' && touch ' + file_name)
48
+ oss = described_class.new(options.merge({ "temporary_directory" => file_name }))
49
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
50
+ system('rm -rf ' + dir)
51
+ end
52
+
53
+ it 'validate invalid additional oss configurations' do
54
+ oss = described_class.new(options.merge({ "additional_oss_settings" => { "max_connections_to_oss" => -1} }))
55
+ expect { oss.register }.to raise_error(LogStash::ConfigurationError)
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logstash-output-oss
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: java
6
+ authors:
7
+ - jinhu.wu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ name: logstash-core-plugin-api
20
+ prerelease: false
21
+ type: :runtime
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ name: logstash-codec-plain
34
+ prerelease: false
35
+ type: :runtime
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.0'
47
+ name: concurrent-ruby
48
+ prerelease: false
49
+ type: :runtime
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.3'
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 2.3.9
64
+ name: uuid
65
+ prerelease: false
66
+ type: :runtime
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '2.3'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.3.9
75
+ - !ruby/object:Gem::Dependency
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1.3'
81
+ name: logstash-devutils
82
+ prerelease: false
83
+ type: :development
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.3'
89
+ - !ruby/object:Gem::Dependency
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.0'
95
+ name: logstash-codec-line
96
+ prerelease: false
97
+ type: :development
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ - !ruby/object:Gem::Dependency
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '0.3'
109
+ name: jar-dependencies
110
+ prerelease: false
111
+ type: :runtime
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.3'
117
+ description: This gem is a Logstash plugin required to be installed on top of the
118
+ Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gem-name. This
119
+ gem is not a stand-alone program
120
+ email: jinhu.wu.nju@gmail.com
121
+ executables: []
122
+ extensions: []
123
+ extra_rdoc_files: []
124
+ files:
125
+ - CHANGELOG.md
126
+ - CONTRIBUTORS
127
+ - DEVELOPER.md
128
+ - Gemfile
129
+ - LICENSE
130
+ - README.md
131
+ - lib/com/aliyun/aliyun-java-sdk-core/3.4.0/aliyun-java-sdk-core-3.4.0.jar
132
+ - lib/com/aliyun/aliyun-java-sdk-ecs/4.2.0/aliyun-java-sdk-ecs-4.2.0.jar
133
+ - lib/com/aliyun/aliyun-java-sdk-ram/3.0.0/aliyun-java-sdk-ram-3.0.0.jar
134
+ - lib/com/aliyun/aliyun-java-sdk-sts/3.0.0/aliyun-java-sdk-sts-3.0.0.jar
135
+ - lib/com/aliyun/oss/aliyun-sdk-oss/3.4.0/aliyun-sdk-oss-3.4.0.jar
136
+ - lib/com/sun/jersey/jersey-core/1.9/jersey-core-1.9.jar
137
+ - lib/com/sun/jersey/jersey-json/1.9/jersey-json-1.9.jar
138
+ - lib/com/sun/xml/bind/jaxb-impl/2.2.3-1/jaxb-impl-2.2.3-1.jar
139
+ - lib/commons-codec/commons-codec/1.9/commons-codec-1.9.jar
140
+ - lib/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
141
+ - lib/javax/activation/activation/1.1/activation-1.1.jar
142
+ - lib/javax/xml/bind/jaxb-api/2.2.2/jaxb-api-2.2.2.jar
143
+ - lib/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar
144
+ - lib/logstash-output-oss_jars.rb
145
+ - lib/logstash/outputs/oss.rb
146
+ - lib/logstash/outputs/oss/file_generator.rb
147
+ - lib/logstash/outputs/oss/file_manager.rb
148
+ - lib/logstash/outputs/oss/file_uploader.rb
149
+ - lib/logstash/outputs/oss/gzip_file.rb
150
+ - lib/logstash/outputs/oss/rotations/hybrid_rotation.rb
151
+ - lib/logstash/outputs/oss/rotations/size_based_rotation.rb
152
+ - lib/logstash/outputs/oss/rotations/time_based_rotation.rb
153
+ - lib/logstash/outputs/oss/temporary_file.rb
154
+ - lib/logstash/outputs/oss/version.rb
155
+ - lib/org/apache/httpcomponents/httpclient/4.4.1/httpclient-4.4.1.jar
156
+ - lib/org/apache/httpcomponents/httpcore/4.4.1/httpcore-4.4.1.jar
157
+ - lib/org/codehaus/jackson/jackson-core-asl/1.8.3/jackson-core-asl-1.8.3.jar
158
+ - lib/org/codehaus/jackson/jackson-jaxrs/1.8.3/jackson-jaxrs-1.8.3.jar
159
+ - lib/org/codehaus/jackson/jackson-mapper-asl/1.8.3/jackson-mapper-asl-1.8.3.jar
160
+ - lib/org/codehaus/jackson/jackson-xc/1.8.3/jackson-xc-1.8.3.jar
161
+ - lib/org/codehaus/jettison/jettison/1.1/jettison-1.1.jar
162
+ - lib/org/jdom/jdom/1.1/jdom-1.1.jar
163
+ - lib/stax/stax-api/1.0.1/stax-api-1.0.1.jar
164
+ - logstash-output-oss.gemspec
165
+ - spec/integration/common.rb
166
+ - spec/integration/encoding_spec.rb
167
+ - spec/integration/oss_spec.rb
168
+ - spec/integration/recover_spec.rb
169
+ - spec/outputs/oss/generator_spec.rb
170
+ - spec/outputs/oss/rotation_spec.rb
171
+ - spec/outputs/oss_spec.rb
172
+ homepage: http://www.elastic.co/guide/en/logstash/current/index.html
173
+ licenses:
174
+ - Apache-2.0
175
+ metadata:
176
+ logstash_plugin: 'true'
177
+ logstash_group: output
178
+ post_install_message:
179
+ rdoc_options: []
180
+ require_paths:
181
+ - lib
182
+ required_ruby_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ requirements:
193
+ - jar com.aliyun.oss:aliyun-sdk-oss, 3.4.0
194
+ rubyforge_project:
195
+ rubygems_version: 2.7.6
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Sends Logstash events to the Aliyun Object Storage Service
199
+ test_files:
200
+ - spec/integration/common.rb
201
+ - spec/integration/encoding_spec.rb
202
+ - spec/integration/oss_spec.rb
203
+ - spec/integration/recover_spec.rb
204
+ - spec/outputs/oss/generator_spec.rb
205
+ - spec/outputs/oss/rotation_spec.rb
206
+ - spec/outputs/oss_spec.rb