fluent-plugin-kafka 0.0.8 → 0.0.9
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 +4 -4
- data/README.md +10 -2
- data/fluent-plugin-kafka.gemspec +2 -1
- data/lib/fluent/plugin/out_kafka.rb +15 -1
- data/lib/fluent/plugin/out_kafka_buffered.rb +47 -18
- metadata +29 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cad342ed5984ebc424872a660379b6e471a135d
|
4
|
+
data.tar.gz: 73ea1a4a10f3584f719c45582d54f52b67b52c72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82ff85d1bc2353109a05092f8cda28237bb4b24cec7af7cce539c55c8d4125e3a9a96e540e43ad33bf2dfe63c1120585b4c3ba7430d70812b973894a92cfc79b
|
7
|
+
data.tar.gz: ff574d372eee407d78e199809551bd1ac397c611b018b665416b0c8812cfe3f442b48e75aa320e66933b72a166172d9c09cc0fca913e5141c202d18a0cdd794a
|
data/README.md
CHANGED
@@ -35,7 +35,11 @@ Or install it yourself as:
|
|
35
35
|
|
36
36
|
<match *.**>
|
37
37
|
type kafka
|
38
|
-
|
38
|
+
|
39
|
+
# Brokers: you can choose either brokers or zookeeper.
|
40
|
+
brokers <broker1_host>:<broker1_port>,<broker2_host>:<broker2_port>,.. # Set brokers directly
|
41
|
+
zookeeper <zookeeper_host>:<zookeeper_port> # Set brokers via Zookeeper
|
42
|
+
|
39
43
|
default_topic <output topic>
|
40
44
|
output_data_type (json|ltsv|msgpack|attr:<record name>)
|
41
45
|
output_include_tag (true|false) :default => false
|
@@ -57,7 +61,11 @@ See also [Poseidon::Producer](http://www.rubydoc.info/github/bpot/poseidon/Posei
|
|
57
61
|
|
58
62
|
<match *.**>
|
59
63
|
type kafka_buffered
|
60
|
-
|
64
|
+
|
65
|
+
# Brokers: you can choose either brokers or zookeeper.
|
66
|
+
brokers <broker1_host>:<broker1_port>,<broker2_host>:<broker2_port>,.. # Set brokers directly
|
67
|
+
zookeeper <zookeeper_host>:<zookeeper_port> # Set brokers via Zookeeper
|
68
|
+
|
61
69
|
default_topic <output topic>
|
62
70
|
flush_interval <flush interval (sec) :default => 60>
|
63
71
|
buffer_type (file|memory)
|
data/fluent-plugin-kafka.gemspec
CHANGED
@@ -12,10 +12,11 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
13
|
gem.name = "fluent-plugin-kafka"
|
14
14
|
gem.require_paths = ["lib"]
|
15
|
-
gem.version = '0.0.
|
15
|
+
gem.version = '0.0.9'
|
16
16
|
gem.add_dependency 'fluentd'
|
17
17
|
gem.add_dependency 'poseidon'
|
18
18
|
gem.add_dependency 'ltsv'
|
19
19
|
gem.add_dependency 'yajl-ruby'
|
20
20
|
gem.add_dependency 'msgpack'
|
21
|
+
gem.add_dependency 'zookeeper'
|
21
22
|
end
|
@@ -7,6 +7,7 @@ class Fluent::KafkaOutput < Fluent::Output
|
|
7
7
|
end
|
8
8
|
|
9
9
|
config_param :brokers, :string, :default => 'localhost:9092'
|
10
|
+
config_param :zookeeper, :string, :default => nil
|
10
11
|
config_param :default_topic, :string, :default => nil
|
11
12
|
config_param :default_partition, :integer, :default => 0
|
12
13
|
config_param :client_id, :string, :default => 'kafka'
|
@@ -24,7 +25,20 @@ class Fluent::KafkaOutput < Fluent::Output
|
|
24
25
|
|
25
26
|
def configure(conf)
|
26
27
|
super
|
27
|
-
|
28
|
+
if @zookeeper
|
29
|
+
require 'zookeeper'
|
30
|
+
require 'yajl'
|
31
|
+
@seed_brokers = []
|
32
|
+
z = Zookeeper.new(@zookeeper)
|
33
|
+
z.get_children(:path => '/brokers/ids')[:children].each do |id|
|
34
|
+
broker = Yajl.load(z.get(:path => "/brokers/ids/#{id}")[:data])
|
35
|
+
@seed_brokers.push("#{broker['host']}:#{broker['port']}")
|
36
|
+
end
|
37
|
+
log.info "brokers has been set via Zookeeper: #{@seed_brokers}"
|
38
|
+
else
|
39
|
+
@seed_brokers = @brokers.match(",").nil? ? [@brokers] : @brokers.split(",")
|
40
|
+
log.info "brokers has been set directly: #{@seed_brokers}"
|
41
|
+
end
|
28
42
|
@producers = {} # keyed by topic:partition
|
29
43
|
case @output_data_type
|
30
44
|
when 'json'
|
@@ -8,12 +8,14 @@ class Fluent::KafkaOutputBuffered < Fluent::BufferedOutput
|
|
8
8
|
end
|
9
9
|
|
10
10
|
config_param :brokers, :string, :default => 'localhost:9092'
|
11
|
+
config_param :zookeeper, :string, :default => nil
|
11
12
|
config_param :default_topic, :string, :default => nil
|
12
13
|
config_param :default_partition, :integer, :default => 0
|
13
14
|
config_param :client_id, :string, :default => 'kafka'
|
14
15
|
config_param :output_data_type, :string, :default => 'json'
|
15
16
|
config_param :output_include_tag, :bool, :default => false
|
16
17
|
config_param :output_include_time, :bool, :default => false
|
18
|
+
config_param :kafka_agg_max_bytes, :size, :default => 4*1024 #4k
|
17
19
|
|
18
20
|
# poseidon producer options
|
19
21
|
config_param :max_send_retries, :integer, :default => 3
|
@@ -23,10 +25,27 @@ class Fluent::KafkaOutputBuffered < Fluent::BufferedOutput
|
|
23
25
|
attr_accessor :output_data_type
|
24
26
|
attr_accessor :field_separator
|
25
27
|
|
28
|
+
unless method_defined?(:log)
|
29
|
+
define_method("log") { $log }
|
30
|
+
end
|
31
|
+
|
26
32
|
def configure(conf)
|
27
33
|
super
|
28
|
-
|
29
|
-
|
34
|
+
if @zookeeper
|
35
|
+
require 'zookeeper'
|
36
|
+
require 'yajl'
|
37
|
+
@seed_brokers = []
|
38
|
+
z = Zookeeper.new(@zookeeper)
|
39
|
+
z.get_children(:path => '/brokers/ids')[:children].each do |id|
|
40
|
+
broker = Yajl.load(z.get(:path => "/brokers/ids/#{id}")[:data])
|
41
|
+
@seed_brokers.push("#{broker['host']}:#{broker['port']}")
|
42
|
+
end
|
43
|
+
log.info "brokers has been set via Zookeeper: #{@seed_brokers}"
|
44
|
+
else
|
45
|
+
@seed_brokers = @brokers.match(",").nil? ? [@brokers] : @brokers.split(",")
|
46
|
+
log.info "brokers has been set directly: #{@seed_brokers}"
|
47
|
+
end
|
48
|
+
|
30
49
|
case @output_data_type
|
31
50
|
when 'json'
|
32
51
|
require 'yajl'
|
@@ -58,6 +77,8 @@ class Fluent::KafkaOutputBuffered < Fluent::BufferedOutput
|
|
58
77
|
|
59
78
|
def start
|
60
79
|
super
|
80
|
+
@producer = Poseidon::Producer.new(@seed_brokers, @client_id, :max_send_retries => @max_send_retries, :required_acks => @required_acks, :ack_timeout_ms => @ack_timeout_ms)
|
81
|
+
log.info "initialized producer #{@client_id}"
|
61
82
|
end
|
62
83
|
|
63
84
|
def shutdown
|
@@ -91,26 +112,34 @@ class Fluent::KafkaOutputBuffered < Fluent::BufferedOutput
|
|
91
112
|
|
92
113
|
def write(chunk)
|
93
114
|
records_by_topic = {}
|
115
|
+
bytes_by_topic = {}
|
116
|
+
messages = []
|
117
|
+
messages_bytes = 0
|
94
118
|
chunk.msgpack_each { |tag, time, record|
|
95
119
|
record['time'] = time if @output_include_time
|
96
120
|
record['tag'] = tag if @output_include_tag
|
97
|
-
topic = record['topic'] ||
|
98
|
-
partition = record['partition'] || self.default_partition
|
99
|
-
message = Poseidon::MessageToSend.new(topic, parse_record(record))
|
100
|
-
records_by_topic[topic] ||= []
|
101
|
-
records_by_topic[topic][partition] ||= []
|
102
|
-
records_by_topic[topic][partition] << message
|
103
|
-
}
|
104
|
-
publish(records_by_topic)
|
105
|
-
end
|
121
|
+
topic = record['topic'] || @default_topic || tag
|
106
122
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
123
|
+
records_by_topic[topic] ||= 0
|
124
|
+
bytes_by_topic[topic] ||= 0
|
125
|
+
|
126
|
+
record_buf = parse_record(record)
|
127
|
+
record_buf_bytes = record_buf.bytesize
|
128
|
+
if messages.length > 0 and messages_bytes + record_buf_bytes > @kafka_agg_max_bytes
|
129
|
+
@producer.send_messages(messages)
|
130
|
+
messages = []
|
131
|
+
messages_bytes = 0
|
132
|
+
end
|
133
|
+
messages << Poseidon::MessageToSend.new(topic, record_buf)
|
134
|
+
messages_bytes += record_buf_bytes
|
135
|
+
|
136
|
+
records_by_topic[topic] += 1
|
137
|
+
bytes_by_topic[topic] += record_buf_bytes
|
114
138
|
}
|
139
|
+
if messages.length > 0
|
140
|
+
@producer.send_messages(messages)
|
141
|
+
end
|
142
|
+
log.debug "(records|bytes) (#{records_by_topic}|#{bytes_by_topic})"
|
115
143
|
end
|
144
|
+
|
116
145
|
end
|
metadata
CHANGED
@@ -1,83 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-kafka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hidemasa Togashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: poseidon
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: ltsv
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: yajl-ruby
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: msgpack
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: zookeeper
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
97
|
description: Fluentd plugin for Apache Kafka > 0.8
|
@@ -106,17 +120,17 @@ require_paths:
|
|
106
120
|
- lib
|
107
121
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
122
|
requirements:
|
109
|
-
- -
|
123
|
+
- - ">="
|
110
124
|
- !ruby/object:Gem::Version
|
111
125
|
version: '0'
|
112
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
127
|
requirements:
|
114
|
-
- -
|
128
|
+
- - ">="
|
115
129
|
- !ruby/object:Gem::Version
|
116
130
|
version: '0'
|
117
131
|
requirements: []
|
118
132
|
rubyforge_project:
|
119
|
-
rubygems_version: 2.
|
133
|
+
rubygems_version: 2.2.2
|
120
134
|
signing_key:
|
121
135
|
specification_version: 4
|
122
136
|
summary: Fluentd plugin for Apache Kafka > 0.8
|