@@ -142,46 +142,57 @@ class DatadogHTTPClient(object):
142
142
143
143
def __init__ (self , host , apiKey , max_retries = 1 , backoff = 0.5 ):
144
144
self ._url = "https://{}/v1/input/{}" .format (host , apiKey )
145
- self ._max_retries = max_retries
146
- self ._backoff = backoff
147
-
148
- def send (self , content , metadata = None ):
149
- retries = 0
150
- body = json .dumps (content )
151
- while retries <= self ._max_retries :
145
+ self ._max_retries = max_retries if max_retries >= 0 else 1
146
+ self ._backoff = backoff if backoff > 0 else 0.5
147
+
148
+ def send (self , batch , metadata = None ):
149
+ """
150
+ Attemps to send a log with a linear retry strategy,
151
+ only retries on server and network errors.
152
+ """
153
+ body = json .dumps (batch )
154
+ for retry in range (1 + self ._max_retries ):
155
+ if retry > 0 :
156
+ print ("Retrying, retry: {}, max: {}" .format (retry , self ._max_retries ))
157
+ time .sleep (self ._backoff )
152
158
try :
153
159
resp = requests .post (
154
160
self ._url , headers = self ._HEADERS , data = body , params = metadata
155
161
)
156
- if resp .status_code >= 500 :
157
- # server error
158
- print (
159
- "Server error, status: {}, reason {}" .format (
160
- resp .status_code , resp .reason
161
- )
162
- )
163
- elif resp .status_code >= 400 :
164
- # client error
165
- print (
166
- "Client error, status: {}, reason {}" .format (
167
- resp .status_code , resp .reason
168
- )
169
- )
170
- break
171
- else :
172
- # success
173
- return
174
162
except Exception as e :
163
+ # most likely a network error
175
164
print ("Unexpected exception: {}" .format (str (e )))
176
- retries += 1
177
- print ("Could not send batch, dropping it" )
165
+ continue
166
+ if resp .status_code >= 500 :
167
+ # server error
168
+ print (
169
+ "Server error, status {}, reason: {}" .format (
170
+ resp .status_code , resp .reason
171
+ )
172
+ )
173
+ continue
174
+ elif resp .status_code >= 400 :
175
+ # client error
176
+ raise Exception (
177
+ "client error, status: {}, reason {}" .format (
178
+ resp .status_code , resp .reason
179
+ )
180
+ )
181
+ else :
182
+ # success
183
+ return
184
+ raise Exception ("max number of retries reached: {}" .format (self ._max_retries ))
178
185
179
186
180
187
class DatadogBatcher (object ):
181
188
def __init__ (self , max_size = 25 ):
182
189
self ._max_size = max_size
183
190
184
191
def batch (self , logs ):
192
+ """
193
+ Returns an array of batches,
194
+ each batch contains at most max_size logs.
195
+ """
185
196
batches = []
186
197
if len (logs ) % self ._max_size != 0 :
187
198
nb_batchs = int (len (logs ) / self ._max_size ) + 1
0 commit comments