fluent-plugin-gcloud-pubsub-custom-subscriber 1.3.1
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/.gitignore +11 -0
- data/.travis.yml +25 -0
- data/CHANGELOG.md +134 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +178 -0
- data/Rakefile +12 -0
- data/fluent-plugin-gcloud-pubsub-custom.gemspec +24 -0
- data/lib/fluent/plugin/gcloud_pubsub/client.rb +80 -0
- data/lib/fluent/plugin/in_gcloud_pubsub.rb +253 -0
- data/lib/fluent/plugin/out_gcloud_pubsub.rb +110 -0
- data/test/plugin/test_in_gcloud_pubsub.rb +387 -0
- data/test/plugin/test_out_gcloud_pubsub.rb +226 -0
- data/test/test_helper.rb +31 -0
- metadata +148 -0
@@ -0,0 +1,226 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require_relative "../test_helper"
|
3
|
+
require "fluent/test/driver/output"
|
4
|
+
require "fluent/test/helpers"
|
5
|
+
|
6
|
+
class GcloudPubSubOutputTest < Test::Unit::TestCase
|
7
|
+
include Fluent::Test::Helpers
|
8
|
+
|
9
|
+
CONFIG = %[
|
10
|
+
project project-test
|
11
|
+
topic topic-test
|
12
|
+
key key-test
|
13
|
+
]
|
14
|
+
|
15
|
+
ReRaisedError = Class.new(RuntimeError)
|
16
|
+
|
17
|
+
def create_driver(conf = CONFIG)
|
18
|
+
Fluent::Test::Driver::Output.new(Fluent::Plugin::GcloudPubSubOutput).configure(conf)
|
19
|
+
end
|
20
|
+
|
21
|
+
setup do
|
22
|
+
Fluent::Test.setup
|
23
|
+
end
|
24
|
+
|
25
|
+
setup do
|
26
|
+
@time = event_time('2016-07-09 11:12:13 UTC')
|
27
|
+
end
|
28
|
+
|
29
|
+
sub_test_case 'configure' do
|
30
|
+
test 'default values are configured' do
|
31
|
+
d = create_driver(%[
|
32
|
+
project project-test
|
33
|
+
topic topic-test
|
34
|
+
key key-test
|
35
|
+
])
|
36
|
+
|
37
|
+
assert_equal('project-test', d.instance.project)
|
38
|
+
assert_equal('topic-test', d.instance.topic)
|
39
|
+
assert_equal('key-test', d.instance.key)
|
40
|
+
assert_equal(false, d.instance.autocreate_topic)
|
41
|
+
assert_equal(1000, d.instance.max_messages)
|
42
|
+
assert_equal(9800000, d.instance.max_total_size)
|
43
|
+
assert_equal(4000000, d.instance.max_message_size)
|
44
|
+
end
|
45
|
+
|
46
|
+
test '"topic" must be specified' do
|
47
|
+
assert_raises Fluent::ConfigError do
|
48
|
+
create_driver(%[
|
49
|
+
project project-test
|
50
|
+
key key-test
|
51
|
+
])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
test '"autocreate_topic" can be specified' do
|
56
|
+
d = create_driver(%[
|
57
|
+
project project-test
|
58
|
+
topic topic-test
|
59
|
+
key key-test
|
60
|
+
autocreate_topic true
|
61
|
+
])
|
62
|
+
|
63
|
+
assert_equal(true, d.instance.autocreate_topic)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
sub_test_case 'topic' do
|
68
|
+
setup do
|
69
|
+
@publisher = mock!
|
70
|
+
@pubsub_mock = mock!
|
71
|
+
stub(Google::Cloud::Pubsub).new { @pubsub_mock }
|
72
|
+
end
|
73
|
+
|
74
|
+
test '"autocreate_topic" is enabled' do
|
75
|
+
d = create_driver(%[
|
76
|
+
project project-test
|
77
|
+
topic topic-test
|
78
|
+
key key-test
|
79
|
+
autocreate_topic true
|
80
|
+
])
|
81
|
+
|
82
|
+
@publisher.publish.once
|
83
|
+
@pubsub_mock.topic("topic-test").once { nil }
|
84
|
+
@pubsub_mock.create_topic("topic-test").once { @publisher }
|
85
|
+
d.run(default_tag: "test") do
|
86
|
+
d.feed(@time, {"a" => "b"})
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
test '40x error occurred on connecting to Pub/Sub' do
|
91
|
+
d = create_driver
|
92
|
+
|
93
|
+
@pubsub_mock.topic('topic-test').once do
|
94
|
+
raise Google::Cloud::NotFoundError.new('TEST')
|
95
|
+
end
|
96
|
+
|
97
|
+
assert_raise Google::Cloud::NotFoundError do
|
98
|
+
d.run(default_tag: "test") do
|
99
|
+
d.feed(@time, {"a" => "b"})
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
test '50x error occurred on connecting to Pub/Sub' do
|
105
|
+
d = create_driver
|
106
|
+
|
107
|
+
@pubsub_mock.topic('topic-test').once do
|
108
|
+
raise Google::Cloud::UnavailableError.new('TEST')
|
109
|
+
end
|
110
|
+
|
111
|
+
assert_raise Fluent::GcloudPubSub::RetryableError do
|
112
|
+
d.run(default_tag: "test") do
|
113
|
+
d.feed(@time, {"a" => "b"})
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
test 'topic is nil' do
|
119
|
+
d = create_driver
|
120
|
+
|
121
|
+
@pubsub_mock.topic('topic-test').once { nil }
|
122
|
+
|
123
|
+
assert_raise Fluent::GcloudPubSub::Error do
|
124
|
+
d.run(default_tag: "test") do
|
125
|
+
d.feed(@time, {"a" => "b"})
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
test 'messages exceeding "max_message_size" are not published' do
|
131
|
+
d = create_driver(%[
|
132
|
+
project project-test
|
133
|
+
topic topic-test
|
134
|
+
key key-test
|
135
|
+
max_message_size 1000
|
136
|
+
])
|
137
|
+
|
138
|
+
@publisher.publish.times(0)
|
139
|
+
d.run(default_tag: "test") do
|
140
|
+
d.feed(@time, {"a" => "a" * 1000})
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
sub_test_case 'publish' do
|
146
|
+
setup do
|
147
|
+
@publisher = mock!
|
148
|
+
@pubsub_mock = mock!.topic(anything) { @publisher }
|
149
|
+
stub(Google::Cloud::Pubsub).new { @pubsub_mock }
|
150
|
+
end
|
151
|
+
|
152
|
+
test 'messages are divided into "max_messages"' do
|
153
|
+
d = create_driver
|
154
|
+
@publisher.publish.times(2)
|
155
|
+
d.run(default_tag: "test") do
|
156
|
+
# max_messages is default 1000
|
157
|
+
1001.times do |i|
|
158
|
+
d.feed(@time, {"a" => i})
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
test 'messages are divided into "max_total_size"' do
|
164
|
+
d = create_driver(%[
|
165
|
+
project project-test
|
166
|
+
topic topic-test
|
167
|
+
key key-test
|
168
|
+
max_messages 100000
|
169
|
+
max_total_size 1000
|
170
|
+
])
|
171
|
+
|
172
|
+
@publisher.publish.times(2)
|
173
|
+
d.run(default_tag: "test") do
|
174
|
+
# 400 * 4 / max_total_size = twice
|
175
|
+
4.times do
|
176
|
+
d.feed(@time, {"a" => "a" * 400})
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
test 'accept "ASCII-8BIT" encoded multibyte strings' do
|
182
|
+
# on fluentd v0.14, all strings treated as "ASCII-8BIT" except specified encoding.
|
183
|
+
d = create_driver
|
184
|
+
@publisher.publish.once
|
185
|
+
d.run(default_tag: "test") do
|
186
|
+
d.feed(@time, {"a" => "あああ".force_encoding("ASCII-8BIT")})
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
test 'reraise unexpected errors' do
|
191
|
+
d = create_driver
|
192
|
+
@publisher.publish.once { raise ReRaisedError }
|
193
|
+
assert_raises ReRaisedError do
|
194
|
+
d.run(default_tag: "test") do
|
195
|
+
d.feed([{'a' => 1, 'b' => 2}])
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
test 'reraise RetryableError' do
|
201
|
+
d = create_driver
|
202
|
+
@publisher.publish.once { raise Google::Cloud::UnavailableError.new('TEST') }
|
203
|
+
assert_raises Fluent::GcloudPubSub::RetryableError do
|
204
|
+
d.run(default_tag: "test") do
|
205
|
+
d.feed([{'a' => 1, 'b' => 2}])
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
test 'inject section' do
|
211
|
+
d = create_driver(%[
|
212
|
+
project project-test
|
213
|
+
topic topic-test
|
214
|
+
key key-test
|
215
|
+
<inject>
|
216
|
+
tag_key tag
|
217
|
+
</inject>
|
218
|
+
])
|
219
|
+
@publisher.publish.once
|
220
|
+
d.run(default_tag: 'test') do
|
221
|
+
d.feed({"foo" => "bar"})
|
222
|
+
end
|
223
|
+
assert_equal({"tag" => 'test', "foo" => "bar"}, JSON.parse(MessagePack.unpack(d.formatted.first)[0]))
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require "test/unit/rr"
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
|
16
|
+
require 'fluent/test'
|
17
|
+
unless ENV.has_key?('VERBOSE')
|
18
|
+
nulllogger = Object.new
|
19
|
+
nulllogger.instance_eval {|obj|
|
20
|
+
def method_missing(method, *args)
|
21
|
+
# pass
|
22
|
+
end
|
23
|
+
}
|
24
|
+
$log = nulllogger
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'fluent/plugin/in_gcloud_pubsub'
|
28
|
+
require 'fluent/plugin/out_gcloud_pubsub'
|
29
|
+
|
30
|
+
class Test::Unit::TestCase
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-gcloud-pubsub-custom-subscriber
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- BL-Logging-Engineer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-10-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: fluentd
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.14.15
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.14.15
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: google-cloud-pubsub
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.30.0
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.30.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: test-unit
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: test-unit-rr
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
description: Google Cloud Pub/Sub input/output plugin for Fluentd event collector
|
104
|
+
without auto-create topic requiring only Pub/Sub subscriber ACL
|
105
|
+
email:
|
106
|
+
executables: []
|
107
|
+
extensions: []
|
108
|
+
extra_rdoc_files: []
|
109
|
+
files:
|
110
|
+
- ".gitignore"
|
111
|
+
- ".travis.yml"
|
112
|
+
- CHANGELOG.md
|
113
|
+
- Gemfile
|
114
|
+
- LICENSE
|
115
|
+
- README.md
|
116
|
+
- Rakefile
|
117
|
+
- fluent-plugin-gcloud-pubsub-custom.gemspec
|
118
|
+
- lib/fluent/plugin/gcloud_pubsub/client.rb
|
119
|
+
- lib/fluent/plugin/in_gcloud_pubsub.rb
|
120
|
+
- lib/fluent/plugin/out_gcloud_pubsub.rb
|
121
|
+
- test/plugin/test_in_gcloud_pubsub.rb
|
122
|
+
- test/plugin/test_out_gcloud_pubsub.rb
|
123
|
+
- test/test_helper.rb
|
124
|
+
homepage:
|
125
|
+
licenses:
|
126
|
+
- MIT
|
127
|
+
metadata: {}
|
128
|
+
post_install_message:
|
129
|
+
rdoc_options: []
|
130
|
+
require_paths:
|
131
|
+
- lib
|
132
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
requirements: []
|
143
|
+
rubygems_version: 3.0.6
|
144
|
+
signing_key:
|
145
|
+
specification_version: 4
|
146
|
+
summary: Google Cloud Pub/Sub input/output plugin for Fluentd event collector without
|
147
|
+
auto-create topic requiring only Pub/Sub subscriber ACL
|
148
|
+
test_files: []
|