logstash-output-google_cloud_storage 4.0.0-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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +77 -0
- data/CONTRIBUTORS +18 -0
- data/Gemfile +11 -0
- data/LICENSE +13 -0
- data/NOTICE.TXT +5 -0
- data/README.md +100 -0
- data/docs/index.asciidoc +305 -0
- data/lib/logstash-output-google_cloud_storage_jars.rb +35 -0
- data/lib/logstash/outputs/gcs/client.rb +88 -0
- data/lib/logstash/outputs/gcs/log_rotate.rb +77 -0
- data/lib/logstash/outputs/gcs/path_factory.rb +119 -0
- data/lib/logstash/outputs/gcs/temp_log_file.rb +111 -0
- data/lib/logstash/outputs/gcs/worker_pool.rb +47 -0
- data/lib/logstash/outputs/google_cloud_storage.rb +276 -0
- data/logstash-output-google_cloud_storage.gemspec +33 -0
- data/spec/fixtures/credentials.json +8 -0
- data/spec/outputs/gcs/client_spec.rb +18 -0
- data/spec/outputs/gcs/log_rotate_spec.rb +129 -0
- data/spec/outputs/gcs/path_factory_spec.rb +189 -0
- data/spec/outputs/gcs/temp_log_file_spec.rb +155 -0
- data/spec/outputs/gcs/worker_pool_spec.rb +29 -0
- data/spec/outputs/google_cloud_storage_spec.rb +23 -0
- data/spec/spec_helper.rb +3 -0
- data/vendor/jar-dependencies/com/fasterxml/jackson/core/jackson-core/2.9.6/jackson-core-2.9.6.jar +0 -0
- data/vendor/jar-dependencies/com/google/api-client/google-api-client/1.23.0/google-api-client-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api-client/google-api-client/1.24.1/google-api-client-1.24.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/api-client/google-api-client/1.27.0/google-api-client-1.27.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/api-common/1.5.0/api-common-1.5.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/api-common/1.7.0/api-common-1.7.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/gax-httpjson/0.40.0/gax-httpjson-0.40.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/gax-httpjson/0.47.0/gax-httpjson-0.47.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/gax-httpjson/0.59.0/gax-httpjson-0.59.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/gax/1.23.0/gax-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/gax/1.30.0/gax-1.30.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/gax/1.42.0/gax-1.42.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/grpc/proto-google-common-protos/1.12.0/proto-google-common-protos-1.12.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/grpc/proto-google-common-protos/1.14.0/proto-google-common-protos-1.14.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/grpc/proto-google-common-protos/1.7.0/proto-google-common-protos-1.7.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/grpc/proto-google-iam-v1/0.12.0/proto-google-iam-v1-0.12.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/api/grpc/proto-google-iam-v1/0.8.0/proto-google-iam-v1-0.8.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/apis/google-api-services-storage/v1-rev114-1.23.0/google-api-services-storage-v1-rev114-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/apis/google-api-services-storage/v1-rev135-1.24.1/google-api-services-storage-v1-rev135-1.24.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/apis/google-api-services-storage/v1-rev20181109-1.27.0/google-api-services-storage-v1-rev20181109-1.27.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/auth/google-auth-library-credentials/0.10.0/google-auth-library-credentials-0.10.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/auth/google-auth-library-credentials/0.13.0/google-auth-library-credentials-0.13.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/auth/google-auth-library-credentials/0.9.0/google-auth-library-credentials-0.9.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/auth/google-auth-library-oauth2-http/0.10.0/google-auth-library-oauth2-http-0.10.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/auth/google-auth-library-oauth2-http/0.13.0/google-auth-library-oauth2-http-0.13.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/auth/google-auth-library-oauth2-http/0.9.0/google-auth-library-oauth2-http-0.9.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-core-http/1.25.0/google-cloud-core-http-1.25.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-core-http/1.39.0/google-cloud-core-http-1.39.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-core-http/1.65.0/google-cloud-core-http-1.65.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-core/1.25.0/google-cloud-core-1.25.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-core/1.39.0/google-cloud-core-1.39.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-core/1.65.0/google-cloud-core-1.65.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-storage/1.25.0/google-cloud-storage-1.25.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-storage/1.39.0/google-cloud-storage-1.39.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/cloud/google-cloud-storage/1.65.0/google-cloud-storage-1.65.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar +0 -0
- data/vendor/jar-dependencies/com/google/code/gson/gson/2.7/gson-2.7.jar +0 -0
- data/vendor/jar-dependencies/com/google/errorprone/error_prone_annotations/2.1.3/error_prone_annotations-2.1.3.jar +0 -0
- data/vendor/jar-dependencies/com/google/errorprone/error_prone_annotations/2.2.0/error_prone_annotations-2.2.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/guava/guava-jdk5/17.0/guava-jdk5-17.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/guava/guava/20.0/guava-20.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/guava/guava/26.0-android/guava-26.0-android.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-apache/2.0.0/google-http-client-apache-2.0.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-appengine/1.23.0/google-http-client-appengine-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-appengine/1.24.1/google-http-client-appengine-1.24.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-appengine/1.28.0/google-http-client-appengine-1.28.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson/1.23.0/google-http-client-jackson-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson/1.24.1/google-http-client-jackson-1.24.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson2/1.23.0/google-http-client-jackson2-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson2/1.24.1/google-http-client-jackson2-1.24.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client-jackson2/1.28.0/google-http-client-jackson2-1.28.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client/1.23.0/google-http-client-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client/1.24.1/google-http-client-1.24.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/http-client/google-http-client/1.28.0/google-http-client-1.28.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/j2objc/j2objc-annotations/1.1/j2objc-annotations-1.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/oauth-client/google-oauth-client/1.23.0/google-oauth-client-1.23.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/oauth-client/google-oauth-client/1.24.1/google-oauth-client-1.24.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/oauth-client/google-oauth-client/1.27.0/google-oauth-client-1.27.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/protobuf/protobuf-java-util/3.5.1/protobuf-java-util-3.5.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/protobuf/protobuf-java-util/3.6.0/protobuf-java-util-3.6.0.jar +0 -0
- data/vendor/jar-dependencies/com/google/protobuf/protobuf-java/3.5.1/protobuf-java-3.5.1.jar +0 -0
- data/vendor/jar-dependencies/com/google/protobuf/protobuf-java/3.6.0/protobuf-java-3.6.0.jar +0 -0
- data/vendor/jar-dependencies/commons-codec/commons-codec/1.3/commons-codec-1.3.jar +0 -0
- data/vendor/jar-dependencies/commons-codec/commons-codec/1.9/commons-codec-1.9.jar +0 -0
- data/vendor/jar-dependencies/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar +0 -0
- data/vendor/jar-dependencies/commons-logging/commons-logging/1.2/commons-logging-1.2.jar +0 -0
- data/vendor/jar-dependencies/io/grpc/grpc-context/1.12.0/grpc-context-1.12.0.jar +0 -0
- data/vendor/jar-dependencies/io/grpc/grpc-context/1.9.0/grpc-context-1.9.0.jar +0 -0
- data/vendor/jar-dependencies/io/opencensus/opencensus-api/0.11.1/opencensus-api-0.11.1.jar +0 -0
- data/vendor/jar-dependencies/io/opencensus/opencensus-api/0.15.0/opencensus-api-0.15.0.jar +0 -0
- data/vendor/jar-dependencies/io/opencensus/opencensus-contrib-http-util/0.11.1/opencensus-contrib-http-util-0.11.1.jar +0 -0
- data/vendor/jar-dependencies/io/opencensus/opencensus-contrib-http-util/0.15.0/opencensus-contrib-http-util-0.15.0.jar +0 -0
- data/vendor/jar-dependencies/joda-time/joda-time/2.9.2/joda-time-2.9.2.jar +0 -0
- data/vendor/jar-dependencies/org/apache/httpcomponents/httpclient/4.0.1/httpclient-4.0.1.jar +0 -0
- data/vendor/jar-dependencies/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3.jar +0 -0
- data/vendor/jar-dependencies/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar +0 -0
- data/vendor/jar-dependencies/org/apache/httpcomponents/httpcore/4.4.6/httpcore-4.4.6.jar +0 -0
- data/vendor/jar-dependencies/org/codehaus/jackson/jackson-core-asl/1.9.11/jackson-core-asl-1.9.11.jar +0 -0
- data/vendor/jar-dependencies/org/threeten/threetenbp/1.3.3/threetenbp-1.3.3.jar +0 -0
- metadata +249 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'logstash/outputs/gcs/path_factory'
|
|
3
|
+
|
|
4
|
+
describe LogStash::Outputs::Gcs::PathFactory do
|
|
5
|
+
describe '#initialize' do
|
|
6
|
+
it 'includes optional fields if requested' do
|
|
7
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
8
|
+
builder.set_directory 'path/to/directory'
|
|
9
|
+
builder.set_prefix 'prefix'
|
|
10
|
+
builder.set_include_host true
|
|
11
|
+
builder.set_date_pattern ''
|
|
12
|
+
builder.set_include_part true
|
|
13
|
+
builder.set_include_uuid true
|
|
14
|
+
builder.set_is_gzipped true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
vars = {
|
|
18
|
+
prefix: 'prefix',
|
|
19
|
+
host: 'hostname',
|
|
20
|
+
date: '2018-01-01',
|
|
21
|
+
uuid: '00000000-0000-0000-0000-000000000000',
|
|
22
|
+
partf: '333'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
expected = 'prefix_hostname_2018-01-01.part333.00000000-0000-0000-0000-000000000000.log.gz'
|
|
26
|
+
expected = File.join('path/to/directory', expected)
|
|
27
|
+
|
|
28
|
+
actual = pf.current_path(vars)
|
|
29
|
+
|
|
30
|
+
expect(actual).to eq(expected)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'excludes optional fields if not requested' do
|
|
34
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
35
|
+
builder.set_directory 'path/to/directory'
|
|
36
|
+
builder.set_prefix 'prefix'
|
|
37
|
+
builder.set_include_host false
|
|
38
|
+
builder.set_date_pattern ''
|
|
39
|
+
builder.set_include_part false
|
|
40
|
+
builder.set_include_uuid false
|
|
41
|
+
builder.set_is_gzipped false
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
vars = {
|
|
45
|
+
prefix: 'prefix',
|
|
46
|
+
host: 'hostname',
|
|
47
|
+
date: '2018-01-01',
|
|
48
|
+
uuid: '00000000-0000-0000-0000-000000000000',
|
|
49
|
+
partf: '333'
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
expected = 'prefix_2018-01-01.log'
|
|
53
|
+
expected = File.join('path/to/directory', expected)
|
|
54
|
+
|
|
55
|
+
actual = pf.current_path(vars)
|
|
56
|
+
|
|
57
|
+
expect(actual).to eq(expected)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'loads a path immediately' do
|
|
61
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
62
|
+
builder.set_directory ''
|
|
63
|
+
builder.set_prefix ''
|
|
64
|
+
builder.set_include_host false
|
|
65
|
+
builder.set_date_pattern ''
|
|
66
|
+
builder.set_include_part false
|
|
67
|
+
builder.set_include_uuid false
|
|
68
|
+
builder.set_is_gzipped false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
expect(pf.current_path).to_not eq(nil)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'recovers the starting part number' do
|
|
75
|
+
contents = ['pre_date.part009.log.gz', 'pre_date.part091.log.gz', 'pre_date.part000.log.gz']
|
|
76
|
+
|
|
77
|
+
allow(::File).to receive(:directory?).with('dir').and_return(true)
|
|
78
|
+
allow(Dir).to receive(:glob).and_return(contents)
|
|
79
|
+
|
|
80
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
81
|
+
builder.set_directory 'dir'
|
|
82
|
+
builder.set_prefix 'pre'
|
|
83
|
+
builder.set_include_host false
|
|
84
|
+
builder.set_date_pattern 'date'
|
|
85
|
+
builder.set_include_part true
|
|
86
|
+
builder.set_include_uuid false
|
|
87
|
+
builder.set_is_gzipped false
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
expect(pf.current_path).to include('part092')
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
describe 'rotate_path!' do
|
|
95
|
+
it 'increments the part number if the base has not changed' do
|
|
96
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
97
|
+
builder.set_directory 'dir'
|
|
98
|
+
builder.set_prefix 'pre'
|
|
99
|
+
builder.set_include_host false
|
|
100
|
+
builder.set_date_pattern 'date'
|
|
101
|
+
builder.set_include_part true
|
|
102
|
+
builder.set_include_uuid false
|
|
103
|
+
builder.set_is_gzipped false
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
expect(pf.current_path).to eq(File.join('dir', 'pre_date.part000.log'))
|
|
107
|
+
|
|
108
|
+
pf.rotate_path!
|
|
109
|
+
expect(pf.current_path).to eq(File.join('dir', 'pre_date.part001.log'))
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it 'resets the part number if the base has changed' do
|
|
113
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
114
|
+
builder.set_directory 'dir'
|
|
115
|
+
builder.set_prefix 'pre'
|
|
116
|
+
builder.set_include_host false
|
|
117
|
+
builder.set_date_pattern '%N'
|
|
118
|
+
builder.set_include_part true
|
|
119
|
+
builder.set_include_uuid false
|
|
120
|
+
builder.set_is_gzipped false
|
|
121
|
+
end
|
|
122
|
+
expect(pf.current_path).to include('part000')
|
|
123
|
+
|
|
124
|
+
pf.rotate_path!
|
|
125
|
+
expect(pf.current_path).to include('part000')
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it 'returns the path being rotated out' do
|
|
129
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
130
|
+
builder.set_directory 'dir'
|
|
131
|
+
builder.set_prefix 'pre'
|
|
132
|
+
builder.set_include_host false
|
|
133
|
+
builder.set_date_pattern 'date'
|
|
134
|
+
builder.set_include_part true
|
|
135
|
+
builder.set_include_uuid false
|
|
136
|
+
builder.set_is_gzipped false
|
|
137
|
+
end
|
|
138
|
+
last = pf.current_path
|
|
139
|
+
after = pf.rotate_path!
|
|
140
|
+
expect(after).to eq(last)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
describe 'should_rotate?' do
|
|
145
|
+
it 'returns false when the times in the bases are the same' do
|
|
146
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
147
|
+
builder.set_directory ''
|
|
148
|
+
builder.set_prefix ''
|
|
149
|
+
builder.set_include_host false
|
|
150
|
+
builder.set_date_pattern ''
|
|
151
|
+
builder.set_include_part false
|
|
152
|
+
builder.set_include_uuid false
|
|
153
|
+
builder.set_is_gzipped false
|
|
154
|
+
end
|
|
155
|
+
sleep 1.0
|
|
156
|
+
expect(pf.should_rotate?).to eq(false)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it 'returns true when the times in the bases are different' do
|
|
160
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
161
|
+
builder.set_directory ''
|
|
162
|
+
builder.set_prefix ''
|
|
163
|
+
builder.set_include_host false
|
|
164
|
+
builder.set_date_pattern '%N'
|
|
165
|
+
builder.set_include_part false
|
|
166
|
+
builder.set_include_uuid false
|
|
167
|
+
builder.set_is_gzipped false
|
|
168
|
+
end
|
|
169
|
+
sleep 1.0
|
|
170
|
+
expect(pf.should_rotate?).to eq(true)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
describe 'current_path' do
|
|
175
|
+
it 'joins the directory and filename' do
|
|
176
|
+
pf = LogStash::Outputs::Gcs::PathFactoryBuilder.build do |builder|
|
|
177
|
+
builder.set_directory 'dir'
|
|
178
|
+
builder.set_prefix 'pre'
|
|
179
|
+
builder.set_include_host false
|
|
180
|
+
builder.set_date_pattern 'date'
|
|
181
|
+
builder.set_include_part false
|
|
182
|
+
builder.set_include_uuid false
|
|
183
|
+
builder.set_is_gzipped false
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
expect(pf.current_path).to eq(File.join('dir', 'pre_date.log'))
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'logstash/outputs/gcs/temp_log_file'
|
|
3
|
+
require 'stud/temporary'
|
|
4
|
+
require 'zlib'
|
|
5
|
+
|
|
6
|
+
shared_examples 'a log file' do
|
|
7
|
+
describe '#initialize' do
|
|
8
|
+
it 'opens a file' do
|
|
9
|
+
expect{subject.fd}.to_not raise_error
|
|
10
|
+
expect(subject.fd).to_not be_nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'sets the path' do
|
|
14
|
+
expect{subject.path}.to_not raise_error
|
|
15
|
+
expect(subject.path).to_not be_nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'sets last sync' do
|
|
19
|
+
expect{subject.time_since_sync}.to_not raise_error
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe '#write' do
|
|
24
|
+
it 'writes the content' do
|
|
25
|
+
expect(subject.fd).to receive(:write).with('foo')
|
|
26
|
+
expect(subject.fd).to receive(:write).with("\n")
|
|
27
|
+
|
|
28
|
+
subject.write('foo', "\n")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'fails if the file is closed' do
|
|
32
|
+
subject.close!
|
|
33
|
+
|
|
34
|
+
expect{ subject.write('foo') }.to raise_error(IOError)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe '#fsync' do
|
|
39
|
+
it 'fails if the file is closed' do
|
|
40
|
+
subject.close!
|
|
41
|
+
|
|
42
|
+
expect{ subject.fsync }.to raise_error(IOError)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe '#close!' do
|
|
47
|
+
it 'fails if the file is closed' do
|
|
48
|
+
subject.close!
|
|
49
|
+
|
|
50
|
+
expect{ subject.close! }.to raise_error(IOError)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe '#size' do
|
|
55
|
+
it 'gets the size of the file on disk' do
|
|
56
|
+
subject.write('hello, world!')
|
|
57
|
+
subject.fsync
|
|
58
|
+
|
|
59
|
+
expect(subject.size).to eq(File.stat(subject.path).size)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'does not fail if the file is closed' do
|
|
63
|
+
subject.close!
|
|
64
|
+
|
|
65
|
+
expect{ subject.size }.to_not raise_error
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe '#time_since_sync' do
|
|
70
|
+
it 'returns a delta' do
|
|
71
|
+
expect(Time).to receive(:now).and_return(Time.at(30), Time.at(40), Time.at(50))
|
|
72
|
+
|
|
73
|
+
subject.fsync
|
|
74
|
+
|
|
75
|
+
expect(subject.time_since_sync).to eq(10)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe LogStash::Outputs::Gcs::PlainLogFile do
|
|
81
|
+
let(:tempdir) { Stud::Temporary.directory }
|
|
82
|
+
let(:path) { ::File.join(tempdir, 'logfile.log') }
|
|
83
|
+
subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, false, false) }
|
|
84
|
+
|
|
85
|
+
it_behaves_like 'a log file'
|
|
86
|
+
|
|
87
|
+
it 'creates a valid plain text file' do
|
|
88
|
+
subject.write('Hello, world!')
|
|
89
|
+
subject.close!
|
|
90
|
+
data = File.read(path)
|
|
91
|
+
|
|
92
|
+
expect(data).to eq('Hello, world!')
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe LogStash::Outputs::Gcs::GzipLogFile do
|
|
97
|
+
let(:tempdir) { Stud::Temporary.directory }
|
|
98
|
+
let(:path) { ::File.join(tempdir, 'logfile.log') }
|
|
99
|
+
subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, true, false) }
|
|
100
|
+
|
|
101
|
+
it_behaves_like 'a log file'
|
|
102
|
+
|
|
103
|
+
it 'creates a valid gzip' do
|
|
104
|
+
subject.write('Hello, world!')
|
|
105
|
+
subject.close!
|
|
106
|
+
|
|
107
|
+
Zlib::GzipReader.open(path) do |gz|
|
|
108
|
+
expect(gz.read).to eq('Hello, world!')
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
describe LogStash::Outputs::Gcs::SynchronizedLogFile do
|
|
114
|
+
let(:tempdir) { Stud::Temporary.directory }
|
|
115
|
+
let(:path) { ::File.join(tempdir, 'logfile.log') }
|
|
116
|
+
subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, false, true) }
|
|
117
|
+
|
|
118
|
+
it_behaves_like 'a log file'
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe 'gzip encoded file' do
|
|
122
|
+
let(:tempdir) { Stud::Temporary.directory }
|
|
123
|
+
let(:path) { ::File.join(tempdir, 'logfile.log') }
|
|
124
|
+
subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, false, false, true) }
|
|
125
|
+
|
|
126
|
+
it_behaves_like 'a log file'
|
|
127
|
+
|
|
128
|
+
it 'creates a valid gzip' do
|
|
129
|
+
subject.write('Hello, world!')
|
|
130
|
+
subject.close!
|
|
131
|
+
|
|
132
|
+
Zlib::GzipReader.open(path) do |gz|
|
|
133
|
+
expect(gz.read).to eq('Hello, world!')
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
describe 'double gzip encoded file' do
|
|
139
|
+
let(:tempdir) { Stud::Temporary.directory }
|
|
140
|
+
let(:path) { ::File.join(tempdir, 'logfile.log') }
|
|
141
|
+
subject { LogStash::Outputs::Gcs::LogFileFactory.create(path, true, false, true) }
|
|
142
|
+
|
|
143
|
+
it_behaves_like 'a log file'
|
|
144
|
+
|
|
145
|
+
it 'creates a valid double gzip' do
|
|
146
|
+
subject.write('Hello, world!')
|
|
147
|
+
subject.close!
|
|
148
|
+
|
|
149
|
+
Zlib::GzipReader.open(path) do |outer|
|
|
150
|
+
Zlib::GzipReader.new(outer) do |inner|
|
|
151
|
+
expect(inner.read).to eq('Hello, world!')
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'logstash/outputs/gcs/worker_pool'
|
|
3
|
+
|
|
4
|
+
describe LogStash::Outputs::Gcs::WorkerPool do
|
|
5
|
+
describe '#post' do
|
|
6
|
+
it 'runs the task in the same thread if synchronous' do
|
|
7
|
+
pool = LogStash::Outputs::Gcs::WorkerPool.new(5, true)
|
|
8
|
+
expect(pool.workers).to_not receive(:post)
|
|
9
|
+
|
|
10
|
+
pool.post { 1 + 2 }
|
|
11
|
+
pool.stop!
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'runs the task in a different thread if asynchronous' do
|
|
15
|
+
pool = LogStash::Outputs::Gcs::WorkerPool.new(5, false)
|
|
16
|
+
expect(pool.workers).to receive(:post)
|
|
17
|
+
|
|
18
|
+
pool.post { 1 + 2 }
|
|
19
|
+
pool.stop!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'raises an error if the pool is already stopped' do
|
|
23
|
+
pool = LogStash::Outputs::Gcs::WorkerPool.new(5, true)
|
|
24
|
+
pool.stop!
|
|
25
|
+
|
|
26
|
+
expect{ pool.post{} }.to raise_error(RuntimeError)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require_relative "../spec_helper"
|
|
3
|
+
require "tempfile"
|
|
4
|
+
|
|
5
|
+
describe LogStash::Outputs::GoogleCloudStorage do
|
|
6
|
+
|
|
7
|
+
let(:javaclient) { double("google-java-client") }
|
|
8
|
+
let(:javastorage) { double("google-java-client-storage") }
|
|
9
|
+
|
|
10
|
+
subject { described_class.new(config) }
|
|
11
|
+
let(:config) { {"bucket" => "", "uploader_interval_secs" => 0.1, "upload_synchronous" => true} }
|
|
12
|
+
|
|
13
|
+
before(:each) do
|
|
14
|
+
allow(LogStash::Outputs::Gcs::Client).to receive(:new).and_return(:javaclient)
|
|
15
|
+
allow(javaclient).to receive(:initialize_storage).and_return(:javastorage)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should register without errors" do
|
|
19
|
+
expect { subject.register }.to_not raise_error
|
|
20
|
+
|
|
21
|
+
subject.close
|
|
22
|
+
end
|
|
23
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/vendor/jar-dependencies/com/fasterxml/jackson/core/jackson-core/2.9.6/jackson-core-2.9.6.jar
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|