From 0bcc98f9a52783993a74f5fcbaaaa274300e45ad Mon Sep 17 00:00:00 2001
From: Bjarke Madsen <bjarke@nordu.net>
Date: Wed, 29 Mar 2023 18:07:38 +0200
Subject: [PATCH] use requests.Session to reuse TCP connections for Grafana API
 requests

---
 .../grafana/utils/request.py                  | 41 ++++++++-----------
 1 file changed, 18 insertions(+), 23 deletions(-)

diff --git a/brian_dashboard_manager/grafana/utils/request.py b/brian_dashboard_manager/grafana/utils/request.py
index d1c5452..dfe7051 100644
--- a/brian_dashboard_manager/grafana/utils/request.py
+++ b/brian_dashboard_manager/grafana/utils/request.py
@@ -1,39 +1,34 @@
 import requests
 import logging
-from requests.models import HTTPError
+from requests.adapters import HTTPAdapter
 
 logger = logging.getLogger(__name__)
 
 
-class Request(object):
+class Request(requests.Session):
     def __init__(self, url, headers=None):
-        self.headers = {
+        super().__init__()
+
+        # allow using up to 16 connections
+        adapter = HTTPAdapter(pool_maxsize=16)
+        self.mount(url, adapter)
+
+        self.headers.update({
             'Accept': 'application/json'
-        }
+        })
         if headers:
             self.headers.update(headers)
 
         self.BASE_URL = url
 
-    def do_request(self, method, endpoint, *args, **kwargs):
-        r = requests.request(method, self.BASE_URL + endpoint,
-                             *args,
-                             **kwargs,
-                             headers={
-                                 **kwargs.get('headers', {}),
-                                 **self.headers
-                             })
-
-        try:
-            r.raise_for_status()
-        except HTTPError as e:
-            if e.response.status_code < 500:
-                logger.error(e.response.content.decode('utf-8'))
-            raise e
-        return r.json()
-
-    def get(self, endpoint: str, *args, **kwargs):
-        return self.do_request('get', endpoint, *args, **kwargs)
+    def do_request(self, method, endpoint, **kwargs) -> requests.Response:
+        r = self.request(method, self.BASE_URL + endpoint, **kwargs)
+
+        r.raise_for_status()
+        return r
+
+    def get(self, endpoint: str, **kwargs):
+        return self.do_request('get', endpoint, **kwargs)
 
     def post(self, endpoint: str, data=None, **kwargs):
         return self.do_request('post', endpoint, data=data, **kwargs)
-- 
GitLab