Skip to content

Commit 28db689

Browse files
authored
Merge pull request #29 from opsgenie/fixes-for-#21
Fixes for #21
2 parents 7a7b94a + 6b8f896 commit 28db689

File tree

6 files changed

+76
-40
lines changed

6 files changed

+76
-40
lines changed

opsgenie_sdk/api_client.py

+33-15
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,11 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
7777
self.configuration = configuration
7878
self.pool_threads = pool_threads
7979

80-
self.retrying = tenacity.Retrying(stop=tenacity.stop_after_attempt(configuration.retry_count),
80+
self.retrying = tenacity.Retrying(stop=self.should_retry_stop,
8181
wait=tenacity.wait_random_exponential(multiplier=configuration.back_off,
82-
max=configuration.retry_max_delay,
83-
min=configuration.retry_delay),
84-
retry=(tenacity.retry_if_result(self.is_retry_enabled) and
85-
((tenacity.retry_if_exception_type(RetryableException)) |
86-
(tenacity.retry_if_exception_type(HTTPError)))))
82+
max=configuration.retry_delay),
83+
retry=(tenacity.retry_if_exception_type(RetryableException) |
84+
(tenacity.retry_if_exception_type(HTTPError))))
8785

8886
self.rest_client = rest.RESTClientObject(configuration, retrying=self.retrying)
8987
self.default_headers = {}
@@ -104,8 +102,11 @@ def __del__(self):
104102
self._pool.join()
105103
self._pool = None
106104

107-
def is_retry_enabled(self):
108-
return self.configuration.retry_enabled
105+
def should_retry_stop(self, retry_state):
106+
if self.configuration.retry_enabled and retry_state.attempt_number <= self.configuration.retry_count and retry_state.seconds_since_start <= self.configuration.retry_max_delay:
107+
return False
108+
109+
return True
109110

110111
@property
111112
def pool(self):
@@ -192,13 +193,30 @@ def __call_api(
192193
url = _host + resource_path
193194

194195
# perform request and return response
195-
response_data = self.retrying.call(fn=self.request, method=method, url=url,
196-
query_params=query_params,
197-
headers=header_params,
198-
post_params=post_params,
199-
body=body,
200-
_preload_content=_preload_content,
201-
_request_timeout=_request_timeout)
196+
try:
197+
response_data = self.retrying.call(fn=self.request, method=method, url=url,
198+
query_params=query_params,
199+
headers=header_params,
200+
post_params=post_params,
201+
body=body,
202+
_preload_content=_preload_content,
203+
_request_timeout=_request_timeout)
204+
except Exception as exception:
205+
self._sdk_request_details = {
206+
"query_params": query_params,
207+
"headers": header_params,
208+
"post_params": post_params,
209+
"body": body,
210+
"_preload_content": _preload_content,
211+
"_request_timeout": _request_timeout
212+
}
213+
self.sdk_metric_publisher.build_metric(transaction_id=config.metrics_transaction_id,
214+
duration=datetime.datetime.now() - self._request_start_time,
215+
resource_path=url, error_type=type(exception),
216+
error_message=str(exception),
217+
sdk_request_details=self._sdk_request_details,
218+
sdk_result_details="An Exception Was Thrown!")
219+
raise exception
202220

203221
self.last_response = response_data
204222

opsgenie_sdk/configuration.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def __init__(self):
8080
# Retry count
8181
self.retry_count = 5
8282
# Delay time between attempts
83-
self.retry_delay = 0
83+
self.retry_delay = 30
8484
# Maximum amount of delay
8585
self.retry_max_delay = 60
8686
# Multiplier applied to delay between attempts
@@ -116,8 +116,6 @@ def __init__(self):
116116
self.proxy_headers = None
117117
# Safe chars for path_param
118118
self.safe_chars_for_path_param = ''
119-
# Adding retries to override urllib3 default value 3
120-
self.retries = None
121119

122120
self.metrics_transaction_id = None
123121

opsgenie_sdk/rest.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ def request(self, method, url, query_params=None, headers=None,
238238
logger.debug("response body: %s", r.data)
239239

240240
data = self.decodeResponse(r.data)
241+
http_metrics_request = [('method', method), ('url', url), ('query_params', query_params), ('headers', headers),
242+
('body', body), ('post_params', post_params)]
241243
if "message" not in data:
242244
self.http_metric.build_metric(transaction_id=self.configuration.metrics_transaction_id,
243245
duration=data["took"],
@@ -246,7 +248,7 @@ def request(self, method, url, query_params=None, headers=None,
246248
error=False,
247249
status=r.status,
248250
status_code=r.status,
249-
request=query_params)
251+
request=http_metrics_request)
250252
else:
251253
self.http_metric.build_metric(transaction_id=self.configuration.metrics_transaction_id,
252254
duration=data["took"],
@@ -255,7 +257,7 @@ def request(self, method, url, query_params=None, headers=None,
255257
error=True,
256258
status=r.status,
257259
status_code=r.status,
258-
request=query_params)
260+
request=http_metrics_request)
259261

260262
should_retry = self.__checkHttpCode__(r.status)
261263
if should_retry:

templates/api_client.mustache

+33-15
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,11 @@ class ApiClient(object):
7171
self.configuration = configuration
7272
self.pool_threads = pool_threads
7373

74-
self.retrying = tenacity.Retrying(stop=tenacity.stop_after_attempt(configuration.retry_count),
74+
self.retrying = tenacity.Retrying(stop=self.should_retry_stop,
7575
wait=tenacity.wait_random_exponential(multiplier=configuration.back_off,
76-
max=configuration.retry_max_delay,
77-
min=configuration.retry_delay),
78-
retry=(tenacity.retry_if_result(self.is_retry_enabled) and
79-
((tenacity.retry_if_exception_type(RetryableException)) |
80-
(tenacity.retry_if_exception_type(HTTPError)))))
76+
max=configuration.retry_delay),
77+
retry=(tenacity.retry_if_exception_type(RetryableException) |
78+
(tenacity.retry_if_exception_type(HTTPError))))
8179

8280
self.rest_client = rest.RESTClientObject(configuration, retrying=self.retrying)
8381
self.default_headers = {}
@@ -98,8 +96,11 @@ class ApiClient(object):
9896
self._pool.join()
9997
self._pool = None
10098

101-
def is_retry_enabled(self):
102-
return self.configuration.retry_enabled
99+
def should_retry_stop(self, retry_state):
100+
if self.configuration.retry_enabled and retry_state.attempt_number <= self.configuration.retry_count and retry_state.seconds_since_start <= self.configuration.retry_max_delay:
101+
return False
102+
103+
return True
103104

104105
@property
105106
def pool(self):
@@ -189,13 +190,30 @@ class ApiClient(object):
189190
url = _host + resource_path
190191

191192
# perform request and return response
192-
response_data = {{#asyncio}}await {{/asyncio}}{{#tornado}}yield {{/tornado}}self.retrying.call(fn=self.request, method=method, url=url,
193-
query_params=query_params,
194-
headers=header_params,
195-
post_params=post_params,
196-
body=body,
197-
_preload_content=_preload_content,
198-
_request_timeout=_request_timeout)
193+
try:
194+
response_data = {{#asyncio}}await {{/asyncio}}{{#tornado}}yield {{/tornado}}self.retrying.call(fn=self.request, method=method, url=url,
195+
query_params=query_params,
196+
headers=header_params,
197+
post_params=post_params,
198+
body=body,
199+
_preload_content=_preload_content,
200+
_request_timeout=_request_timeout)
201+
except Exception as exception:
202+
self._sdk_request_details = {
203+
"query_params": query_params,
204+
"headers": header_params,
205+
"post_params": post_params,
206+
"body": body,
207+
"_preload_content": _preload_content,
208+
"_request_timeout": _request_timeout
209+
}
210+
self.sdk_metric_publisher.build_metric(transaction_id=config.metrics_transaction_id,
211+
duration=datetime.datetime.now() - self._request_start_time,
212+
resource_path=url, error_type=type(exception),
213+
error_message=str(exception),
214+
sdk_request_details=self._sdk_request_details,
215+
sdk_result_details="An Exception Was Thrown!")
216+
raise exception
199217

200218
self.last_response = response_data
201219

templates/configuration.mustache

+1-3
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class Configuration(six.with_metaclass(TypeWithDefault, object)):
8181
# Retry count
8282
self.retry_count = 5
8383
# Delay time between attempts
84-
self.retry_delay = 0
84+
self.retry_delay = 30
8585
# Maximum amount of delay
8686
self.retry_max_delay = 60
8787
# Multiplier applied to delay between attempts
@@ -117,8 +117,6 @@ class Configuration(six.with_metaclass(TypeWithDefault, object)):
117117
self.proxy_headers = None
118118
# Safe chars for path_param
119119
self.safe_chars_for_path_param = ''
120-
# Adding retries to override urllib3 default value 3
121-
self.retries = None
122120

123121
self.metrics_transaction_id = None
124122

templates/rest.mustache

+4-2
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ class RESTClientObject(object):
229229
logger.debug("response body: %s", r.data)
230230

231231
data = self.decodeResponse(r.data)
232+
http_metrics_request = [('method', method), ('url', url), ('query_params', query_params), ('headers', headers),
233+
('body', body), ('post_params', post_params)]
232234
if "message" not in data:
233235
self.http_metric.build_metric(transaction_id=self.configuration.metrics_transaction_id,
234236
duration=data["took"],
@@ -237,7 +239,7 @@ class RESTClientObject(object):
237239
error=False,
238240
status=r.status,
239241
status_code=r.status,
240-
request=query_params)
242+
request=http_metrics_request)
241243
else:
242244
self.http_metric.build_metric(transaction_id=self.configuration.metrics_transaction_id,
243245
duration=data["took"],
@@ -246,7 +248,7 @@ class RESTClientObject(object):
246248
error=True,
247249
status=r.status,
248250
status_code=r.status,
249-
request=query_params)
251+
request=http_metrics_request)
250252

251253
should_retry = self.__checkHttpCode__(r.status)
252254
if should_retry:

0 commit comments

Comments
 (0)