fluent-plugin-gcloud-pubsub-custom-subscriber 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6c40c4cd8a4d0c00706354f721a7d152c10fdc7bfe8ce52bdc39b268d74e4dbb
4
+ data.tar.gz: dfbeb82161e39ffd4c3b6795a5adc1b595852f210f2d6ea109af81cafa9c5821
5
+ SHA512:
6
+ metadata.gz: 053474f74e5dbf96d413ab4f4c57f0ccc98631578ea6b7e4d95f1a95533f65a7fabc5109ebe9292de32637d59b30187652ea31bf03d9fcb260ea24ad461ad3bb
7
+ data.tar.gz: 03a60c08384edf78977d4814ed9d27fecf43a8ac1e014b6b730c4873ab1521fee459746155b1e746c6112823a75bdb062bdc23e99b0a74d69a76445bf5ab8937
data/.gitignore ADDED
@@ -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
data/.travis.yml ADDED
@@ -0,0 +1,25 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.1
5
+ - 2.2
6
+ - 2.3.6
7
+ - 2.4.3
8
+ - 2.5.0
9
+ - ruby-head
10
+
11
+ gemfile:
12
+ - Gemfile
13
+
14
+ branches:
15
+ only:
16
+ - master
17
+
18
+ before_install: gem update bundler
19
+ script: bundle exec rake test
20
+
21
+ sudo: false
22
+
23
+ matrix:
24
+ allow_failures:
25
+ - rvm: ruby-head
data/CHANGELOG.md ADDED
@@ -0,0 +1,134 @@
1
+ ## ChangeLog
2
+
3
+ ### Release 1.3.1 - 2018/06/08
4
+
5
+ - Input plugin
6
+ - Dumps raw string to logs for parsing errors
7
+
8
+ ### Release 1.3.0 - 2018/05/18
9
+
10
+ - Make attributes available
11
+
12
+ ### Release 1.2.0 - 2018/04/24
13
+
14
+ - Output plugin
15
+ - Support inject section
16
+
17
+ ### Release 1.1.0 - 2018/03/30
18
+
19
+ - Output plugin
20
+ - The placeholder is now available in topic param
21
+
22
+ ### Release 1.0.3 - 2018/03/29
23
+
24
+ - Bump up google-cloud-pubsub to v0.30.x
25
+ - Make config file Fluentd v1 compatible
26
+
27
+ ### Release 1.0.2 - 2017/09/11
28
+
29
+ - Bump up google-cloud-pubsub to v0.27.x
30
+
31
+ ### Release 1.0.1 - 2017/09/05
32
+
33
+ - Bump up google-cloud-pubsub to v0.26.x
34
+
35
+ ### Release 1.0.0 - 2017/06/23
36
+
37
+ - Fluentd v0.14 ready
38
+ - Fluentd v0.12 is not supported in the later version
39
+
40
+ ### Release 0.4.6 - 2017/05/14
41
+
42
+ - Output plugin
43
+ - Make messages exceeding configured size not be published because Pub/Sub clients cannot receive it
44
+
45
+ ### Release 0.4.5 - 2017/04/02
46
+
47
+ - Bump up google-cloud-pubsub to v0.24.x
48
+
49
+ ### Release 0.4.4 - 2017/03/07
50
+
51
+ - Bump up google-cloud-pubsub to v0.23.x
52
+
53
+ ### Release 0.4.3 - 2017/02/16
54
+
55
+ - Input plugin
56
+ - Add "status" method to the http rpc api
57
+
58
+ ### Release 0.4.2 - 2017/02/03
59
+
60
+ - Make retry to get topic/subscription when Pub/Sub API returns 50x code
61
+
62
+ ### Release 0.4.1 - 2017/02/02
63
+
64
+ - Bump up google-cloud-pubsub to v0.22.x
65
+ - Input plugin
66
+ - Rescue 50x errors on acknowledge api
67
+
68
+ ### Release 0.4.0 - 2017/01/21
69
+
70
+ - Input plugin
71
+ - Add feature to use record key as tag
72
+
73
+ ### Release 0.3.4 - 2017/01/03
74
+
75
+ - Output plugin
76
+ - Rescue 50x errors
77
+ - Input plugin
78
+ - Guard emit to be called with multi-threading
79
+ - Rescue 50x errors
80
+ - Enabled to select whether to raise an exception if message processing failed
81
+
82
+ ### Release 0.3.3 - 2016/12/03
83
+
84
+ - Input plugin
85
+ - Fix undefined variable error
86
+
87
+ ### Release 0.3.2 - 2016/11/13
88
+
89
+ - Add plugin param desc
90
+ - Input plugin
91
+ - Improve handling to acknowledge messages
92
+
93
+ ### Release 0.3.1 - 2016/11/03
94
+
95
+ - Output plugin
96
+ - Improve error handling
97
+
98
+ ### Release 0.3.0 - 2016/10/30
99
+
100
+ - Bump up google-cloud-pubsub to v0.21
101
+ - Input plugin
102
+ - Add multithreaded pulling feature
103
+
104
+ ### Release 0.2.0 - 2016/10/15
105
+
106
+ - Input plugin
107
+ - Add HTTP RPC feature
108
+
109
+ ### Release 0.1.4 - 2016/09/19
110
+
111
+ - Input plugin
112
+ - `pull_interval` can be specified float value
113
+ - `topic` must be specified
114
+
115
+ ### Release 0.1.3 - 2016/09/17
116
+
117
+ - Input plugin
118
+ - Fix error handling and add debug logging
119
+
120
+ ### Release 0.1.2 - 2016/09/11
121
+
122
+ - Output plugin
123
+ - Change default max message size and add debug message
124
+
125
+ ### Release 0.1.1 - 2016/08/27
126
+
127
+ - Bump up google-cloud-pubsub (gcloud-ruby) to 0.20
128
+
129
+ ### Release 0.1.0 - 2016/08/22
130
+
131
+ - Use formatter / parser plugin and add format configuration
132
+ - Bump up gcloud-ruby to 0.12
133
+ - Remove dependency on lightening buffer
134
+ - Fix error caused by Pub/Sub quotas
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ 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
+
data/README.md ADDED
@@ -0,0 +1,178 @@
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
+ [Google Cloud Pub/Sub](https://cloud.google.com/pubsub/) Input/Output(BufferedOutput) plugin for [Fluentd](http://www.fluentd.org/) with [google-cloud](https://googlecloudplatform.github.io/google-cloud-ruby/) gem
11
+
12
+ - Publish messages to Google Cloud Pub/Sub
13
+ - Pull messages from Google 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
+ When using output plugin, you need to grant Pub/Sub Publisher and Pub/Sub Viewer role to IAM.
23
+
24
+ Also, when using input plugin, you need to grant Pub/Sub Subscriber and Pub/Sub Viewer role to IAM.
25
+
26
+ ## Requirements
27
+
28
+ | fluent-plugin-gcloud-pubsub-custom | fluentd | ruby |
29
+ |------------------------|---------|------|
30
+ | >= 1.0.0 | >= v0.14.0 | >= 2.1 |
31
+ | < 1.0.0 | >= v0.12.0 | >= 1.9 |
32
+
33
+ ## Installation
34
+
35
+ Install by gem:
36
+
37
+ ```shell
38
+ $ gem install fluent-plugin-gcloud-pubsub-custom
39
+ ```
40
+
41
+ **Caution**
42
+
43
+ This plugin doesn't work in [td-agent](http://docs.fluentd.org/articles/install-by-rpm).
44
+
45
+ Please use in [Fluentd installed by gem](http://docs.fluentd.org/articles/install-by-gem).
46
+
47
+ ## Configuration
48
+
49
+ ### Publish messages
50
+
51
+ Use `gcloud_pubsub` output plugin.
52
+
53
+ ```
54
+ <match example.publish>
55
+ @type gcloud_pubsub
56
+ project <YOUR PROJECT>
57
+ key <YOUR KEY>
58
+ topic <YOUR TOPIC>
59
+ autocreate_topic false
60
+ max_messages 1000
61
+ max_total_size 9800000
62
+ max_message_size 4000000
63
+ <buffer>
64
+ @type memory
65
+ flush_interval 1s
66
+ </buffer>
67
+ <format>
68
+ @type json
69
+ </format>
70
+ </match>
71
+ ```
72
+
73
+ - `project` (optional)
74
+ - Set your GCP project.
75
+ - Running fluentd on GCP, you don't have to specify.
76
+ - You can also use environment variable such as `GCLOUD_PROJECT`.
77
+ - `key` (optional)
78
+ - Set your credential file path.
79
+ - Running fluentd on GCP, you can use scope instead of specifying this.
80
+ - You can also use environment variable such as `GCLOUD_KEYFILE`.
81
+ - `topic` (required)
82
+ - Set topic name to publish.
83
+ - You can use placeholder in this param. See: https://docs.fluentd.org/v1.0/articles/buffer-section
84
+ - `autocreate_topic` (optional, default: `false`)
85
+ - If set to `true`, specified topic will be created when it doesn't exist.
86
+ - `max_messages` (optional, default: `1000`)
87
+ - Publishing messages count per request to Cloud Pub/Sub.
88
+ - See https://cloud.google.com/pubsub/quotas#other_limits
89
+ - `max_total_size` (optional, default: `9800000` = `9.8MB`)
90
+ - Publishing messages bytesize per request to Cloud Pub/Sub. This parameter affects only message size. You should specify a little smaller value than quota.
91
+ - See https://cloud.google.com/pubsub/quotas#other_limits
92
+ - `max_message_size` (optional, default: `4000000` = `4MB`)
93
+ - Messages exceeding `max_message_size` are not published because Pub/Sub clients cannot receive it.
94
+ - `attribute_keys` (optional, default: `[]`)
95
+ - Publishing the set fields as attributes.
96
+
97
+ ### Pull messages
98
+
99
+ Use `gcloud_pubsub` input plugin.
100
+
101
+ ```
102
+ <source>
103
+ @type gcloud_pubsub
104
+ tag example.pull
105
+ project <YOUR PROJECT>
106
+ key <YOUR KEY>
107
+ topic <YOUR TOPIC>
108
+ subscription <YOUR SUBSCRIPTION>
109
+ max_messages 1000
110
+ return_immediately true
111
+ pull_interval 0.5
112
+ pull_threads 2
113
+ parse_error_action exception
114
+ enable_rpc true
115
+ rpc_bind 0.0.0.0
116
+ rpc_port 24680
117
+ <parse>
118
+ @type json
119
+ </parse>
120
+ </source>
121
+ ```
122
+
123
+ - `tag` (required)
124
+ - Set tag of messages.
125
+ - If `tag_key` is specified, `tag` is used as tag when record don't have specified key.
126
+ - `tag_key` (optional)
127
+ - Set key to be used as tag.
128
+ - `project` (optional)
129
+ - Set your GCP project
130
+ - Running fluentd on GCP, you don't have to specify.
131
+ - You can also use environment variable such as `GCLOUD_PROJECT`.
132
+ - `key` (optional)
133
+ - Set your credential file path.
134
+ - Running fluentd on GCP, you can use scope instead of specifying this.
135
+ - You can also use environment variable such as `GCLOUD_KEYFILE`.
136
+ - `topic` (required)
137
+ - Set topic name to pull.
138
+ - `subscription` (required)
139
+ - Set subscription name to pull.
140
+ - `max_messages` (optional, default: `100`)
141
+ - See maxMessages on https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.subscriptions/pull
142
+ - `return_immediately` (optional, default: `true`)
143
+ - See returnImmediately on https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.subscriptions/pull
144
+ - If `return_immediately` is `true` or pulling message is stopped by HTTP RPC, this plugin wait `pull_interval` each pull.
145
+ - `pull_interval` (optional, default: `5.0`)
146
+ - Pulling messages by intervals of specified seconds.
147
+ - `pull_threads` (optional, default: `1`)
148
+ - Set number of threads to pull messages.
149
+ - `attribute_keys` (optional, default: `[]`)
150
+ - Specify the key of the attribute to be emitted as the field of record.
151
+ - `parse_error_action` (optional, default: `exception`)
152
+ - Set error type when parsing messages fails.
153
+ - `exception`: Raise exception. Messages are not acknowledged.
154
+ - `warning`: Only logging as warning.
155
+ - `enable_rpc` (optional, default: `false`)
156
+ - If `true` is specified, HTTP RPC to stop or start pulling message is enabled.
157
+ - `rpc_bind` (optional, default: `0.0.0.0`)
158
+ - Bind IP address for HTTP RPC.
159
+ - `rpc_port` (optional, default: `24680`)
160
+ - Port for HTTP RPC.
161
+
162
+ ## Contributing
163
+
164
+ 1. Fork it
165
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
166
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
167
+ 4. Push to the branch (`git push origin my-new-feature`)
168
+ 5. Create a new Pull Request
169
+
170
+ ## TODO
171
+
172
+ - Add `tag` attribute in output plugin and use `tag` attribute as tag in input plugin.
173
+ - Send ack after other output plugin committed (if possible).
174
+
175
+ ## Authors
176
+
177
+ - [@mdoi](https://github.com/mdoi) : First author
178
+ - [@mia-0032](https://github.com/mia-0032) : This version author
data/Rakefile ADDED
@@ -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,24 @@
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-subscriber"
6
+ gem.description = "Google Cloud Pub/Sub input/output plugin for Fluentd event collector without auto-create topic requiring only Pub/Sub subscriber ACL"
7
+ gem.license = "MIT"
8
+ gem.summary = gem.description
9
+ gem.version = "1.3.1"
10
+ gem.authors = ["BL-Logging-Engineer"]
11
+ gem.has_rdoc = false
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ gem.require_paths = ['lib']
16
+
17
+ gem.add_runtime_dependency "fluentd", [">= 0.14.15", "< 2"]
18
+ gem.add_runtime_dependency "google-cloud-pubsub", "~> 0.30.0"
19
+
20
+ gem.add_development_dependency "bundler"
21
+ gem.add_development_dependency "rake"
22
+ gem.add_development_dependency "test-unit"
23
+ gem.add_development_dependency "test-unit-rr"
24
+ end
@@ -0,0 +1,80 @@
1
+ require 'google/cloud/pubsub'
2
+
3
+ module Fluent
4
+ module GcloudPubSub
5
+ class Error < StandardError
6
+ end
7
+ class RetryableError < Error
8
+ end
9
+
10
+ class Message
11
+ attr_reader :message, :attributes
12
+ def initialize(message, attributes={})
13
+ @message = message
14
+ @attributes = attributes
15
+ end
16
+
17
+ def bytesize()
18
+ attr_size = 0
19
+ @attributes.each do |key, val|
20
+ attr_size += key.bytesize + val.bytesize
21
+ end
22
+ @message.bytesize + attr_size
23
+ end
24
+ end
25
+
26
+ class Publisher
27
+ def initialize(project, key, autocreate_topic)
28
+ @pubsub = Google::Cloud::Pubsub.new project_id: project, credentials: key
29
+ @autocreate_topic = autocreate_topic
30
+ @topics = {}
31
+ end
32
+
33
+ def topic(topic_name)
34
+ return @topics[topic_name] if @topics.has_key? topic_name
35
+
36
+ client = @pubsub.topic topic_name
37
+ if client.nil? && @autocreate_topic
38
+ client = @pubsub.create_topic topic_name
39
+ end
40
+ if client.nil?
41
+ raise Error.new "topic:#{topic_name} does not exist."
42
+ end
43
+
44
+ @topics[topic_name] = client
45
+ client
46
+ end
47
+
48
+ def publish(topic_name, messages)
49
+ topic(topic_name).publish do |batch|
50
+ messages.each do |m|
51
+ batch.publish m.message, m.attributes
52
+ end
53
+ end
54
+ rescue Google::Cloud::UnavailableError, Google::Cloud::DeadlineExceededError, Google::Cloud::InternalError => ex
55
+ raise RetryableError.new "Google api returns error:#{ex.class.to_s} message:#{ex.to_s}"
56
+ end
57
+ end
58
+
59
+ class Subscriber
60
+ def initialize(project, key, topic_name, subscription_name)
61
+ pubsub = Google::Cloud::Pubsub.new project_id: project, credentials: key
62
+ topic = pubsub.topic topic_name
63
+ @client = topic.subscription subscription_name
64
+ raise Error.new "subscription:#{subscription_name} does not exist." if @client.nil?
65
+ end
66
+
67
+ def pull(immediate, max)
68
+ @client.pull immediate: immediate, max: max
69
+ rescue Google::Cloud::UnavailableError, Google::Cloud::DeadlineExceededError, Google::Cloud::InternalError => ex
70
+ raise RetryableError.new "Google pull api returns error:#{ex.class.to_s} message:#{ex.to_s}"
71
+ end
72
+
73
+ def acknowledge(messages)
74
+ @client.acknowledge messages
75
+ rescue Google::Cloud::UnavailableError, Google::Cloud::DeadlineExceededError, Google::Cloud::InternalError => ex
76
+ raise RetryableError.new "Google acknowledge api returns error:#{ex.class.to_s} message:#{ex.to_s}"
77
+ end
78
+ end
79
+ end
80
+ end