From 0339510a2afacf75113c95a54d64db38483e184c Mon Sep 17 00:00:00 2001 From: Just van den Broecke Date: Sat, 25 Apr 2020 16:58:54 +0200 Subject: [PATCH 1/2] #133 use requests Session object with Retry capabilities --- GeoHealthCheck/probe.py | 6 ++++-- GeoHealthCheck/util.py | 25 +++++++++++++++++++++++++ requirements.txt | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/GeoHealthCheck/probe.py b/GeoHealthCheck/probe.py index 2501b593..6d86bde3 100644 --- a/GeoHealthCheck/probe.py +++ b/GeoHealthCheck/probe.py @@ -8,6 +8,7 @@ from init import App from plugin import Plugin from result import ProbeResult +from util import create_requests_retry_session LOGGER = logging.getLogger(__name__) @@ -80,6 +81,7 @@ class Probe(Plugin): def __init__(self): Plugin.__init__(self) self._resource = None + self._session = create_requests_retry_session() # # Lifecycle : optionally expand params from Resource metadata @@ -284,14 +286,14 @@ def perform_request(self): def perform_get_request(self, url): """ Perform actual HTTP GET request to service""" - return requests.get( + return self._session.get( url, timeout=App.get_config()['GHC_PROBE_HTTP_TIMEOUT_SECS'], headers=self.get_request_headers()) def perform_post_request(self, url_base, request_string): """ Perform actual HTTP POST request to service""" - return requests.post( + return self._session.post( url_base, timeout=App.get_config()['GHC_PROBE_HTTP_TIMEOUT_SECS'], data=request_string, diff --git a/GeoHealthCheck/util.py b/GeoHealthCheck/util.py index ccab4bb5..d97075a1 100644 --- a/GeoHealthCheck/util.py +++ b/GeoHealthCheck/util.py @@ -33,6 +33,9 @@ import os import smtplib import base64 +import requests +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.retry import Retry from urllib.request import urlopen from urllib.parse import urlparse from gettext import translation @@ -257,3 +260,25 @@ def decode(key: str, string: str) -> str: # d = decode('a key', e) # print([e]) # print([d]) + +# https://www.peterbe.com/plog/best-practice-with-retries-with-requests +# Provides a requests Session object with requests' Retry capabilities. +# TODO: may make numbers below configurable +def create_requests_retry_session( + retries=3, + backoff_factor=0.3, + status_forcelist=(500, 502, 504), + session=None, +): + session = session or requests.Session() + retry = Retry( + total=retries, + read=retries, + connect=retries, + backoff_factor=backoff_factor, + status_forcelist=status_forcelist, + ) + adapter = HTTPAdapter(max_retries=retry) + session.mount('http://', adapter) + session.mount('https://', adapter) + return session diff --git a/requirements.txt b/requirements.txt index 897f8cc7..0dfea583 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ OWSLib==0.17.1 # update to new version when solution to OWSLIB #614 is released openapi-spec-validator==0.2.8 Sphinx==2.2.0 sphinx-rtd-theme==0.4.3 -requests>=2.20.0 +requests>=2.23.0 WTForms==2.2.1 APScheduler==3.6.1 passlib==1.7.1 From 59970a4bf0b7156af941a9995890ab21e5eaf10e Mon Sep 17 00:00:00 2001 From: Just van den Broecke Date: Sat, 25 Apr 2020 17:10:27 +0200 Subject: [PATCH 2/2] #133 use requests Session object with Retry capabilities - grrr flake8 --- GeoHealthCheck/util.py | 1 + 1 file changed, 1 insertion(+) diff --git a/GeoHealthCheck/util.py b/GeoHealthCheck/util.py index d97075a1..9d323248 100644 --- a/GeoHealthCheck/util.py +++ b/GeoHealthCheck/util.py @@ -261,6 +261,7 @@ def decode(key: str, string: str) -> str: # print([e]) # print([d]) + # https://www.peterbe.com/plog/best-practice-with-retries-with-requests # Provides a requests Session object with requests' Retry capabilities. # TODO: may make numbers below configurable