logstash-output-oss 0.1.1-java

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