fluent-plugin-kafka-enchanced 0.5.30 → 0.5.31
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fluent-plugin-kafka.gemspec +1 -1
- data/lib/fluent/plugin/out_kafka.rb +64 -12
- data/lib/fluent/plugin/out_kafka_buffered.rb +21 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 126ac61c90d73c137a2617876ee242a394659b14
|
4
|
+
data.tar.gz: fc9180ce1429f3aa2af0a4aea3eb12e9254b58cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d2c68b75b7a6b19bed5f1b4dc7fde749ab7355632433c9a982c2daa43e2b554aa40c29ccfef903e3071ace576680e06424b2303ae325201d807ae3b55f96a49
|
7
|
+
data.tar.gz: f9fe60aa46e4be239a965d58063355823c12c046353226723b9edc93ab58f366b7a16800d61f1a28244dcc4b1cd7351c61a56d9da5a2fcff35b314ee3327d5c6
|
data/fluent-plugin-kafka.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
13
|
gem.name = "fluent-plugin-kafka-enchanced"
|
14
14
|
gem.require_paths = ["lib"]
|
15
|
-
gem.version = '0.5.
|
15
|
+
gem.version = '0.5.31'
|
16
16
|
gem.required_ruby_version = ">= 2.1.0"
|
17
17
|
|
18
18
|
gem.add_dependency "fluentd", [">= 0.10.58", "< 2"]
|
@@ -2,6 +2,7 @@ require 'fluent/output'
|
|
2
2
|
require 'fluent/plugin/kafka_plugin_util'
|
3
3
|
require 'pry'
|
4
4
|
require 'digest'
|
5
|
+
require 'redis'
|
5
6
|
|
6
7
|
class Fluent::KafkaOutput < Fluent::Output
|
7
8
|
Fluent::Plugin.register_output('kafka', self)
|
@@ -146,23 +147,54 @@ DESC
|
|
146
147
|
require "avro_turf"
|
147
148
|
require 'avro_turf/messaging'
|
148
149
|
require "avro/builder"
|
150
|
+
init_redis
|
149
151
|
Proc.new do |tag, time, record|
|
150
|
-
record = record.select{|key, value| !key.nil? && !key.empty?}.map
|
152
|
+
record = record.select{|key, value| !key.nil? && !key.empty?}.map do |k, v|
|
153
|
+
[
|
154
|
+
k.tr('[]-', '_').delete('$'),
|
155
|
+
(v.is_a?(Fixnum) || v.is_a?(Float) || v.nil? ? v : v.to_s.force_encoding("UTF-8"))
|
156
|
+
]
|
157
|
+
end.to_h
|
151
158
|
timestamp = Time.new
|
152
159
|
record['enchilada_time_with_format'] = timestamp.strftime("%Y-%m-%dT%H:%M:%S.%LZ")
|
160
|
+
@topic_name = schema_name = "#{tag.to_s.tr('.$:', '_')}_#{Digest::MD5.new.hexdigest(record.keys.to_s)[0..5]}"
|
153
161
|
|
154
|
-
fields = record.map{|key, value| {'name' => key, 'type' => (value.is_a?(Fixnum) ? 'int' : (value.is_a?(Float) ? 'float' : 'string'))}}
|
155
|
-
record['enchilada_timestamp'] = timestamp.strftime('%s%3N').to_i
|
156
|
-
fields << {"name" => "enchilada_timestamp", "type" => "long"}
|
157
|
-
@topic_name = schema_name = "#{tag.to_s.tr('.$:', '_')}_#{Digest::MD5.new.hexdigest(fields.to_s)[0..5]}"
|
158
|
-
schema_json = {
|
159
|
-
"type": "record",
|
160
|
-
"name": schema_name,
|
161
|
-
"fields": fields
|
162
|
-
}.to_json
|
163
|
-
schema = Avro::Schema.parse(schema_json)
|
164
162
|
avro = AvroTurf::Messaging.new(registry_url: @schema_registry)
|
165
|
-
|
163
|
+
|
164
|
+
unless (stored_schema = get_schema_from_redis_by_name(schema_name))
|
165
|
+
fields = record.map do |key, value|
|
166
|
+
{
|
167
|
+
'name' => key,
|
168
|
+
'type' => ['null', (value.is_a?(Fixnum) ? 'int' : (value.is_a?(Float) ? 'float' : 'string'))]
|
169
|
+
}
|
170
|
+
end
|
171
|
+
field_types = fields.map{|field| [field['name'], (field['type'] - ['null']).first]}.to_h
|
172
|
+
fields << {"name" => "enchilada_timestamp", "type" => "long"}
|
173
|
+
schema_json = {
|
174
|
+
"type": "record",
|
175
|
+
"name": schema_name,
|
176
|
+
"fields": fields
|
177
|
+
}.to_json
|
178
|
+
registry = avro.instance_variable_get('@registry')
|
179
|
+
schema = Avro::Schema.parse(schema_json)
|
180
|
+
schema_id = registry.register("#{schema_name}-value", schema)
|
181
|
+
|
182
|
+
stored_schema = {
|
183
|
+
'schema' => schema,
|
184
|
+
'schema_id' => schema_id,
|
185
|
+
'field_types' => field_types
|
186
|
+
}
|
187
|
+
|
188
|
+
set_schema_to_redis(schema_name, stored_schema)
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
record['enchilada_timestamp'] = timestamp.strftime('%s%3N').to_i
|
193
|
+
record = record.map do |key, val|
|
194
|
+
[key, (stored_schema['field_types'][key] != 'string' || val.nil? ? val : val.to_s)]
|
195
|
+
end.to_h
|
196
|
+
|
197
|
+
avro.encode(record, stored_schema['schema_id'], schema: stored_schema['schema'])
|
166
198
|
end
|
167
199
|
elsif @output_data_type == 'ltsv'
|
168
200
|
require 'ltsv'
|
@@ -224,9 +256,29 @@ DESC
|
|
224
256
|
end
|
225
257
|
end
|
226
258
|
|
259
|
+
def init_redis
|
260
|
+
$redis = Redis.new
|
261
|
+
end
|
262
|
+
|
263
|
+
def set_schema_to_redis schema_name, schema
|
264
|
+
$redis.set(schema_name, schema.to_json)
|
265
|
+
end
|
266
|
+
|
267
|
+
def get_schema_from_redis_by_name schema_name
|
268
|
+
if stored_schema = $redis.get(schema_name)
|
269
|
+
parsed_schema = JSON.parse($redis.get(schema_name))
|
270
|
+
{
|
271
|
+
'schema_id' => parsed_schema['schema_id'],
|
272
|
+
'schema' => Avro::Schema.parse(parsed_schema['schema']),
|
273
|
+
'field_types' => parsed_schema['field_types']
|
274
|
+
}
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
227
278
|
end
|
228
279
|
|
229
280
|
|
230
281
|
|
231
282
|
|
232
283
|
|
284
|
+
|
@@ -2,6 +2,7 @@ require 'thread'
|
|
2
2
|
require 'fluent/output'
|
3
3
|
require 'fluent/plugin/kafka_plugin_util'
|
4
4
|
require 'digest'
|
5
|
+
require 'redis'
|
5
6
|
|
6
7
|
class Fluent::KafkaOutputBuffered < Fluent::BufferedOutput
|
7
8
|
Fluent::Plugin.register_output('kafka_buffered', self)
|
@@ -199,6 +200,7 @@ DESC
|
|
199
200
|
require "avro_turf"
|
200
201
|
require 'avro_turf/messaging'
|
201
202
|
require "avro/builder"
|
203
|
+
init_redis
|
202
204
|
Proc.new do |tag, time, record|
|
203
205
|
record = record.select{|key, value| !key.nil? && !key.empty?}.map{|k, v| [k.tr('[]-', '_').delete('$'), ((!v.is_a?(Fixnum) && !v.is_a?(Float)) ? v.to_s.force_encoding("UTF-8") : v)]}.to_h
|
204
206
|
timestamp = Time.new
|
@@ -302,6 +304,25 @@ DESC
|
|
302
304
|
# Raise exception to retry sendind messages
|
303
305
|
raise e
|
304
306
|
end
|
307
|
+
|
308
|
+
def init_redis
|
309
|
+
$redis = Redis.new
|
310
|
+
end
|
311
|
+
|
312
|
+
def set_schema_to_redis schema_name, schema
|
313
|
+
$redis.set(schema_name, schema.to_json)
|
314
|
+
end
|
315
|
+
|
316
|
+
def get_schema_from_redis_by_name schema_name
|
317
|
+
if stored_schema = $redis.get(schema_name)
|
318
|
+
parsed_schema = JSON.parse($redis.get(schema_name))
|
319
|
+
{
|
320
|
+
'schema_id' => parsed_schema['schema_id'],
|
321
|
+
'schema' => Avro::Schema.parse(parsed_schema['schema']),
|
322
|
+
'field_types' => parsed_schema['field_types']
|
323
|
+
}
|
324
|
+
end
|
325
|
+
end
|
305
326
|
end
|
306
327
|
|
307
328
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-kafka-enchanced
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.31
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paschenko Konstantin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|