fluent-plugin-ruby-kafka 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a55057020e8d28616feca8a5de68b50dd43e3d7a
4
+ data.tar.gz: dd8ab1b9755587933c9b46c18729c0d50db7a442
5
+ SHA512:
6
+ metadata.gz: b324b25cfa6b0e11082226752fe0b05a033a50d4dd8b48f6b5a27874e6b4d3214b599078af278a14d459fe522d4e21e3a83e9c3c50015242bc280019545abe07
7
+ data.tar.gz: 1a9c77c893306c675a2f2ef04590e0894db9d49de3120bce7192eeb2a340acf6d5967783bb57f186aced0054486ae3da688356413da4491a8b4286cefd7750fb
@@ -0,0 +1,17 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ *.gem
15
+ mkmf.log
16
+ .rbenv-gemsets
17
+ .ruby-version
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-ruby-kafka.gemspec
4
+ gemspec
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2015- Yoshimitsu KOKUBO
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
@@ -0,0 +1,35 @@
1
+ # fluent-plugin-ruby-kafka
2
+
3
+ [Fluentd](http://fluentd.org/) output plugin to write data into kafka topic.
4
+
5
+ It has been implemented in the reference [fluent-plugin-kafka](https://github.com/htgc/fluent-plugin-kafka)
6
+
7
+ The difference between fluent-plugin-kafka are using [ruby-kafka](https://github.com/zendesk/ruby-kafka).
8
+
9
+ ## Configuration
10
+
11
+ ### RubyKafkaOutput
12
+
13
+ Use zookeeper:
14
+
15
+ <match tag.**>
16
+ type ruby_kafka
17
+ zookeepers zookeeper01:2181,zookeeper02:2181
18
+ default_topic topic1
19
+ </match>
20
+
21
+ Setting the brokers:
22
+
23
+ <match tag.**>
24
+ type ruby_kafka
25
+ brokers broker01:9092,broker02:9092
26
+ default_topic topic1
27
+ </match>
28
+
29
+ ## TODO
30
+
31
+ ## Copyright
32
+
33
+ * Copyright (c) 2016- Yoshimitsu KOKUBO (yoshi)
34
+ * License
35
+ * Apache License, Version 2.0
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
+
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = "fluent-plugin-ruby-kafka"
5
+ gem.version = "0.1.0"
6
+ gem.authors = ["Yoshimitsu Kokubo"]
7
+ gem.email = ["yoshi@unplus.net"]
8
+ gem.summary = %q{Kafka's produce fluentd plugin by ruby-kafka}
9
+ gem.description = %q{Kafka's produce fluentd plugin by ruby-kafka}
10
+ gem.homepage = "https://github.com/unplus/fluent-plugin-ruby-kafka"
11
+ gem.license = "Apache-2.0"
12
+
13
+ gem.files = `git ls-files -z`.split("\x0")
14
+ gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
+ gem.require_paths = ["lib"]
17
+
18
+ gem.add_development_dependency "rake"
19
+ gem.add_development_dependency "test-unit"
20
+ gem.add_dependency "fluentd", '>= 0.10.59'
21
+ gem.add_dependency "ruby-kafka", '~> 0.3.0', '>= 0.3.2'
22
+ gem.add_dependency "zookeeper", '~> 1.4.0', '>= 1.4.11'
23
+ end
@@ -0,0 +1,96 @@
1
+ # coding: utf-8
2
+
3
+ class RubyKafkaOutput < Fluent::Output
4
+ Fluent::Plugin.register_output('ruby_kafka', self)
5
+
6
+ config_param :zookeepers, :string, :default => nil
7
+
8
+ config_param :brokers, :string, :default => nil
9
+
10
+ config_param :default_topic, :string, :default => nil
11
+
12
+ config_param :max_queue_size, :integer, :default => 1000
13
+
14
+ config_param :delivery_threshold, :integer, :default => 0
15
+
16
+ config_param :delivery_interval, :integer, :default => 0
17
+
18
+ config_param :retry_count, :integer, :default => 3
19
+
20
+ config_param :output_include_tag, :bool, :default => false
21
+
22
+ config_param :output_include_time, :bool, :default => false
23
+
24
+ config_param :use_kafka_log, :bool, :default => false
25
+
26
+ @seed_brokers = []
27
+
28
+ def initialize
29
+ super
30
+ require "kafka"
31
+ require "zookeeper"
32
+ require "json"
33
+ end
34
+
35
+ def configure(conf)
36
+ super
37
+ @seed_brokers = []
38
+ if @zookeepers
39
+ z = Zookeeper.new(@zookeepers)
40
+ z.get_children(:path => '/brokers/ids')[:children].each do |id|
41
+ broker = Yajl.load(z.get(:path => "/brokers/ids/#{id}")[:data])
42
+ @seed_brokers.push("#{broker['host']}:#{broker['port']}")
43
+ end
44
+ z.close
45
+ log.info "brokers has been refreshed via Zookeeper: #{@seed_brokers}"
46
+ end
47
+
48
+ if @seed_brokers.empty? and @brokers
49
+ @seed_brokers = @brokers.match(",").nil? ? [@brokers] : @brokers.split(",")
50
+ log.info "brokers has been set directly: #{@seed_brokers}"
51
+ end
52
+
53
+ raise Fluent::ConfigError, "Broker has not been set." if @seed_brokers.empty?
54
+
55
+ kafka = Kafka.new(seed_brokers: @seed_brokers, logger: @use_kafka_log ? log : nil)
56
+ @producer = kafka.async_producer(
57
+ max_queue_size: @max_queue_size,
58
+ delivery_threshold: @delivery_threshold,
59
+ delivery_interval: @delivery_interval,
60
+ )
61
+ end
62
+
63
+ def start
64
+ super
65
+ end
66
+
67
+ def shutdown
68
+ super
69
+ @producer.shutdown if @producer
70
+ end
71
+
72
+ def emit(tag, es, chain)
73
+ chain.next
74
+ es.each do |time,record|
75
+ record['time'] = time if @output_include_time
76
+ record['tag'] = tag if @output_include_tag
77
+ topic = record['topic'] || @default_topic || tag
78
+
79
+ data = JSON.dump(record)
80
+ retry_counter = 0
81
+ begin
82
+ retry_counter += 1
83
+ @producer.produce(data, topic: topic)
84
+ rescue Kafka::BufferOverflow
85
+ if retry_counter <= @retry_count
86
+ log.warn "Buffer overflow, backing off for 1s. #{retry_counter} time."
87
+ sleep 1
88
+ retry
89
+ else
90
+ raise
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'test/unit'
13
+
14
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
16
+
17
+ require 'fluent/test'
18
+
19
+ unless ENV.has_key?('VERBOSE')
20
+ nulllogger = Object.new
21
+ nulllogger.instance_eval {|obj|
22
+ def method_missing(method, *args)
23
+ # pass
24
+ end
25
+ }
26
+ $log = nulllogger
27
+ end
28
+
29
+ require 'fluent/plugin/out_ruby_kafka'
30
+
31
+ class Test::Unit::TestCase
32
+ end
@@ -0,0 +1,24 @@
1
+ require 'helper'
2
+
3
+ class RubyKafkaOutputTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Fluent::Test.setup
7
+ end
8
+
9
+ CONFIG = %[
10
+ zookeepers zookeeper01:2181,zookeeper02:2181
11
+ default_topic topic1
12
+ max_queue_size 1000
13
+ delivery_threshold 0
14
+ delivery_interval 0
15
+ output_include_tag true
16
+ output_include_time true
17
+ log_level info
18
+ ]
19
+
20
+ def create_driver(conf = CONFIG, tag='test')
21
+ Fluent::Test::OutputTestDriver.new(RubyKafkaOutput, tag).configure(conf)
22
+ end
23
+
24
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-ruby-kafka
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yoshimitsu Kokubo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fluentd
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.59
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.10.59
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby-kafka
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.3.0
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.3.2
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: 0.3.0
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.3.2
75
+ - !ruby/object:Gem::Dependency
76
+ name: zookeeper
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 1.4.0
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 1.4.11
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: 1.4.0
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.4.11
95
+ description: Kafka's produce fluentd plugin by ruby-kafka
96
+ email:
97
+ - yoshi@unplus.net
98
+ executables: []
99
+ extensions: []
100
+ extra_rdoc_files: []
101
+ files:
102
+ - ".gitignore"
103
+ - Gemfile
104
+ - LICENSE.txt
105
+ - README.md
106
+ - Rakefile
107
+ - fluent-plugin-ruby-kafka.gemspec
108
+ - lib/fluent/plugin/out_ruby_kafka.rb
109
+ - test/helper.rb
110
+ - test/plugin/test_out_ruby_kafka.rb
111
+ homepage: https://github.com/unplus/fluent-plugin-ruby-kafka
112
+ licenses:
113
+ - Apache-2.0
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.2.2
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Kafka's produce fluentd plugin by ruby-kafka
135
+ test_files:
136
+ - test/helper.rb
137
+ - test/plugin/test_out_ruby_kafka.rb