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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 38f6200587dda4cf3b76e1c6b98d0bbdfeb40df8
4
- data.tar.gz: 9c5404edd306b27b9e1f3225a6df593c1821a3de
3
+ metadata.gz: 126ac61c90d73c137a2617876ee242a394659b14
4
+ data.tar.gz: fc9180ce1429f3aa2af0a4aea3eb12e9254b58cd
5
5
  SHA512:
6
- metadata.gz: 54c8c4b8a1319522bf06200a9f19b142e7f0951df5877b976071fa6a6aa272b7ddd1fe4ce75c60f7ec93a0500fad678b76ae231f394ae9390607ae8ea1248a73
7
- data.tar.gz: 25ef86c883b9a1cb2de5a1321d7bf534c0ce95c78036e31caa5b51abfe958a9822fd5fb779d7d0573d670ced91bd6f35b1ee983b47d40df27dcfdd4079e7bd24
6
+ metadata.gz: 6d2c68b75b7a6b19bed5f1b4dc7fde749ab7355632433c9a982c2daa43e2b554aa40c29ccfef903e3071ace576680e06424b2303ae325201d807ae3b55f96a49
7
+ data.tar.gz: f9fe60aa46e4be239a965d58063355823c12c046353226723b9edc93ab58f366b7a16800d61f1a28244dcc4b1cd7351c61a56d9da5a2fcff35b314ee3327d5c6
@@ -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.30'
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{|k, v| [k.tr('[]-', '_').delete('$'), ((!v.is_a?(Fixnum) && !v.is_a?(Float)) ? v.to_s.force_encoding("UTF-8") : v)]}.to_h
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
- avro.encode(record, schema: schema, subject: "#{schema_name}-value")
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.30
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-28 00:00:00.000000000 Z
11
+ date: 2017-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd