ruby-kafka-custom 0.7.7.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +7 -0
  2. data/lib/kafka/async_producer.rb +279 -0
  3. data/lib/kafka/broker.rb +205 -0
  4. data/lib/kafka/broker_info.rb +16 -0
  5. data/lib/kafka/broker_pool.rb +41 -0
  6. data/lib/kafka/broker_uri.rb +43 -0
  7. data/lib/kafka/client.rb +754 -0
  8. data/lib/kafka/cluster.rb +455 -0
  9. data/lib/kafka/compression.rb +43 -0
  10. data/lib/kafka/compressor.rb +85 -0
  11. data/lib/kafka/connection.rb +220 -0
  12. data/lib/kafka/connection_builder.rb +33 -0
  13. data/lib/kafka/consumer.rb +592 -0
  14. data/lib/kafka/consumer_group.rb +208 -0
  15. data/lib/kafka/datadog.rb +413 -0
  16. data/lib/kafka/fetch_operation.rb +115 -0
  17. data/lib/kafka/fetched_batch.rb +54 -0
  18. data/lib/kafka/fetched_batch_generator.rb +117 -0
  19. data/lib/kafka/fetched_message.rb +47 -0
  20. data/lib/kafka/fetched_offset_resolver.rb +48 -0
  21. data/lib/kafka/fetcher.rb +221 -0
  22. data/lib/kafka/gzip_codec.rb +30 -0
  23. data/lib/kafka/heartbeat.rb +25 -0
  24. data/lib/kafka/instrumenter.rb +38 -0
  25. data/lib/kafka/lz4_codec.rb +23 -0
  26. data/lib/kafka/message_buffer.rb +87 -0
  27. data/lib/kafka/offset_manager.rb +248 -0
  28. data/lib/kafka/partitioner.rb +35 -0
  29. data/lib/kafka/pause.rb +92 -0
  30. data/lib/kafka/pending_message.rb +29 -0
  31. data/lib/kafka/pending_message_queue.rb +41 -0
  32. data/lib/kafka/produce_operation.rb +205 -0
  33. data/lib/kafka/producer.rb +504 -0
  34. data/lib/kafka/protocol.rb +217 -0
  35. data/lib/kafka/protocol/add_partitions_to_txn_request.rb +34 -0
  36. data/lib/kafka/protocol/add_partitions_to_txn_response.rb +47 -0
  37. data/lib/kafka/protocol/alter_configs_request.rb +44 -0
  38. data/lib/kafka/protocol/alter_configs_response.rb +49 -0
  39. data/lib/kafka/protocol/api_versions_request.rb +21 -0
  40. data/lib/kafka/protocol/api_versions_response.rb +53 -0
  41. data/lib/kafka/protocol/consumer_group_protocol.rb +19 -0
  42. data/lib/kafka/protocol/create_partitions_request.rb +42 -0
  43. data/lib/kafka/protocol/create_partitions_response.rb +28 -0
  44. data/lib/kafka/protocol/create_topics_request.rb +45 -0
  45. data/lib/kafka/protocol/create_topics_response.rb +26 -0
  46. data/lib/kafka/protocol/decoder.rb +175 -0
  47. data/lib/kafka/protocol/delete_topics_request.rb +33 -0
  48. data/lib/kafka/protocol/delete_topics_response.rb +26 -0
  49. data/lib/kafka/protocol/describe_configs_request.rb +35 -0
  50. data/lib/kafka/protocol/describe_configs_response.rb +73 -0
  51. data/lib/kafka/protocol/describe_groups_request.rb +27 -0
  52. data/lib/kafka/protocol/describe_groups_response.rb +73 -0
  53. data/lib/kafka/protocol/encoder.rb +184 -0
  54. data/lib/kafka/protocol/end_txn_request.rb +29 -0
  55. data/lib/kafka/protocol/end_txn_response.rb +19 -0
  56. data/lib/kafka/protocol/fetch_request.rb +70 -0
  57. data/lib/kafka/protocol/fetch_response.rb +136 -0
  58. data/lib/kafka/protocol/find_coordinator_request.rb +29 -0
  59. data/lib/kafka/protocol/find_coordinator_response.rb +29 -0
  60. data/lib/kafka/protocol/heartbeat_request.rb +27 -0
  61. data/lib/kafka/protocol/heartbeat_response.rb +17 -0
  62. data/lib/kafka/protocol/init_producer_id_request.rb +26 -0
  63. data/lib/kafka/protocol/init_producer_id_response.rb +27 -0
  64. data/lib/kafka/protocol/join_group_request.rb +41 -0
  65. data/lib/kafka/protocol/join_group_response.rb +33 -0
  66. data/lib/kafka/protocol/leave_group_request.rb +25 -0
  67. data/lib/kafka/protocol/leave_group_response.rb +17 -0
  68. data/lib/kafka/protocol/list_groups_request.rb +23 -0
  69. data/lib/kafka/protocol/list_groups_response.rb +35 -0
  70. data/lib/kafka/protocol/list_offset_request.rb +53 -0
  71. data/lib/kafka/protocol/list_offset_response.rb +89 -0
  72. data/lib/kafka/protocol/member_assignment.rb +42 -0
  73. data/lib/kafka/protocol/message.rb +172 -0
  74. data/lib/kafka/protocol/message_set.rb +55 -0
  75. data/lib/kafka/protocol/metadata_request.rb +31 -0
  76. data/lib/kafka/protocol/metadata_response.rb +185 -0
  77. data/lib/kafka/protocol/offset_commit_request.rb +47 -0
  78. data/lib/kafka/protocol/offset_commit_response.rb +29 -0
  79. data/lib/kafka/protocol/offset_fetch_request.rb +36 -0
  80. data/lib/kafka/protocol/offset_fetch_response.rb +56 -0
  81. data/lib/kafka/protocol/produce_request.rb +92 -0
  82. data/lib/kafka/protocol/produce_response.rb +63 -0
  83. data/lib/kafka/protocol/record.rb +88 -0
  84. data/lib/kafka/protocol/record_batch.rb +222 -0
  85. data/lib/kafka/protocol/request_message.rb +26 -0
  86. data/lib/kafka/protocol/sasl_handshake_request.rb +33 -0
  87. data/lib/kafka/protocol/sasl_handshake_response.rb +28 -0
  88. data/lib/kafka/protocol/sync_group_request.rb +33 -0
  89. data/lib/kafka/protocol/sync_group_response.rb +23 -0
  90. data/lib/kafka/round_robin_assignment_strategy.rb +54 -0
  91. data/lib/kafka/sasl/gssapi.rb +76 -0
  92. data/lib/kafka/sasl/oauth.rb +64 -0
  93. data/lib/kafka/sasl/plain.rb +39 -0
  94. data/lib/kafka/sasl/scram.rb +177 -0
  95. data/lib/kafka/sasl_authenticator.rb +61 -0
  96. data/lib/kafka/snappy_codec.rb +25 -0
  97. data/lib/kafka/socket_with_timeout.rb +96 -0
  98. data/lib/kafka/ssl_context.rb +66 -0
  99. data/lib/kafka/ssl_socket_with_timeout.rb +187 -0
  100. data/lib/kafka/statsd.rb +296 -0
  101. data/lib/kafka/tagged_logger.rb +72 -0
  102. data/lib/kafka/transaction_manager.rb +261 -0
  103. data/lib/kafka/transaction_state_machine.rb +72 -0
  104. data/lib/kafka/version.rb +5 -0
  105. metadata +461 -0
@@ -0,0 +1,72 @@
1
+ require 'forwardable'
2
+
3
+ # Basic implementation of a tagged logger that matches the API of
4
+ # ActiveSupport::TaggedLogging.
5
+
6
+ module Kafka
7
+ module TaggedFormatter
8
+
9
+ def call(severity, timestamp, progname, msg)
10
+ super(severity, timestamp, progname, "#{tags_text}#{msg}")
11
+ end
12
+
13
+ def tagged(*tags)
14
+ new_tags = push_tags(*tags)
15
+ yield self
16
+ ensure
17
+ pop_tags(new_tags.size)
18
+ end
19
+
20
+ def push_tags(*tags)
21
+ tags.flatten.reject { |t| t.nil? || t.empty? }.tap do |new_tags|
22
+ current_tags.concat new_tags
23
+ end
24
+ end
25
+
26
+ def pop_tags(size = 1)
27
+ current_tags.pop size
28
+ end
29
+
30
+ def clear_tags!
31
+ current_tags.clear
32
+ end
33
+
34
+ def current_tags
35
+ # We use our object ID here to avoid conflicting with other instances
36
+ thread_key = @thread_key ||= "kafka_tagged_logging_tags:#{object_id}".freeze
37
+ Thread.current[thread_key] ||= []
38
+ end
39
+
40
+ def tags_text
41
+ tags = current_tags
42
+ if tags.any?
43
+ tags.collect { |tag| "[#{tag}] " }.join
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ module TaggedLogger
50
+ extend Forwardable
51
+ delegate [:push_tags, :pop_tags, :clear_tags!] => :formatter
52
+
53
+ def self.new(logger)
54
+ logger ||= Logger.new(nil)
55
+ return logger if logger.respond_to?(:push_tags) # already included
56
+ # Ensure we set a default formatter so we aren't extending nil!
57
+ logger.formatter ||= Logger::Formatter.new
58
+ logger.formatter.extend TaggedFormatter
59
+ logger.extend(self)
60
+ end
61
+
62
+ def tagged(*tags)
63
+ formatter.tagged(*tags) { yield self }
64
+ end
65
+
66
+ def flush
67
+ clear_tags!
68
+ super if defined?(super)
69
+ end
70
+ end
71
+
72
+ end
@@ -0,0 +1,261 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kafka/transaction_state_machine'
4
+
5
+ module Kafka
6
+ class TransactionManager
7
+ DEFAULT_TRANSACTION_TIMEOUT = 60 # 60 seconds
8
+ TRANSACTION_RESULT_COMMIT = true
9
+ TRANSACTION_RESULT_ABORT = false
10
+
11
+ attr_reader :producer_id, :producer_epoch, :transactional_id
12
+
13
+ def initialize(
14
+ cluster:,
15
+ logger:,
16
+ idempotent: false,
17
+ transactional: false,
18
+ transactional_id: nil,
19
+ transactional_timeout: DEFAULT_TRANSACTION_TIMEOUT
20
+ )
21
+ @cluster = cluster
22
+ @logger = TaggedLogger.new(logger)
23
+
24
+ @transactional = transactional
25
+ @transactional_id = transactional_id
26
+ @transactional_timeout = transactional_timeout
27
+ @transaction_state = Kafka::TransactionStateMachine.new(logger: logger)
28
+ @transaction_partitions = {}
29
+
30
+ # If transactional mode is enabled, idempotent must be enabled
31
+ @idempotent = transactional || idempotent
32
+
33
+ @producer_id = -1
34
+ @producer_epoch = 0
35
+
36
+ @sequences = {}
37
+ end
38
+
39
+ def idempotent?
40
+ @idempotent == true
41
+ end
42
+
43
+ def transactional?
44
+ @transactional == true && !@transactional_id.nil?
45
+ end
46
+
47
+ def init_producer_id(force = false)
48
+ return if @producer_id >= 0 && !force
49
+
50
+ response = transaction_coordinator.init_producer_id(
51
+ transactional_id: @transactional_id,
52
+ transactional_timeout: @transactional_timeout
53
+ )
54
+ Protocol.handle_error(response.error_code)
55
+
56
+ # Reset producer id
57
+ @producer_id = response.producer_id
58
+ @producer_epoch = response.producer_epoch
59
+
60
+ # Reset sequence
61
+ @sequences = {}
62
+
63
+ @logger.debug "Current Producer ID is #{@producer_id} and Producer Epoch is #{@producer_epoch}"
64
+ end
65
+
66
+ def next_sequence_for(topic, partition)
67
+ @sequences[topic] ||= {}
68
+ @sequences[topic][partition] ||= 0
69
+ end
70
+
71
+ def update_sequence_for(topic, partition, sequence)
72
+ @sequences[topic] ||= {}
73
+ @sequences[topic][partition] = sequence
74
+ end
75
+
76
+ def init_transactions
77
+ force_transactional!
78
+ unless @transaction_state.uninitialized?
79
+ @logger.warn("Transaction already initialized!")
80
+ return
81
+ end
82
+ init_producer_id(true)
83
+ @transaction_partitions = {}
84
+ @transaction_state.transition_to!(TransactionStateMachine::READY)
85
+
86
+ @logger.info "Transaction #{@transactional_id} is initialized, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
87
+
88
+ nil
89
+ rescue
90
+ @transaction_state.transition_to!(TransactionStateMachine::ERROR)
91
+ raise
92
+ end
93
+
94
+ def add_partitions_to_transaction(topic_partitions)
95
+ force_transactional!
96
+
97
+ if @transaction_state.uninitialized?
98
+ raise 'Transaction is uninitialized'
99
+ end
100
+
101
+ # Extract newly created partitions
102
+ new_topic_partitions = {}
103
+ topic_partitions.each do |topic, partitions|
104
+ partitions.each do |partition|
105
+ @transaction_partitions[topic] ||= {}
106
+ if !@transaction_partitions[topic][partition]
107
+ new_topic_partitions[topic] ||= []
108
+ new_topic_partitions[topic] << partition
109
+
110
+ @logger.info "Adding parition #{topic}/#{partition} to transaction #{@transactional_id}, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
111
+ end
112
+ end
113
+ end
114
+
115
+ unless new_topic_partitions.empty?
116
+ response = transaction_coordinator.add_partitions_to_txn(
117
+ transactional_id: @transactional_id,
118
+ producer_id: @producer_id,
119
+ producer_epoch: @producer_epoch,
120
+ topics: new_topic_partitions
121
+ )
122
+
123
+ # Update added topic partitions
124
+ response.errors.each do |tp|
125
+ tp.partitions.each do |p|
126
+ Protocol.handle_error(p.error_code)
127
+ @transaction_partitions[tp.topic] ||= {}
128
+ @transaction_partitions[tp.topic][p.partition] = true
129
+ end
130
+ end
131
+ end
132
+
133
+ nil
134
+ rescue
135
+ @transaction_state.transition_to!(TransactionStateMachine::ERROR)
136
+ raise
137
+ end
138
+
139
+ def begin_transaction
140
+ force_transactional!
141
+ raise 'Transaction has already started' if @transaction_state.in_transaction?
142
+ raise 'Transaction is not ready' unless @transaction_state.ready?
143
+ @transaction_state.transition_to!(TransactionStateMachine::IN_TRANSACTION)
144
+
145
+ @logger.info "Begin transaction #{@transactional_id}, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
146
+
147
+ nil
148
+ rescue
149
+ @transaction_state.transition_to!(TransactionStateMachine::ERROR)
150
+ raise
151
+ end
152
+
153
+ def commit_transaction
154
+ force_transactional!
155
+
156
+ if @transaction_state.committing_transaction?
157
+ @logger.warn("Transaction is being committed")
158
+ return
159
+ end
160
+
161
+ unless @transaction_state.in_transaction?
162
+ raise 'Transaction is not valid to commit'
163
+ end
164
+
165
+ @transaction_state.transition_to!(TransactionStateMachine::COMMITTING_TRANSACTION)
166
+
167
+ @logger.info "Commiting transaction #{@transactional_id}, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
168
+
169
+ response = transaction_coordinator.end_txn(
170
+ transactional_id: @transactional_id,
171
+ producer_id: @producer_id,
172
+ producer_epoch: @producer_epoch,
173
+ transaction_result: TRANSACTION_RESULT_COMMIT
174
+ )
175
+ Protocol.handle_error(response.error_code)
176
+
177
+ @logger.info "Transaction #{@transactional_id} is committed, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
178
+ complete_transaction
179
+
180
+ nil
181
+ rescue
182
+ @transaction_state.transition_to!(TransactionStateMachine::ERROR)
183
+ raise
184
+ end
185
+
186
+ def abort_transaction
187
+ force_transactional!
188
+
189
+ if @transaction_state.aborting_transaction?
190
+ @logger.warn("Transaction is being aborted")
191
+ return
192
+ end
193
+
194
+ unless @transaction_state.in_transaction?
195
+ raise 'Transaction is not valid to abort'
196
+ end
197
+
198
+ @transaction_state.transition_to!(TransactionStateMachine::ABORTING_TRANSACTION)
199
+
200
+ @logger.info "Aborting transaction #{@transactional_id}, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
201
+
202
+ response = transaction_coordinator.end_txn(
203
+ transactional_id: @transactional_id,
204
+ producer_id: @producer_id,
205
+ producer_epoch: @producer_epoch,
206
+ transaction_result: TRANSACTION_RESULT_ABORT
207
+ )
208
+ Protocol.handle_error(response.error_code)
209
+
210
+ @logger.info "Transaction #{@transactional_id} is aborted, Producer ID: #{@producer_id} (Epoch #{@producer_epoch})"
211
+
212
+ complete_transaction
213
+
214
+ nil
215
+ rescue
216
+ @transaction_state.transition_to!(TransactionStateMachine::ERROR)
217
+ raise
218
+ end
219
+
220
+ def in_transaction?
221
+ @transaction_state.in_transaction?
222
+ end
223
+
224
+ def error?
225
+ @transaction_state.error?
226
+ end
227
+
228
+ def close
229
+ if in_transaction?
230
+ @logger.warn("Aborting pending transaction ...")
231
+ abort_transaction
232
+ elsif @transaction_state.aborting_transaction? || @transaction_state.committing_transaction?
233
+ @logger.warn("Transaction is finishing. Sleeping until finish!")
234
+ sleep 5
235
+ end
236
+ end
237
+
238
+ private
239
+
240
+ def force_transactional!
241
+ unless transactional?
242
+ raise 'Please turn on transactional mode to use transaction'
243
+ end
244
+
245
+ if @transactional_id.nil? || @transactional_id.empty?
246
+ raise 'Please provide a transaction_id to use transactional mode'
247
+ end
248
+ end
249
+
250
+ def transaction_coordinator
251
+ @cluster.get_transaction_coordinator(
252
+ transactional_id: @transactional_id
253
+ )
254
+ end
255
+
256
+ def complete_transaction
257
+ @transaction_state.transition_to!(TransactionStateMachine::READY)
258
+ @transaction_partitions = {}
259
+ end
260
+ end
261
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kafka
4
+ class TransactionStateMachine
5
+ class InvalidTransitionError < StandardError; end
6
+ class InvalidStateError < StandardError; end
7
+
8
+ STATES = [
9
+ UNINITIALIZED = :uninitialized,
10
+ READY = :ready,
11
+ IN_TRANSACTION = :in_trasaction,
12
+ COMMITTING_TRANSACTION = :committing_transaction,
13
+ ABORTING_TRANSACTION = :aborting_transaction,
14
+ ERROR = :error
15
+ ]
16
+
17
+ TRANSITIONS = {
18
+ UNINITIALIZED => [READY, ERROR],
19
+ READY => [UNINITIALIZED, COMMITTING_TRANSACTION, ABORTING_TRANSACTION],
20
+ IN_TRANSACTION => [READY],
21
+ COMMITTING_TRANSACTION => [IN_TRANSACTION],
22
+ ABORTING_TRANSACTION => [IN_TRANSACTION],
23
+ # Any states can transition to error state
24
+ ERROR => STATES
25
+ }
26
+
27
+ def initialize(logger:)
28
+ @state = UNINITIALIZED
29
+ @mutex = Mutex.new
30
+ @logger = TaggedLogger.new(logger)
31
+ end
32
+
33
+ def transition_to!(next_state)
34
+ raise InvalidStateError unless STATES.include?(next_state)
35
+ unless TRANSITIONS[next_state].include?(@state)
36
+ raise InvalidTransitionError, "Could not transition from state '#{@state}' to state '#{next_state}'"
37
+ end
38
+ @logger.debug("Transaction state changed to '#{next_state}'!")
39
+ @mutex.synchronize { @state = next_state }
40
+ end
41
+
42
+ def uninitialized?
43
+ in_state?(UNINITIALIZED)
44
+ end
45
+
46
+ def ready?
47
+ in_state?(READY)
48
+ end
49
+
50
+ def in_transaction?
51
+ in_state?(IN_TRANSACTION)
52
+ end
53
+
54
+ def committing_transaction?
55
+ in_state?(COMMITTING_TRANSACTION)
56
+ end
57
+
58
+ def aborting_transaction?
59
+ in_state?(ABORTING_TRANSACTION)
60
+ end
61
+
62
+ def error?
63
+ in_state?(ERROR)
64
+ end
65
+
66
+ private
67
+
68
+ def in_state?(state)
69
+ @mutex.synchronize { @state == state }
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kafka
4
+ VERSION = "0.7.6"
5
+ end
metadata ADDED
@@ -0,0 +1,461 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-kafka-custom
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.7.26
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Schierbeck
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-05-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: digest-crc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.9.5
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.9.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: dotenv
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: docker-api
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-benchmark
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: activesupport
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: snappy
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: extlz4
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: colored
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: rspec_junit_formatter
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '='
186
+ - !ruby/object:Gem::Version
187
+ version: 0.2.2
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '='
193
+ - !ruby/object:Gem::Version
194
+ version: 0.2.2
195
+ - !ruby/object:Gem::Dependency
196
+ name: dogstatsd-ruby
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: 3.0.0
202
+ - - "<"
203
+ - !ruby/object:Gem::Version
204
+ version: 5.0.0
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: 3.0.0
212
+ - - "<"
213
+ - !ruby/object:Gem::Version
214
+ version: 5.0.0
215
+ - !ruby/object:Gem::Dependency
216
+ name: statsd-ruby
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ type: :development
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ - !ruby/object:Gem::Dependency
230
+ name: ruby-prof
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ - !ruby/object:Gem::Dependency
244
+ name: timecop
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ type: :development
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ - !ruby/object:Gem::Dependency
258
+ name: rubocop
259
+ requirement: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: 0.49.1
264
+ type: :development
265
+ prerelease: false
266
+ version_requirements: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - "~>"
269
+ - !ruby/object:Gem::Version
270
+ version: 0.49.1
271
+ - !ruby/object:Gem::Dependency
272
+ name: gssapi
273
+ requirement: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: 1.2.0
278
+ type: :development
279
+ prerelease: false
280
+ version_requirements: !ruby/object:Gem::Requirement
281
+ requirements:
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ version: 1.2.0
285
+ - !ruby/object:Gem::Dependency
286
+ name: stackprof
287
+ requirement: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - ">="
290
+ - !ruby/object:Gem::Version
291
+ version: '0'
292
+ type: :development
293
+ prerelease: false
294
+ version_requirements: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ - !ruby/object:Gem::Dependency
300
+ name: test-unit
301
+ requirement: !ruby/object:Gem::Requirement
302
+ requirements:
303
+ - - "~>"
304
+ - !ruby/object:Gem::Version
305
+ version: 3.1.4
306
+ type: :development
307
+ prerelease: false
308
+ version_requirements: !ruby/object:Gem::Requirement
309
+ requirements:
310
+ - - "~>"
311
+ - !ruby/object:Gem::Version
312
+ version: 3.1.4
313
+ - !ruby/object:Gem::Dependency
314
+ name: jruby-openssl
315
+ requirement: !ruby/object:Gem::Requirement
316
+ requirements:
317
+ - - ">="
318
+ - !ruby/object:Gem::Version
319
+ version: '0'
320
+ type: :development
321
+ prerelease: false
322
+ version_requirements: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ">="
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
327
+ description: A client library for the Kafka distributed commit log.
328
+ email:
329
+ - daniel.schierbeck@gmail.com
330
+ executables: []
331
+ extensions: []
332
+ extra_rdoc_files: []
333
+ files:
334
+ - lib/kafka/async_producer.rb
335
+ - lib/kafka/broker.rb
336
+ - lib/kafka/broker_info.rb
337
+ - lib/kafka/broker_pool.rb
338
+ - lib/kafka/broker_uri.rb
339
+ - lib/kafka/client.rb
340
+ - lib/kafka/cluster.rb
341
+ - lib/kafka/compression.rb
342
+ - lib/kafka/compressor.rb
343
+ - lib/kafka/connection.rb
344
+ - lib/kafka/connection_builder.rb
345
+ - lib/kafka/consumer.rb
346
+ - lib/kafka/consumer_group.rb
347
+ - lib/kafka/datadog.rb
348
+ - lib/kafka/fetch_operation.rb
349
+ - lib/kafka/fetched_batch.rb
350
+ - lib/kafka/fetched_batch_generator.rb
351
+ - lib/kafka/fetched_message.rb
352
+ - lib/kafka/fetched_offset_resolver.rb
353
+ - lib/kafka/fetcher.rb
354
+ - lib/kafka/gzip_codec.rb
355
+ - lib/kafka/heartbeat.rb
356
+ - lib/kafka/instrumenter.rb
357
+ - lib/kafka/lz4_codec.rb
358
+ - lib/kafka/message_buffer.rb
359
+ - lib/kafka/offset_manager.rb
360
+ - lib/kafka/partitioner.rb
361
+ - lib/kafka/pause.rb
362
+ - lib/kafka/pending_message.rb
363
+ - lib/kafka/pending_message_queue.rb
364
+ - lib/kafka/produce_operation.rb
365
+ - lib/kafka/producer.rb
366
+ - lib/kafka/protocol.rb
367
+ - lib/kafka/protocol/add_partitions_to_txn_request.rb
368
+ - lib/kafka/protocol/add_partitions_to_txn_response.rb
369
+ - lib/kafka/protocol/alter_configs_request.rb
370
+ - lib/kafka/protocol/alter_configs_response.rb
371
+ - lib/kafka/protocol/api_versions_request.rb
372
+ - lib/kafka/protocol/api_versions_response.rb
373
+ - lib/kafka/protocol/consumer_group_protocol.rb
374
+ - lib/kafka/protocol/create_partitions_request.rb
375
+ - lib/kafka/protocol/create_partitions_response.rb
376
+ - lib/kafka/protocol/create_topics_request.rb
377
+ - lib/kafka/protocol/create_topics_response.rb
378
+ - lib/kafka/protocol/decoder.rb
379
+ - lib/kafka/protocol/delete_topics_request.rb
380
+ - lib/kafka/protocol/delete_topics_response.rb
381
+ - lib/kafka/protocol/describe_configs_request.rb
382
+ - lib/kafka/protocol/describe_configs_response.rb
383
+ - lib/kafka/protocol/describe_groups_request.rb
384
+ - lib/kafka/protocol/describe_groups_response.rb
385
+ - lib/kafka/protocol/encoder.rb
386
+ - lib/kafka/protocol/end_txn_request.rb
387
+ - lib/kafka/protocol/end_txn_response.rb
388
+ - lib/kafka/protocol/fetch_request.rb
389
+ - lib/kafka/protocol/fetch_response.rb
390
+ - lib/kafka/protocol/find_coordinator_request.rb
391
+ - lib/kafka/protocol/find_coordinator_response.rb
392
+ - lib/kafka/protocol/heartbeat_request.rb
393
+ - lib/kafka/protocol/heartbeat_response.rb
394
+ - lib/kafka/protocol/init_producer_id_request.rb
395
+ - lib/kafka/protocol/init_producer_id_response.rb
396
+ - lib/kafka/protocol/join_group_request.rb
397
+ - lib/kafka/protocol/join_group_response.rb
398
+ - lib/kafka/protocol/leave_group_request.rb
399
+ - lib/kafka/protocol/leave_group_response.rb
400
+ - lib/kafka/protocol/list_groups_request.rb
401
+ - lib/kafka/protocol/list_groups_response.rb
402
+ - lib/kafka/protocol/list_offset_request.rb
403
+ - lib/kafka/protocol/list_offset_response.rb
404
+ - lib/kafka/protocol/member_assignment.rb
405
+ - lib/kafka/protocol/message.rb
406
+ - lib/kafka/protocol/message_set.rb
407
+ - lib/kafka/protocol/metadata_request.rb
408
+ - lib/kafka/protocol/metadata_response.rb
409
+ - lib/kafka/protocol/offset_commit_request.rb
410
+ - lib/kafka/protocol/offset_commit_response.rb
411
+ - lib/kafka/protocol/offset_fetch_request.rb
412
+ - lib/kafka/protocol/offset_fetch_response.rb
413
+ - lib/kafka/protocol/produce_request.rb
414
+ - lib/kafka/protocol/produce_response.rb
415
+ - lib/kafka/protocol/record.rb
416
+ - lib/kafka/protocol/record_batch.rb
417
+ - lib/kafka/protocol/request_message.rb
418
+ - lib/kafka/protocol/sasl_handshake_request.rb
419
+ - lib/kafka/protocol/sasl_handshake_response.rb
420
+ - lib/kafka/protocol/sync_group_request.rb
421
+ - lib/kafka/protocol/sync_group_response.rb
422
+ - lib/kafka/round_robin_assignment_strategy.rb
423
+ - lib/kafka/sasl/gssapi.rb
424
+ - lib/kafka/sasl/oauth.rb
425
+ - lib/kafka/sasl/plain.rb
426
+ - lib/kafka/sasl/scram.rb
427
+ - lib/kafka/sasl_authenticator.rb
428
+ - lib/kafka/snappy_codec.rb
429
+ - lib/kafka/socket_with_timeout.rb
430
+ - lib/kafka/ssl_context.rb
431
+ - lib/kafka/ssl_socket_with_timeout.rb
432
+ - lib/kafka/statsd.rb
433
+ - lib/kafka/tagged_logger.rb
434
+ - lib/kafka/transaction_manager.rb
435
+ - lib/kafka/transaction_state_machine.rb
436
+ - lib/kafka/version.rb
437
+ homepage: https://github.com/zendesk/ruby-kafka
438
+ licenses:
439
+ - Apache License Version 2.0
440
+ metadata: {}
441
+ post_install_message:
442
+ rdoc_options: []
443
+ require_paths:
444
+ - lib
445
+ required_ruby_version: !ruby/object:Gem::Requirement
446
+ requirements:
447
+ - - ">="
448
+ - !ruby/object:Gem::Version
449
+ version: 2.1.0
450
+ required_rubygems_version: !ruby/object:Gem::Requirement
451
+ requirements:
452
+ - - ">="
453
+ - !ruby/object:Gem::Version
454
+ version: '0'
455
+ requirements: []
456
+ rubyforge_project:
457
+ rubygems_version: 2.6.10
458
+ signing_key:
459
+ specification_version: 4
460
+ summary: A client library for the Kafka distributed commit log.
461
+ test_files: []