ruby-kafka 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|