fluent-plugin-gcloud-pubsub-custom 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d0d5b921e5457be93cc2d3c8876bd11aae90e41b
4
+ data.tar.gz: f74e1e5ab85e31ee5090cc84ac6926136ad8eb8f
5
+ SHA512:
6
+ metadata.gz: 553e885ee97a831dffa3441e999865ff039e41e30803e2e0ec29ed7db71ffc178481a38c2dceaa86f965a2f1a484f539c2b671e8c74f842ec27cc7ef2c628bc1
7
+ data.tar.gz: 39066e1bbca376d1c128dc2f6fa30de54d20fa7ee3b7b1eb795df6054d7f4f041877cd26e47a3043a03df411aecbdd90eee028e24a73491150f79d514675c497
@@ -0,0 +1,11 @@
1
+ ~*
2
+ #*
3
+ *~
4
+ [._]*.s[a-w][a-z]
5
+ .DS_Store
6
+
7
+ *.gem
8
+ .bundle
9
+ Gemfile.lock
10
+ vendor
11
+ .ruby-version
@@ -0,0 +1,30 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2.5
7
+ - 2.3.1
8
+ - ruby-head
9
+ - rbx
10
+
11
+ gemfile:
12
+ - Gemfile
13
+ - Gemfile.v0.12
14
+
15
+ branches:
16
+ only:
17
+ - master
18
+
19
+ before_install: gem update bundler
20
+ script: bundle exec rake test
21
+
22
+ sudo: false
23
+
24
+ matrix:
25
+ allow_failures:
26
+ - rvm: ruby-head
27
+ - rvm: rbx
28
+ exclude:
29
+ - rvm: 2.0
30
+ gemfile: Gemfile
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'fluentd', '~> 0.12.0'
4
+
5
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 mdoi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,143 @@
1
+ # fluent-plugin-gcloud-pubsub-custom
2
+
3
+ [![Build Status](https://travis-ci.org/mia-0032/fluent-plugin-gcloud-pubsub-custom.svg?branch=master)](https://travis-ci.org/mia-0032/fluent-plugin-gcloud-pubsub-custom)
4
+ [![Gem Version](https://badge.fury.io/rb/fluent-plugin-gcloud-pubsub-custom.svg)](http://badge.fury.io/rb/fluent-plugin-gcloud-pubsub-custom)
5
+
6
+ This plugin is forked from https://github.com/mdoi/fluent-plugin-gcloud-pubsub
7
+
8
+ ## Overview
9
+
10
+ [Cloud Pub/Sub](https://cloud.google.com/pubsub/) Input/Output(BufferedOutput) plugin for [Fluentd](http://www.fluentd.org/) with [gcloud](https://googlecloudplatform.github.io/gcloud-ruby/) gem
11
+
12
+ - [Publish](https://googlecloudplatform.github.io/gcloud-ruby/docs/v0.12.2/Gcloud/Pubsub/Topic.html#publish-instance_method) messages to Cloud Pub/Sub
13
+ - [Pull](https://googlecloudplatform.github.io/gcloud-ruby/docs/v0.12.2/Gcloud/Pubsub/Subscription.html#pull-instance_method) messages from Cloud Pub/Sub
14
+
15
+ ## Preparation
16
+
17
+ - Create a project on Google Developer Console
18
+ - Add a topic of Cloud Pub/Sub to the project
19
+ - Add a pull style subscription to the topic
20
+ - Download your credential (json) or [set scope on GCE instance](https://cloud.google.com/compute/docs/api/how-tos/authorization)
21
+
22
+ ## Installation
23
+
24
+ Install by gem:
25
+
26
+ ```shell
27
+ $ gem install fluent-plugin-gcloud-pubsub-custom
28
+ ```
29
+
30
+ ## Configuration
31
+
32
+ ### Publish messages
33
+
34
+ Use `gcloud_pubsub` output plugin.
35
+
36
+ ```
37
+ <match example.publish>
38
+ @type gcloud_pubsub
39
+ project <YOUR PROJECT>
40
+ key <YOUR KEY>
41
+ topic <YOUR TOPIC>
42
+ autocreate_topic false
43
+ max_messages 1000
44
+ max_total_size 10000000
45
+ buffer_type file
46
+ buffer_path /path/to/your/buffer
47
+ flush_interval 1s
48
+ try_flush_interval 0.1
49
+ format json
50
+ </match>
51
+ ```
52
+
53
+ - `project` (optional)
54
+ - Set your GCP project
55
+ - Running fluentd on GCP, you don't have to specify.
56
+ - You can also use environment variable such as `GCLOUD_PROJECT`.
57
+ - `key` (optional)
58
+ - Set your credential file path.
59
+ - Running fluentd on GCP, you can use scope instead of specifying this.
60
+ - You can also use environment variable such as `GCLOUD_KEYFILE`.
61
+ - `topic` (required)
62
+ - Set topic name to publish.
63
+ - `autocreate_topic` (optional, default: `false`)
64
+ - If set to `true`, specified topic will be created when it doesn't exist.
65
+ - `max_messages` (optional, default: `1000`)
66
+ - Publishing messages count per request to Cloud Pub/Sub.
67
+ - See https://cloud.google.com/pubsub/quotas#other_limits
68
+ - `max_total_size` (optional, default: `10000000` = `10MB`)
69
+ - Publishing messages bytesize per request to Cloud Pub/Sub.
70
+ - See https://cloud.google.com/pubsub/quotas#other_limits
71
+ - `buffer_type`, `buffer_path`, `flush_interval`, `try_flush_interval`
72
+ - These are fluentd buffer configuration. See http://docs.fluentd.org/articles/buffer-plugin-overview
73
+ - `format` (optional, default: `json`)
74
+ - Set output format. See http://docs.fluentd.org/articles/out_file#format
75
+
76
+ ### Pull messages
77
+
78
+ Use `gcloud_pubsub` input plugin.
79
+
80
+ ```
81
+ <source>
82
+ @type gcloud_pubsub
83
+ tag example.pull
84
+ project <YOUR PROJECT>
85
+ key <YOUR KEY>
86
+ topic <YOUR TOPIC>
87
+ subscription <YOUR SUBSCRIPTION>
88
+ max_messages 1000
89
+ return_immediately true
90
+ pull_interval 2
91
+ format json
92
+ </source>
93
+ ```
94
+
95
+ - `tag` (required)
96
+ - Set tag of messages.
97
+ - `project` (optional)
98
+ - Set your GCP project
99
+ - Running fluentd on GCP, you don't have to specify.
100
+ - You can also use environment variable such as `GCLOUD_PROJECT`.
101
+ - `key` (optional)
102
+ - Set your credential file path.
103
+ - Running fluentd on GCP, you can use scope instead of specifying this.
104
+ - You can also use environment variable such as `GCLOUD_KEYFILE`.
105
+ - `topic` (optional)
106
+ - Set topic name to pull.
107
+ - `subscription` (required)
108
+ - Set subscription name to pull.
109
+ - `max_messages` (optional, default: `100`)
110
+ - See maxMessages on https://cloud.google.com/pubsub/subscriber#receiving-pull-messages
111
+ - `return_immediately` (optional, default: `true`)
112
+ - See returnImmediately on https://cloud.google.com/pubsub/subscriber#receiving-pull-messages
113
+ - If `return_immediately` is `true`, this plugin ignore `pull_interval`.
114
+ - `pull_interval` (optional, default: `5`)
115
+ - Pulling messages by intervals of specified seconds.
116
+ - `format` (optional, default: `json`)
117
+ - Set input format. See format section in http://docs.fluentd.org/articles/in_tail
118
+
119
+ ## ChangeLog
120
+
121
+ - Release 0.1.0 - 2016/08/22
122
+ - Use formatter / parser plugin and add format configuration
123
+ - Bump up gcloud-ruby to 0.12
124
+ - Remove dependency on lightening buffer
125
+ - Fix error caused by Pub/Sub quotas
126
+
127
+ ## Contributing
128
+
129
+ 1. Fork it
130
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
131
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
132
+ 4. Push to the branch (`git push origin my-new-feature`)
133
+ 5. Create a new Pull Request
134
+
135
+ ## TODO
136
+
137
+ - Add `tag` attribute in output plugin and use `tag` attribute as tag in input plugin.
138
+ - Send ack after other output plugin committed (if possible).
139
+
140
+ ## Authors
141
+
142
+ - [@mdoi](https://github.com/mdoi) : First author
143
+ - [@mia-0032](https://github.com/mia-0032) : This version author
@@ -0,0 +1,12 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new(:test) do |test|
7
+ test.libs << 'lib' << 'test'
8
+ test.test_files = FileList['test/plugin/test_*.rb']
9
+ test.verbose = true
10
+ end
11
+
12
+ task :default => [:build]
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "fluent-plugin-gcloud-pubsub-custom"
6
+ gem.description = "Google Cloud Pub/Sub input/output plugin for Fluentd event collector"
7
+ gem.license = "MIT"
8
+ gem.homepage = "https://github.com/mia-0032/fluent-plugin-gcloud-pubsub-custom"
9
+ gem.summary = gem.description
10
+ gem.version = "0.1.0"
11
+ gem.authors = ["Yoshihiro MIYAI"]
12
+ gem.email = "msparrow17@gmail.com"
13
+ gem.has_rdoc = false
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_runtime_dependency "fluentd", [">= 0.10.58", "< 2"]
20
+ gem.add_runtime_dependency "gcloud", "~> 0.12"
21
+
22
+ gem.add_development_dependency "bundler"
23
+ gem.add_development_dependency "rake"
24
+ gem.add_development_dependency "test-unit"
25
+ gem.add_development_dependency "test-unit-rr"
26
+ end
@@ -0,0 +1,40 @@
1
+ require 'gcloud'
2
+
3
+ module Fluent
4
+ module GcloudPubSub
5
+ class Error < StandardError; end
6
+
7
+ class Publisher
8
+ def initialize(project, key, topic, autocreate_topic)
9
+ pubsub = (Gcloud.new project, key).pubsub
10
+
11
+ @client = pubsub.topic topic, autocreate: autocreate_topic
12
+ raise Fluent::GcloudPubSub::Error.new "topic:#{topic} does not exist." if @client.nil?
13
+ end
14
+
15
+ def publish(messages)
16
+ @client.publish do |batch|
17
+ messages.each do |m|
18
+ batch.publish m
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ class Subscriber
25
+ def initialize(project, key, topic, subscription)
26
+ pubsub = (Gcloud.new project, key).pubsub
27
+ @client = pubsub.subscription subscription
28
+ raise Fluent::GcloudPubSub::Error.new "subscription:#{subscription} does not exist." if @client.nil?
29
+ end
30
+
31
+ def pull(immediate, max)
32
+ @client.pull immediate: immediate, max: max
33
+ end
34
+
35
+ def acknowledge(messages)
36
+ @client.acknowledge messages
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,98 @@
1
+ require 'fluent/input'
2
+ require 'fluent/parser'
3
+
4
+ require 'fluent/plugin/gcloud_pubsub/client'
5
+
6
+ module Fluent
7
+ class GcloudPubSubInput < Input
8
+ Fluent::Plugin.register_input('gcloud_pubsub', self)
9
+
10
+ config_param :tag, :string
11
+ config_param :project, :string, :default => nil
12
+ config_param :key, :string, :default => nil
13
+ config_param :topic, :string, :default => nil
14
+ config_param :subscription, :string
15
+ config_param :pull_interval, :integer, :default => 5
16
+ config_param :max_messages, :integer, :default => 100
17
+ config_param :return_immediately, :bool, :default => true
18
+ config_param :format, :string, :default => 'json'
19
+
20
+ unless method_defined?(:log)
21
+ define_method("log") { $log }
22
+ end
23
+
24
+ unless method_defined?(:router)
25
+ define_method("router") { Fluent::Engine }
26
+ end
27
+
28
+ def configure(conf)
29
+ super
30
+ @parser = Plugin.new_parser(@format)
31
+ @parser.configure(conf)
32
+ end
33
+
34
+ def start
35
+ super
36
+ @subscriber = Fluent::GcloudPubSub::Subscriber.new @project, @key, @topic, @subscription
37
+ log.debug "connected subscription:#{@subscription} in project #{@project}"
38
+ @stop_subscribing = false
39
+ @subscribe_thread = Thread.new(&method(:subscribe))
40
+ end
41
+
42
+ def shutdown
43
+ super
44
+ @stop_subscribing = true
45
+ @subscribe_thread.join
46
+ end
47
+
48
+ private
49
+
50
+ def subscribe
51
+ until @stop_subscribing
52
+ messages = @subscriber.pull @return_immediately, @max_messages
53
+
54
+ if messages.length > 0
55
+ es = parse_messages(messages)
56
+ unless es.empty?
57
+ begin
58
+ router.emit_stream(@tag, es)
59
+ rescue
60
+ # ignore errors. Engine shows logs and backtraces.
61
+ end
62
+ @subscriber.acknowledge messages
63
+ log.debug "#{messages.length} message(s) processed"
64
+ end
65
+ end
66
+
67
+ if @return_immediately
68
+ sleep @pull_interval
69
+ end
70
+ end
71
+ rescue
72
+ log.error "unexpected error", :error=>$!.to_s
73
+ log.error_backtrace
74
+ end
75
+
76
+ def parse_messages(messages)
77
+ es = MultiEventStream.new
78
+ messages.each do |m|
79
+ convert_line_to_event(m.message.data, es)
80
+ end
81
+ es
82
+ end
83
+
84
+ def convert_line_to_event(line, es)
85
+ line.chomp! # remove \n
86
+ @parser.parse(line) { |time, record|
87
+ if time && record
88
+ es.add(time, record)
89
+ else
90
+ log.warn "pattern not match: #{line.inspect}"
91
+ end
92
+ }
93
+ rescue => e
94
+ log.warn line.dump, :error => e.to_s
95
+ log.debug_backtrace(e.backtrace)
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,72 @@
1
+ require 'fluent/output'
2
+
3
+ require 'fluent/plugin/gcloud_pubsub/client'
4
+
5
+ module Fluent
6
+ class GcloudPubSubOutput < BufferedOutput
7
+ Fluent::Plugin.register_output('gcloud_pubsub', self)
8
+
9
+ config_param :project, :string, :default => nil
10
+ config_param :key, :string, :default => nil
11
+ config_param :topic, :string
12
+ config_param :autocreate_topic, :bool, :default => false
13
+ config_param :max_messages, :integer, :default => 1000
14
+ config_param :max_total_size, :integer, :default => 10000000 # 10MB
15
+ config_param :format, :string, :default => 'json'
16
+
17
+ unless method_defined?(:log)
18
+ define_method("log") { $log }
19
+ end
20
+
21
+ unless method_defined?(:router)
22
+ define_method("router") { Fluent::Engine }
23
+ end
24
+
25
+ def configure(conf)
26
+ super
27
+ @formatter = Plugin.new_formatter(@format)
28
+ @formatter.configure(conf)
29
+ end
30
+
31
+ def start
32
+ super
33
+ @publisher = Fluent::GcloudPubSub::Publisher.new @project, @key, @topic, @autocreate_topic
34
+ log.debug "connected topic:#{@topic} in project #{@project}"
35
+ end
36
+
37
+ def format(tag, time, record)
38
+ [tag, time, record].to_msgpack
39
+ end
40
+
41
+ def write(chunk)
42
+ messages = []
43
+ size = 0
44
+
45
+ chunk.msgpack_each do |tag, time, record|
46
+ msg = @formatter.format(tag, time, record)
47
+ if messages.length + 1 > @max_messages || size + msg.bytesize > @max_total_size
48
+ publish messages
49
+ messages = []
50
+ size = 0
51
+ end
52
+ messages << msg
53
+ size += msg.bytesize
54
+ end
55
+
56
+ if messages.length > 0
57
+ publish messages
58
+ end
59
+ rescue => e
60
+ log.error "unexpected error", :error=>$!.to_s
61
+ log.error_backtrace
62
+ raise e
63
+ end
64
+
65
+ private
66
+
67
+ def publish(messages)
68
+ log.debug "send message topic:#{@topic} length:#{messages.length.to_s}"
69
+ @publisher.publish messages
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,54 @@
1
+ require_relative "../test_helper"
2
+
3
+ class GcloudPubSubInputTest < Test::Unit::TestCase
4
+ CONFIG = %[
5
+ tag test
6
+ project project-test
7
+ subscription subscription-test
8
+ key key-test
9
+ format json
10
+ ]
11
+
12
+ def create_driver(conf=CONFIG)
13
+ Fluent::Test::InputTestDriver.new(Fluent::GcloudPubSubInput).configure(conf)
14
+ end
15
+
16
+ setup do
17
+ Fluent::Test.setup
18
+ end
19
+
20
+ sub_test_case 'configure' do
21
+ test 'all params are configured' do
22
+ d = create_driver(%[
23
+ tag test
24
+ project project-test
25
+ topic topic-test
26
+ subscription subscription-test
27
+ key key-test
28
+ max_messages 1000
29
+ return_immediately true
30
+ pull_interval 2
31
+ format ltsv
32
+ ])
33
+
34
+ assert_equal('test', d.instance.tag)
35
+ assert_equal('project-test', d.instance.project)
36
+ assert_equal('topic-test', d.instance.topic)
37
+ assert_equal('subscription-test', d.instance.subscription)
38
+ assert_equal('key-test', d.instance.key)
39
+ assert_equal(2, d.instance.pull_interval)
40
+ assert_equal(1000, d.instance.max_messages)
41
+ assert_equal(true, d.instance.return_immediately)
42
+ assert_equal('ltsv', d.instance.format)
43
+ end
44
+
45
+ test 'default values are configured' do
46
+ d = create_driver
47
+ assert_equal(nil, d.instance.topic)
48
+ assert_equal(5, d.instance.pull_interval)
49
+ assert_equal(100, d.instance.max_messages)
50
+ assert_equal(true, d.instance.return_immediately)
51
+ assert_equal('json', d.instance.format)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,134 @@
1
+ require_relative "../test_helper"
2
+
3
+ class GcloudPubSubOutputTest < Test::Unit::TestCase
4
+ CONFIG = %[
5
+ project project-test
6
+ topic topic-test
7
+ key key-test
8
+ ]
9
+
10
+ ReRaisedError = Class.new(RuntimeError)
11
+
12
+ def create_driver(conf = CONFIG)
13
+ Fluent::Test::BufferedOutputTestDriver.new(Fluent::GcloudPubSubOutput).configure(conf)
14
+ end
15
+
16
+ setup do
17
+ Fluent::Test.setup
18
+ end
19
+
20
+ sub_test_case 'configure' do
21
+ test 'default values are configured' do
22
+ d = create_driver(%[
23
+ project project-test
24
+ topic topic-test
25
+ key key-test
26
+ ])
27
+
28
+ assert_equal('project-test', d.instance.project)
29
+ assert_equal('topic-test', d.instance.topic)
30
+ assert_equal('key-test', d.instance.key)
31
+ assert_equal(false, d.instance.autocreate_topic)
32
+ assert_equal(1000, d.instance.max_messages)
33
+ assert_equal(10000000, d.instance.max_total_size)
34
+ end
35
+
36
+ test '"topic" must be specified' do
37
+ assert_raises Fluent::ConfigError do
38
+ create_driver(%[
39
+ project project-test
40
+ key key-test
41
+ ])
42
+ end
43
+ end
44
+
45
+ test '"autocreate_topic" can be specified' do
46
+ d = create_driver(%[
47
+ project project-test
48
+ topic topic-test
49
+ key key-test
50
+ autocreate_topic true
51
+ ])
52
+
53
+ assert_equal(true, d.instance.autocreate_topic)
54
+ end
55
+ end
56
+
57
+ sub_test_case 'topic' do
58
+ setup do
59
+ @publisher = mock!
60
+ @pubsub_mock = mock!
61
+ @gcloud_mock = mock!.pubsub { @pubsub_mock }
62
+ stub(Gcloud).new { @gcloud_mock }
63
+ end
64
+
65
+ test '"autocreate_topic" is enabled' do
66
+ d = create_driver(%[
67
+ project project-test
68
+ topic topic-test
69
+ key key-test
70
+ autocreate_topic true
71
+ ])
72
+
73
+ @pubsub_mock.topic("topic-test", autocreate: true).once { @publisher }
74
+ d.run
75
+ end
76
+ end
77
+
78
+ sub_test_case 'publish' do
79
+ setup do
80
+ @publisher = mock!
81
+ @pubsub_mock = mock!.topic(anything, anything) { @publisher }
82
+ @gcloud_mock = mock!.pubsub { @pubsub_mock }
83
+ stub(Gcloud).new { @gcloud_mock }
84
+ end
85
+
86
+ setup do
87
+ @time = Time.parse('2016-07-09 11:12:13 UTC').to_i
88
+ end
89
+
90
+ test 'messages are divided into "max_messages"' do
91
+ d = create_driver
92
+ @publisher.publish.times(2)
93
+ # max_messages is default 1000
94
+ 1001.times do |i|
95
+ d.emit({"a" => i}, @time)
96
+ end
97
+ d.run
98
+ end
99
+
100
+ test 'messages are divided into "max_total_size"' do
101
+ d = create_driver(%[
102
+ project project-test
103
+ topic topic-test
104
+ key key-test
105
+ max_messages 100000
106
+ max_total_size 1000
107
+ ])
108
+
109
+ @publisher.publish.times(2)
110
+ # 400 * 4 / max_total_size = twice
111
+ 4.times do
112
+ d.emit({"a" => "a" * 400}, @time)
113
+ end
114
+ d.run
115
+ end
116
+
117
+ test 'accept "ASCII-8BIT" encoded multibyte strings' do
118
+ # on fluentd v0.14, all strings treated as "ASCII-8BIT" except specified encoding.
119
+ d = create_driver
120
+ @publisher.publish.once
121
+ d.emit({"a" => "あああ".force_encoding("ASCII-8BIT")}, @time)
122
+ d.run
123
+ end
124
+
125
+ test 'reraise errors' do
126
+ d = create_driver
127
+ @publisher.publish.once { raise ReRaisedError }
128
+ assert_raises ReRaisedError do
129
+ d.emit([{'a' => 1, 'b' => 2}])
130
+ d.run
131
+ end
132
+ end
133
+ end
134
+ end
@@ -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,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-gcloud-pubsub-custom
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yoshihiro MIYAI
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-22 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.10.58
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.10.58
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: gcloud
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.12'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.12'
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
+ email: msparrow17@gmail.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - ".gitignore"
110
+ - ".travis.yml"
111
+ - Gemfile
112
+ - Gemfile.v0.12
113
+ - LICENSE
114
+ - README.md
115
+ - Rakefile
116
+ - fluent-plugin-gcloud-pubsub-custom.gemspec
117
+ - lib/fluent/plugin/gcloud_pubsub/client.rb
118
+ - lib/fluent/plugin/in_gcloud_pubsub.rb
119
+ - lib/fluent/plugin/out_gcloud_pubsub.rb
120
+ - test/plugin/test_in_gcloud_pubsub.rb
121
+ - test/plugin/test_out_gcloud_pubsub.rb
122
+ - test/test_helper.rb
123
+ homepage: https://github.com/mia-0032/fluent-plugin-gcloud-pubsub-custom
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.5.1
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: Google Cloud Pub/Sub input/output plugin for Fluentd event collector
147
+ test_files:
148
+ - test/plugin/test_in_gcloud_pubsub.rb
149
+ - test/plugin/test_out_gcloud_pubsub.rb
150
+ - test/test_helper.rb