fluent-plugin-kafka-enchanced 0.5.30 → 0.5.31
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/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
|