fluent-plugin-azure-storage-append-blob-lts 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/publish.yaml +22 -23
- data/.github/workflows/test.yaml +16 -17
- data/Dockerfile +1 -1
- data/README.md +15 -0
- data/fluent-plugin-azure-storage-append-blob-lts.gemspec +2 -2
- data/lib/fluent/plugin/out_azure-storage-append-blob.rb +45 -2
- data/test/plugin/test_out_azure_storage_append_blob.rb +78 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e900def94ba82e3cb4e29b5ce37beed5b3801b951e5f68b1a1bc1e5a84ebfc1
|
4
|
+
data.tar.gz: 64780e024de8bb93023c7c42c5aff1d26ae461f51a769aae3ef74697fb607264
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7da2a55760e6221520198ccb54632892bfc3293d68bd78f0b088260f2d6ca2ff49b014caaff7427fa99de6731a52f642167be9df96e930323ffce7eb54d70e0
|
7
|
+
data.tar.gz: bc0cacd9e1bc4fb6a2e425a0556d8c9737fc2f35cd4530399bb3e95f62fa1b55804b118f4ec7550dadc549e29a3c7767eb2c61a3f7d84fca1bb24969084ea3dd
|
@@ -1,29 +1,28 @@
|
|
1
|
+
---
|
2
|
+
jobs:
|
3
|
+
build:
|
4
|
+
name: Build + Publish
|
5
|
+
runs-on: ubuntu-latest
|
6
|
+
steps:
|
7
|
+
- uses: actions/checkout@v3
|
8
|
+
- name: Set up Ruby
|
9
|
+
uses: actions/setup-ruby@v1
|
10
|
+
with:
|
11
|
+
ruby-version: "3.1"
|
12
|
+
- env:
|
13
|
+
RUBYGEMS_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
|
14
|
+
name: Publish to RubyGems
|
15
|
+
run: |
|
16
|
+
mkdir -p $HOME/.gem
|
17
|
+
touch $HOME/.gem/credentials
|
18
|
+
chmod 0600 $HOME/.gem/credentials
|
19
|
+
printf -- "---\n:rubygems_api_key: ${RUBYGEMS_API_KEY}\n" > $HOME/.gem/credentials
|
20
|
+
gem build *.gemspec
|
21
|
+
gem push *.gem --otp ${{ github.event.inputs.otp }}
|
1
22
|
name: Publish Ruby Gem
|
2
|
-
|
3
23
|
on:
|
4
24
|
workflow_dispatch:
|
5
25
|
inputs:
|
6
26
|
otp:
|
7
|
-
description:
|
27
|
+
description: "One Time Password"
|
8
28
|
required: true
|
9
|
-
|
10
|
-
jobs:
|
11
|
-
build:
|
12
|
-
name: Build + Publish
|
13
|
-
runs-on: ubuntu-latest
|
14
|
-
steps:
|
15
|
-
- uses: actions/checkout@v2
|
16
|
-
- name: Set up Ruby 2.6
|
17
|
-
uses: actions/setup-ruby@v1
|
18
|
-
with:
|
19
|
-
ruby-version: 2.6.x
|
20
|
-
- name: Publish to RubyGems
|
21
|
-
run: |
|
22
|
-
mkdir -p $HOME/.gem
|
23
|
-
touch $HOME/.gem/credentials
|
24
|
-
chmod 0600 $HOME/.gem/credentials
|
25
|
-
printf -- "---\n:rubygems_api_key: ${RUBYGEMS_API_KEY}\n" > $HOME/.gem/credentials
|
26
|
-
gem build *.gemspec
|
27
|
-
gem push *.gem --otp ${{ github.event.inputs.otp }}
|
28
|
-
env:
|
29
|
-
RUBYGEMS_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
|
data/.github/workflows/test.yaml
CHANGED
@@ -1,21 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
on:
|
4
|
-
push:
|
5
|
-
branches: [ master ]
|
6
|
-
pull_request:
|
7
|
-
branches: [ master ]
|
8
|
-
|
1
|
+
---
|
9
2
|
jobs:
|
10
3
|
test:
|
11
4
|
runs-on: ubuntu-latest
|
12
5
|
steps:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
6
|
+
- uses: actions/checkout@v3
|
7
|
+
- name: Set up Ruby
|
8
|
+
uses: ruby/setup-ruby@v1
|
9
|
+
with:
|
10
|
+
ruby-version: "3.1"
|
11
|
+
- name: Install dependencies
|
12
|
+
run: bundle install
|
13
|
+
- name: Run tests
|
14
|
+
run: bundle exec rake test
|
15
|
+
name: Test
|
16
|
+
on:
|
17
|
+
pull_request:
|
18
|
+
branches: [master]
|
19
|
+
push:
|
20
|
+
branches: [master]
|
data/Dockerfile
CHANGED
data/README.md
CHANGED
@@ -42,6 +42,7 @@ And then execute:
|
|
42
42
|
path logs/
|
43
43
|
azure_object_key_format %{path}%{time_slice}_%{index}.log
|
44
44
|
time_slice_format %Y%m%d-%H
|
45
|
+
compress false
|
45
46
|
compute_checksums true
|
46
47
|
# if you want to use %{tag} or %Y/%m/%d/ like syntax in path / azure_blob_name_format,
|
47
48
|
# need to specify tag for %{tag} and time for %Y/%m/%d in <buffer> argument.
|
@@ -147,6 +148,20 @@ The [fluent-mixin-config-placeholders](https://github.com/tagomoris/fluent-mixin
|
|
147
148
|
|
148
149
|
Format of the time used in the file name. Default is '%Y%m%d'. Use '%Y%m%d%H' to split files hourly.
|
149
150
|
|
151
|
+
### `compress`
|
152
|
+
|
153
|
+
Default: `false`
|
154
|
+
|
155
|
+
If `true`, compress (gzip) the file prior to uploading it.
|
156
|
+
|
157
|
+
Note: If desired, set `.gz` suffix via `azure_object_key_format`.
|
158
|
+
|
159
|
+
Example:
|
160
|
+
|
161
|
+
```
|
162
|
+
azure_object_key_format %{path}%{time_slice}-%{index}.log.gz
|
163
|
+
```
|
164
|
+
|
150
165
|
### `compute_checksums`
|
151
166
|
|
152
167
|
Default: `true`
|
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
5
|
spec.name = 'fluent-plugin-azure-storage-append-blob-lts'
|
6
|
-
spec.version = '0.
|
6
|
+
spec.version = '0.7.0'
|
7
7
|
spec.authors = ['Jonas-Taha El Sesiy']
|
8
8
|
spec.email = ['github@elsesiy.com']
|
9
9
|
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
20
|
spec.test_files = test_files
|
21
21
|
spec.require_paths = ['lib']
|
22
|
-
spec.required_ruby_version = '>=
|
22
|
+
spec.required_ruby_version = '>= 3.1'
|
23
23
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
25
25
|
spec.add_development_dependency 'rake', '~> 13.0'
|
@@ -8,6 +8,7 @@ require 'azure/storage/blob'
|
|
8
8
|
require 'faraday'
|
9
9
|
require 'fluent/plugin/output'
|
10
10
|
require 'json'
|
11
|
+
require 'zlib'
|
11
12
|
|
12
13
|
module Fluent
|
13
14
|
module Plugin
|
@@ -46,6 +47,7 @@ module Fluent
|
|
46
47
|
config_param :azure_object_key_format, :string, default: '%{path}%{time_slice}-%{index}.log'
|
47
48
|
config_param :auto_create_container, :bool, default: true
|
48
49
|
config_param :compute_checksums, :bool, default: true
|
50
|
+
config_param :compress, :bool, default: false
|
49
51
|
config_param :format, :string, default: DEFAULT_FORMAT_TYPE
|
50
52
|
config_param :time_slice_format, :string, default: '%Y%m%d'
|
51
53
|
config_param :localtime, :bool, default: false
|
@@ -124,7 +126,9 @@ module Fluent
|
|
124
126
|
|
125
127
|
def start
|
126
128
|
super
|
127
|
-
if @
|
129
|
+
if @bs
|
130
|
+
# nop
|
131
|
+
elsif @use_msi
|
128
132
|
token_credential = Azure::Storage::Common::Core::TokenCredential.new get_access_token
|
129
133
|
token_signer = Azure::Storage::Common::Core::Auth::TokenSigner.new token_credential
|
130
134
|
@bs = Azure::Storage::Blob::BlobService.new(
|
@@ -171,10 +175,49 @@ module Fluent
|
|
171
175
|
@formatter.format(tag, time, r)
|
172
176
|
end
|
173
177
|
|
178
|
+
def write_compress(chunk, tmp)
|
179
|
+
tmp.binmode
|
180
|
+
write_compress_helper(chunk, tmp)
|
181
|
+
tmp.rewind
|
182
|
+
end
|
183
|
+
|
184
|
+
# ref: https://github.com/fluent/fluent-plugin-s3/blob/master/lib/fluent/plugin/s3_compressor_gzip_command.rb
|
185
|
+
def write_compress_helper(chunk, tmp)
|
186
|
+
chunk_is_file = @buffer_type == 'file'
|
187
|
+
path = if chunk_is_file
|
188
|
+
chunk.path
|
189
|
+
else
|
190
|
+
w = Tempfile.new("chunk-gzip-tmp")
|
191
|
+
w.binmode
|
192
|
+
chunk.write_to(w)
|
193
|
+
w.close
|
194
|
+
w.path
|
195
|
+
end
|
196
|
+
|
197
|
+
res = system "gzip -c #{path} > #{tmp.path}"
|
198
|
+
unless res
|
199
|
+
log.warn "failed to execute gzip command. Fallback to GzipWriter. status = #{$?}"
|
200
|
+
begin
|
201
|
+
tmp.truncate(0)
|
202
|
+
gw = Zlib::GzipWriter.new(tmp)
|
203
|
+
chunk.write_to(gw)
|
204
|
+
gw.close
|
205
|
+
ensure
|
206
|
+
gw.close rescue nil
|
207
|
+
end
|
208
|
+
end
|
209
|
+
ensure
|
210
|
+
w.close(true) rescue nil
|
211
|
+
end
|
212
|
+
|
174
213
|
def write(chunk)
|
175
214
|
tmp = Tempfile.new('azure-')
|
176
215
|
begin
|
177
|
-
|
216
|
+
if @compress
|
217
|
+
write_compress(chunk, tmp)
|
218
|
+
else
|
219
|
+
chunk.write_to(tmp)
|
220
|
+
end
|
178
221
|
|
179
222
|
generate_log_name(chunk, @current_index)
|
180
223
|
if @last_azure_storage_path != @azure_storage_path
|
@@ -2,6 +2,8 @@ require 'helper'
|
|
2
2
|
require 'fluent/plugin/out_azure-storage-append-blob.rb'
|
3
3
|
require 'azure/core/http/http_response'
|
4
4
|
require 'azure/core/http/http_error'
|
5
|
+
require 'stringio'
|
6
|
+
require 'zlib'
|
5
7
|
|
6
8
|
include Fluent::Test::Helpers
|
7
9
|
|
@@ -140,6 +142,18 @@ class AzureStorageAppendBlobOutTest < Test::Unit::TestCase
|
|
140
142
|
end
|
141
143
|
end
|
142
144
|
|
145
|
+
sub_test_case 'compress options' do
|
146
|
+
test 'compress default value' do
|
147
|
+
d = create_driver
|
148
|
+
assert_equal false, d.instance.instance_variable_get(:@compress)
|
149
|
+
end
|
150
|
+
test 'compress set true' do
|
151
|
+
config = CONFIG.clone + "\ncompress true\n"
|
152
|
+
d = create_driver conf: config
|
153
|
+
assert_equal true, d.instance.instance_variable_get(:@compress)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
143
157
|
# This class is used to create an Azure::Core::Http::HTTPError. HTTPError parses
|
144
158
|
# a response object when it is created.
|
145
159
|
class FakeResponse
|
@@ -152,6 +166,70 @@ class AzureStorageAppendBlobOutTest < Test::Unit::TestCase
|
|
152
166
|
attr_reader :status, :body, :headers
|
153
167
|
end
|
154
168
|
|
169
|
+
def uncompress_blocks(blocks)
|
170
|
+
gzip_data = blocks.join
|
171
|
+
uncompressed_data = ""
|
172
|
+
while gzip_data do
|
173
|
+
Zlib::GzipReader.wrap(StringIO.new(gzip_data.b)) do |gz|
|
174
|
+
uncompressed_data << gz.read
|
175
|
+
gzip_data = gz.unused
|
176
|
+
end
|
177
|
+
end
|
178
|
+
uncompressed_data
|
179
|
+
end
|
180
|
+
|
181
|
+
sub_test_case 'test append blob for compress' do
|
182
|
+
test 'compress 2 events 1 chunk' do
|
183
|
+
config = CONFIG.clone + %(
|
184
|
+
compress true
|
185
|
+
<buffer time>
|
186
|
+
timekey 5
|
187
|
+
timekey_wait 0
|
188
|
+
</buffer>
|
189
|
+
)
|
190
|
+
|
191
|
+
svc = FakeBlobService.new(200)
|
192
|
+
d = create_driver conf:config, service: svc
|
193
|
+
|
194
|
+
d.run(default_tag: 'test') do
|
195
|
+
d.feed(event_time("2011-01-02 13:14:15 UTC"), { :a => 1 })
|
196
|
+
d.feed(event_time("2011-01-02 13:14:15 UTC"), { :a => 2 })
|
197
|
+
end
|
198
|
+
|
199
|
+
uncompressed_data = uncompress_blocks(svc.blocks)
|
200
|
+
|
201
|
+
expected = "2011-01-02T13:14:15+00:00\ttest\t{\"a\":1}\n" +
|
202
|
+
"2011-01-02T13:14:15+00:00\ttest\t{\"a\":2}\n"
|
203
|
+
assert_equal(expected, uncompressed_data)
|
204
|
+
assert_equal(10, svc.blocks.size)
|
205
|
+
end
|
206
|
+
|
207
|
+
test 'compress 2 events 2 chunk' do
|
208
|
+
config = CONFIG.clone + %(
|
209
|
+
compress true
|
210
|
+
<buffer time>
|
211
|
+
timekey 5
|
212
|
+
timekey_wait 0
|
213
|
+
</buffer>
|
214
|
+
)
|
215
|
+
|
216
|
+
svc = FakeBlobService.new(200)
|
217
|
+
d = create_driver conf:config, service: svc
|
218
|
+
|
219
|
+
d.run(default_tag: 'test') do
|
220
|
+
d.feed(event_time("2011-01-02 13:14:00 UTC"), { :a => 1 })
|
221
|
+
d.feed(event_time("2011-01-02 13:14:15 UTC"), { :a => 2 }) # after 15 sec
|
222
|
+
end
|
223
|
+
|
224
|
+
uncompressed_data = uncompress_blocks(svc.blocks)
|
225
|
+
|
226
|
+
expected = "2011-01-02T13:14:00+00:00\ttest\t{\"a\":1}\n" +
|
227
|
+
"2011-01-02T13:14:15+00:00\ttest\t{\"a\":2}\n"
|
228
|
+
assert_equal(expected, uncompressed_data)
|
229
|
+
assert_equal(20, svc.blocks.size)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
155
233
|
# This class is used to test plugin functions which interact with the blob service
|
156
234
|
class FakeBlobService
|
157
235
|
def initialize(status)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-azure-storage-append-blob-lts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas-Taha El Sesiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -120,14 +120,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
120
120
|
requirements:
|
121
121
|
- - ">="
|
122
122
|
- !ruby/object:Gem::Version
|
123
|
-
version: '
|
123
|
+
version: '3.1'
|
124
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
125
|
requirements:
|
126
126
|
- - ">="
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
129
|
requirements: []
|
130
|
-
rubygems_version: 3.
|
130
|
+
rubygems_version: 3.3.26
|
131
131
|
signing_key:
|
132
132
|
specification_version: 4
|
133
133
|
summary: Azure Storage Append Blob output plugin for Fluentd event collector
|