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 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