kafka_rest_client 0.1.0 → 0.2.0

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: 55eaec42836887d93b9460701cdca823c0f63f77
4
- data.tar.gz: b6eeb11b3fa7c973c2b3d51fe00631f5b92b63d6
3
+ metadata.gz: f604a5dc722bd5ab97847866e46f6326774bc4b5
4
+ data.tar.gz: 3d0d283bb69fe749ea2beb0c633e8f4119a190e7
5
5
  SHA512:
6
- metadata.gz: d9af06c6d72c0284905b76883f4dfc338eae7c6d39bfdb54ffefede69cd8b6462b1ac761085fced8340d9a274b7f76a46ae0ded6d59c5979fe13b9a1f49fa456
7
- data.tar.gz: 3ac7cd879e202aea4ef4010099f3816455cd796d9545b316768a54098905a57e8b30f915fdb50acaae0b1f02f9b264d9f48b7e3e49261e4c2c0b977927366c3c
6
+ metadata.gz: b1f3a451c16bd800b1c521aea53faf45dfd4610d326f7c7b201daf975e6114e2260046de1bbc424f15a3afbb70c46ee63f5b3dbe167bbb331a07f9a7d876fcad
7
+ data.tar.gz: 2806b9c5e14cddc9df9ca8e17225830f54594860651758aeec031946a196abee1e552d1d53e9a64c478f333669c887875b1a0ae414650ff70f2cd28f90e8433a
data/README.md CHANGED
@@ -31,11 +31,24 @@ end
31
31
  producer = KafkaRestClient::AvroProducer.new
32
32
 
33
33
  # Produce a single event using the topic name and payload
34
+ # The schema will be fetched from the schema registry based on the topic name
34
35
  producer.produce('ice-cream-melted', { temperature: 35, unit: 'celsius' })
35
36
 
36
37
  # Produce multiple events
38
+ # The schema will also be fetched from the schema registry based on the topic name
37
39
  producer.produce('ice-cream-melted', [{ temperature: 35, unit: 'celsius' }])
38
40
 
41
+ # Produce an event providing the schema id
42
+ producer.produce('ice-cream-melted', { temperature: 35, unit: 'celsius' }, value_schema_id: 1)
43
+
44
+ # Produce an event providing the full schema
45
+ schema = {
46
+ type: 'record',
47
+ name: 'IceCreamMelted',
48
+ fields: [{ name: 'Temperature', type: 'string' }, { name: 'Unit', type: 'string' }]
49
+ }
50
+ producer.produce('ice-cream-melted', { temperature: 35, unit: 'celsius' }, value_schema: schema.to_json)
51
+
39
52
  # Produce event objects by relying on #to_json and #as_json when using Rails ActiveSupport
40
53
  class IceCreamMeltedEvent
41
54
  attr_reader :temperature, :unit
@@ -58,8 +71,6 @@ rescue KafkaRestClient::SchemaNotFoundError => e
58
71
  # Schema has not been registered in the schema registry
59
72
  rescue KafkaRestClient::TopicNotFoundError => e
60
73
  # Topic does not exist in Kafka, create it with confluent tools
61
- rescue KafkaRestClient::Error => e
62
- # Rescue any error raised by the library
63
74
  end
64
75
  ```
65
76
 
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'kafka_rest_client'
7
- spec.version = '0.1.0'
7
+ spec.version = '0.2.0'
8
8
  spec.authors = ['Funding Circle Engineering']
9
9
  spec.email = ['engineering+kafka_rest_client@fundingcircle.com']
10
10
 
@@ -22,9 +22,9 @@ module KafkaRestClient
22
22
  end
23
23
  end
24
24
 
25
- def produce(topic, events)
25
+ def produce(topic, events, options = {})
26
26
  if enabled?
27
- payload = build_event_payload(topic, Array(events))
27
+ payload = build_event_payload(topic, Array(events), options)
28
28
  response = post_event_to_kafka(topic, payload)
29
29
  config.logger.debug("Produced to Kafka topic #{topic}: #{payload.inspect}")
30
30
  response
@@ -33,11 +33,16 @@ module KafkaRestClient
33
33
 
34
34
  private
35
35
 
36
- def build_event_payload(topic, events)
37
- {
38
- value_schema_id: get_latest_schema(topic).fetch('id'),
39
- records: events.map { |event| { value: event } }
40
- }
36
+ def build_event_payload(topic, events, options)
37
+ payload = { records: events.map { |event| { value: event } } }.merge(
38
+ options.select { |k, _| [:value_schema_id, :value_schema].include?(k) }
39
+ )
40
+
41
+ if !options[:value_schema_id] && !options[:value_schema]
42
+ payload[:value_schema_id] = get_latest_schema(topic).fetch('id')
43
+ end
44
+
45
+ payload
41
46
  end
42
47
 
43
48
  def get_latest_schema(topic)
@@ -55,7 +60,7 @@ module KafkaRestClient
55
60
  elsif response.code == 503
56
61
  fail BadGateway, "Bad gateway: #{response.body}"
57
62
  else
58
- fail "Unexpected error: #{response.body}"
63
+ fail Error, "HTTP status: #{response.code} #{response.body}"
59
64
  end
60
65
  end
61
66
 
@@ -71,7 +76,7 @@ module KafkaRestClient
71
76
  config.logger.debug("#{message[:records].count} event(s) published on #{topic}")
72
77
  JSON.parse(response.body)
73
78
  elsif response.code == 404
74
- fail SchemaNotFoundError,
79
+ fail TopicNotFoundError,
75
80
  "Topic #{topic} not found in schema registry"
76
81
  elsif response.code == 422
77
82
  fail SchemaValidationError,
@@ -82,7 +87,7 @@ module KafkaRestClient
82
87
  elsif response.code == 503
83
88
  fail BadGateway, "Bad gateway: #{response.body}"
84
89
  else
85
- fail "Unexpected error: #{response.body}"
90
+ fail Error, "HTTP status: #{response.code} #{response.body}"
86
91
  end
87
92
  end
88
93
  end
@@ -5,6 +5,9 @@ module KafkaRestClient
5
5
  # Exception raised when the desired schema is not found (404 response code)
6
6
  class SchemaNotFoundError < Error; end
7
7
 
8
+ # Exception raised when the desired topic is not found (404 response code)
9
+ class TopicNotFoundError < Error; end
10
+
8
11
  # Exception raised on an internal server error (500 response code)
9
12
  class InternalServerError < Error; end
10
13
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kafka_rest_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Funding Circle Engineering