ruby-kafka 0.4.3 → 0.4.4
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/CHANGELOG.md +4 -1
- data/examples/consumer-group.rb +26 -0
- data/lib/kafka.rb +4 -3
- data/lib/kafka/broker.rb +4 -0
- data/lib/kafka/broker_pool.rb +6 -1
- data/lib/kafka/cluster.rb +13 -2
- data/lib/kafka/connection.rb +4 -0
- data/lib/kafka/consumer.rb +15 -2
- data/lib/kafka/fetch_operation.rb +4 -0
- data/lib/kafka/statsd.rb +3 -0
- data/lib/kafka/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f09ed3cd80d943c7aa595e43c3de6fd1bd0f883
|
4
|
+
data.tar.gz: 5906a940b05edf1ee429c184e03d4f2490b2454a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e352a9d47347f413ffafe9e89fca1369a6aa2de17da5b65de2adf3ba659784aea6939b127411626f7889941e084d57d4329b047e5aba26f83d31a5f312b3caaf
|
7
|
+
data.tar.gz: c1e97414fa1a314ec8e6f9f63fe992544d50c3dd6c0650ac1c2f76ba5866a0c3ed3457f38d71021f9669e6dcc904498a2f9c6ee63542234e94fd5ff000ff4c27
|
data/CHANGELOG.md
CHANGED
@@ -4,10 +4,13 @@ Changes and additions to the library will be listed here.
|
|
4
4
|
|
5
5
|
## Unreleased
|
6
6
|
|
7
|
+
## v0.4.4
|
8
|
+
|
9
|
+
- Include the offset lag in batch consumer metrics (Statsd).
|
10
|
+
|
7
11
|
## v0.4.3
|
8
12
|
|
9
13
|
- Restart the async producer thread automatically after errors.
|
10
|
-
- Include the offset lag in batch consumer metrics (Statsd).
|
11
14
|
- Make the default `max_wait_time` more sane.
|
12
15
|
- Fix issue with cached default offset lookups (#431).
|
13
16
|
- Upgrade to Datadog client version 3.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
|
2
|
+
|
3
|
+
require "kafka"
|
4
|
+
|
5
|
+
logger = Logger.new(STDOUT)
|
6
|
+
brokers = ENV.fetch("KAFKA_BROKERS", "localhost:9092").split(",")
|
7
|
+
|
8
|
+
# Make sure to create this topic in your Kafka cluster or configure the
|
9
|
+
# cluster to auto-create topics.
|
10
|
+
topic = "text"
|
11
|
+
|
12
|
+
kafka = Kafka.new(
|
13
|
+
seed_brokers: brokers,
|
14
|
+
client_id: "test",
|
15
|
+
socket_timeout: 20,
|
16
|
+
logger: logger,
|
17
|
+
)
|
18
|
+
|
19
|
+
consumer = kafka.consumer(group_id: "test")
|
20
|
+
consumer.subscribe(topic)
|
21
|
+
|
22
|
+
trap("TERM") { consumer.stop }
|
23
|
+
|
24
|
+
consumer.each_message do |message|
|
25
|
+
puts message.value
|
26
|
+
end
|
data/lib/kafka.rb
CHANGED
@@ -17,6 +17,10 @@ module Kafka
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
# A fetch operation was executed with no partitions specified.
|
21
|
+
class NoPartitionsToFetchFrom < Error
|
22
|
+
end
|
23
|
+
|
20
24
|
# Subclasses of this exception class map to an error code described in the
|
21
25
|
# Kafka protocol specification.
|
22
26
|
#
|
@@ -221,9 +225,6 @@ module Kafka
|
|
221
225
|
class FetchError < Error
|
222
226
|
end
|
223
227
|
|
224
|
-
class NoPartitionsAssignedError < Error
|
225
|
-
end
|
226
|
-
|
227
228
|
# Initializes a new Kafka client.
|
228
229
|
#
|
229
230
|
# @see Client#initialize
|
data/lib/kafka/broker.rb
CHANGED
data/lib/kafka/broker_pool.rb
CHANGED
@@ -9,7 +9,12 @@ module Kafka
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def connect(host, port, node_id: nil)
|
12
|
-
|
12
|
+
if @brokers.key?(node_id)
|
13
|
+
broker = @brokers.fetch(node_id)
|
14
|
+
return broker if broker.address_match?(host, port)
|
15
|
+
broker.disconnect
|
16
|
+
@brokers[node_id] = nil
|
17
|
+
end
|
13
18
|
|
14
19
|
broker = Broker.new(
|
15
20
|
connection: @connection_builder.build_connection(host, port),
|
data/lib/kafka/cluster.rb
CHANGED
@@ -93,9 +93,20 @@ module Kafka
|
|
93
93
|
Protocol.handle_error(response.error_code)
|
94
94
|
|
95
95
|
coordinator_id = response.coordinator_id
|
96
|
-
coordinator = connect_to_broker(coordinator_id)
|
97
96
|
|
98
|
-
@logger.debug "Coordinator for group `#{group_id}` is #{
|
97
|
+
@logger.debug "Coordinator for group `#{group_id}` is #{coordinator_id}. Connecting..."
|
98
|
+
|
99
|
+
# It's possible that a new broker is introduced to the cluster and
|
100
|
+
# becomes the coordinator before we have a chance to refresh_metadata.
|
101
|
+
coordinator = begin
|
102
|
+
connect_to_broker(coordinator_id)
|
103
|
+
rescue Kafka::NoSuchBroker
|
104
|
+
@logger.debug "Broker #{coordinator_id} missing from broker cache, refreshing"
|
105
|
+
refresh_metadata!
|
106
|
+
connect_to_broker(coordinator_id)
|
107
|
+
end
|
108
|
+
|
109
|
+
@logger.debug "Connected to coordinator: #{coordinator} for group `#{group_id}`"
|
99
110
|
|
100
111
|
return coordinator
|
101
112
|
rescue GroupCoordinatorNotAvailable
|
data/lib/kafka/connection.rb
CHANGED
data/lib/kafka/consumer.rb
CHANGED
@@ -216,6 +216,8 @@ module Kafka
|
|
216
216
|
|
217
217
|
# We may not have received any messages, but it's still a good idea to
|
218
218
|
# commit offsets if we've processed messages in the last set of batches.
|
219
|
+
# This also ensures the offsets are retained if we haven't read any messages
|
220
|
+
# since the offset retention period has elapsed.
|
219
221
|
@offset_manager.commit_offsets_if_necessary
|
220
222
|
end
|
221
223
|
end
|
@@ -279,6 +281,12 @@ module Kafka
|
|
279
281
|
|
280
282
|
return if !@running
|
281
283
|
end
|
284
|
+
|
285
|
+
# We may not have received any messages, but it's still a good idea to
|
286
|
+
# commit offsets if we've processed messages in the last set of batches.
|
287
|
+
# This also ensures the offsets are retained if we haven't read any messages
|
288
|
+
# since the offset retention period has elapsed.
|
289
|
+
@offset_manager.commit_offsets_if_necessary
|
282
290
|
end
|
283
291
|
end
|
284
292
|
|
@@ -377,8 +385,6 @@ module Kafka
|
|
377
385
|
|
378
386
|
@heartbeat.send_if_necessary
|
379
387
|
|
380
|
-
raise NoPartitionsAssignedError if subscribed_partitions.empty?
|
381
|
-
|
382
388
|
operation = FetchOperation.new(
|
383
389
|
cluster: @cluster,
|
384
390
|
logger: @logger,
|
@@ -401,6 +407,13 @@ module Kafka
|
|
401
407
|
end
|
402
408
|
|
403
409
|
operation.execute
|
410
|
+
rescue NoPartitionsToFetchFrom
|
411
|
+
backoff = max_wait_time > 0 ? max_wait_time : 1
|
412
|
+
|
413
|
+
@logger.info "There are no partitions to fetch from, sleeping for #{backoff}s"
|
414
|
+
sleep backoff
|
415
|
+
|
416
|
+
retry
|
404
417
|
rescue OffsetOutOfRange => e
|
405
418
|
@logger.error "Invalid offset for #{e.topic}/#{e.partition}, resetting to default offset"
|
406
419
|
|
@@ -46,6 +46,10 @@ module Kafka
|
|
46
46
|
|
47
47
|
topics_by_broker = {}
|
48
48
|
|
49
|
+
if @topics.none? {|topic, partitions| partitions.any? }
|
50
|
+
raise NoPartitionsToFetchFrom
|
51
|
+
end
|
52
|
+
|
49
53
|
@topics.each do |topic, partitions|
|
50
54
|
partitions.each do |partition, options|
|
51
55
|
broker = @cluster.get_leader(topic, partition)
|
data/lib/kafka/statsd.rb
CHANGED
@@ -97,6 +97,7 @@ module Kafka
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def process_batch(event)
|
100
|
+
lag = event.payload.fetch(:offset_lag)
|
100
101
|
messages = event.payload.fetch(:message_count)
|
101
102
|
client = event.payload.fetch(:client_id)
|
102
103
|
group_id = event.payload.fetch(:group_id)
|
@@ -109,6 +110,8 @@ module Kafka
|
|
109
110
|
timing("consumer.#{client}.#{group_id}.#{topic}.#{partition}.process_batch.latency", event.duration)
|
110
111
|
count("consumer.#{client}.#{group_id}.#{topic}.#{partition}.messages", messages)
|
111
112
|
end
|
113
|
+
|
114
|
+
gauge("consumer.#{client}.#{group_id}.#{topic}.#{partition}.lag", lag)
|
112
115
|
end
|
113
116
|
|
114
117
|
def join_group(event)
|
data/lib/kafka/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-kafka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -272,6 +272,7 @@ files:
|
|
272
272
|
- ci/init.rb
|
273
273
|
- ci/producer.rb
|
274
274
|
- circle.yml
|
275
|
+
- examples/consumer-group.rb
|
275
276
|
- examples/firehose-consumer.rb
|
276
277
|
- examples/firehose-producer.rb
|
277
278
|
- examples/simple-consumer.rb
|
@@ -380,7 +381,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
380
381
|
version: '0'
|
381
382
|
requirements: []
|
382
383
|
rubyforge_project:
|
383
|
-
rubygems_version: 2.6.
|
384
|
+
rubygems_version: 2.6.13
|
384
385
|
signing_key:
|
385
386
|
specification_version: 4
|
386
387
|
summary: A client library for the Kafka distributed commit log.
|