4
4
import functools
5
5
import logging
6
6
import time
7
- import kafka .common
8
7
8
+ import kafka .common
9
9
from kafka .common import (TopicAndPartition , BrokerMetadata ,
10
10
ConnectionError , FailedPayloadsError ,
11
11
KafkaTimeoutError , KafkaUnavailableError ,
22
22
23
23
class KafkaClient (object ):
24
24
25
- CLIENT_ID = b" kafka-python"
25
+ CLIENT_ID = b' kafka-python'
26
26
27
27
# NOTE: The timeout given to the client should always be greater than the
28
28
# one passed to SimpleConsumer.get_message(), otherwise you can get a
@@ -50,7 +50,7 @@ def __init__(self, hosts, client_id=CLIENT_ID,
50
50
##################
51
51
52
52
def _get_conn (self , host , port ):
53
- "Get or create a connection to a broker using host and port"
53
+ """ Get or create a connection to a broker using host and port"" "
54
54
host_key = (host , port )
55
55
if host_key not in self .conns :
56
56
self .conns [host_key ] = KafkaConnection (
@@ -111,6 +111,7 @@ def _send_broker_unaware_request(self, payloads, encoder_fn, decoder_fn):
111
111
"""
112
112
for (host , port ) in self .hosts :
113
113
requestId = self ._next_id ()
114
+ log .debug ('Request %s: %s' , requestId , payloads )
114
115
try :
115
116
conn = self ._get_conn (host , port )
116
117
request = encoder_fn (client_id = self .client_id ,
@@ -119,13 +120,15 @@ def _send_broker_unaware_request(self, payloads, encoder_fn, decoder_fn):
119
120
120
121
conn .send (requestId , request )
121
122
response = conn .recv (requestId )
122
- return decoder_fn (response )
123
+ decoded = decoder_fn (response )
124
+ log .debug ('Response %s: %s' , requestId , decoded )
125
+ return decoded
123
126
124
127
except Exception :
125
- log .exception ("Could not send request [%r ] to server %s:%i, "
126
- " trying next server" % ( requestId , host , port ) )
128
+ log .exception ('Error sending request [%s ] to server %s:%s, '
129
+ ' trying next server' , requestId , host , port )
127
130
128
- raise KafkaUnavailableError (" All servers failed to process request" )
131
+ raise KafkaUnavailableError (' All servers failed to process request' )
129
132
130
133
def _send_broker_aware_request (self , payloads , encoder_fn , decoder_fn ):
131
134
"""
@@ -150,9 +153,6 @@ def _send_broker_aware_request(self, payloads, encoder_fn, decoder_fn):
150
153
151
154
List of response objects in the same order as the supplied payloads
152
155
"""
153
-
154
- log .debug ("Sending Payloads: %s" % payloads )
155
-
156
156
# Group the requests by topic+partition
157
157
brokers_for_payloads = []
158
158
payloads_by_broker = collections .defaultdict (list )
@@ -170,6 +170,7 @@ def _send_broker_aware_request(self, payloads, encoder_fn, decoder_fn):
170
170
broker_failures = []
171
171
for broker , payloads in payloads_by_broker .items ():
172
172
requestId = self ._next_id ()
173
+ log .debug ('Request %s to %s: %s' , requestId , broker , payloads )
173
174
request = encoder_fn (client_id = self .client_id ,
174
175
correlation_id = requestId , payloads = payloads )
175
176
@@ -180,7 +181,7 @@ def _send_broker_aware_request(self, payloads, encoder_fn, decoder_fn):
180
181
181
182
except ConnectionError as e :
182
183
broker_failures .append (broker )
183
- log .warning (" Could not send request [%s] to server %s: %s" ,
184
+ log .warning (' Could not send request [%s] to server %s: %s' ,
184
185
binascii .b2a_hex (request ), broker , e )
185
186
186
187
for payload in payloads :
@@ -201,15 +202,14 @@ def _send_broker_aware_request(self, payloads, encoder_fn, decoder_fn):
201
202
response = conn .recv (requestId )
202
203
except ConnectionError as e :
203
204
broker_failures .append (broker )
204
- log .warning (" Could not receive response to request [%s] "
205
- " from server %s: %s" ,
205
+ log .warning (' Could not receive response to request [%s] '
206
+ ' from server %s: %s' ,
206
207
binascii .b2a_hex (request ), conn , e )
207
208
208
209
for payload in payloads :
209
210
responses_by_broker [broker ].append (FailedPayloadsError (payload ))
210
211
211
212
else :
212
-
213
213
for payload_response in decoder_fn (response ):
214
214
responses_by_broker [broker ].append (payload_response )
215
215
@@ -223,7 +223,6 @@ def _send_broker_aware_request(self, payloads, encoder_fn, decoder_fn):
223
223
# Return responses in the same order as provided
224
224
responses_by_payload = [responses_by_broker [broker ].pop (0 )
225
225
for broker in brokers_for_payloads ]
226
- log .debug ('Responses: %s' % responses_by_payload )
227
226
return responses_by_payload
228
227
229
228
def __repr__ (self ):
@@ -254,8 +253,11 @@ def close(self):
254
253
255
254
def copy (self ):
256
255
"""
257
- Create an inactive copy of the client object
258
- A reinit() has to be done on the copy before it can be used again
256
+ Create an inactive copy of the client object, suitable for passing
257
+ to a separate thread.
258
+
259
+ Note that the copied connections are not initialized, so reinit() must
260
+ be called on the returned copy.
259
261
"""
260
262
c = copy .deepcopy (self )
261
263
for key in c .conns :
@@ -297,7 +299,7 @@ def ensure_topic_exists(self, topic, timeout = 30):
297
299
298
300
while not self .has_metadata_for_topic (topic ):
299
301
if time .time () > start_time + timeout :
300
- raise KafkaTimeoutError (" Unable to create topic {0}" .format (topic ))
302
+ raise KafkaTimeoutError (' Unable to create topic {0}' .format (topic ))
301
303
try :
302
304
self .load_metadata_for_topics (topic )
303
305
except LeaderNotAvailableError :
@@ -345,8 +347,8 @@ def load_metadata_for_topics(self, *topics):
345
347
346
348
resp = self .send_metadata_request (topics )
347
349
348
- log .debug (" Received new broker metadata: %s" , resp .brokers )
349
- log .debug (" Received new topic metadata: %s" , resp .topics )
350
+ log .debug (' Received new broker metadata: %s' , resp .brokers )
351
+ log .debug (' Received new topic metadata: %s' , resp .topics )
350
352
351
353
self .brokers = dict ([(broker .nodeId , broker )
352
354
for broker in resp .brokers ])
@@ -365,7 +367,7 @@ def load_metadata_for_topics(self, *topics):
365
367
raise
366
368
367
369
# Otherwise, just log a warning
368
- log .error (" Error loading topic metadata for %s: %s" , topic , type (e ))
370
+ log .error (' Error loading topic metadata for %s: %s' , topic , type (e ))
369
371
continue
370
372
371
373
self .topic_partitions [topic ] = {}
@@ -406,7 +408,6 @@ def load_metadata_for_topics(self, *topics):
406
408
407
409
def send_metadata_request (self , payloads = [], fail_on_error = True ,
408
410
callback = None ):
409
-
410
411
encoder = KafkaProtocol .encode_metadata_request
411
412
decoder = KafkaProtocol .decode_metadata_response
412
413
0 commit comments