fluent-plugin-ruby-kafka 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: 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