Skip to content

Commit ae04c96

Browse files
committed
Fix caching after migration to Niquests
1 parent a21b4a1 commit ae04c96

File tree

6 files changed

+36
-42
lines changed

6 files changed

+36
-42
lines changed

grafana_wtf/__init__.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,3 @@
22

33
__appname__ = "grafana-wtf"
44
__version__ = "0.18.0"
5-
6-
# Amalgamate `requests` to `niquests`.
7-
import grafana_wtf.compat

grafana_wtf/commands.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,6 @@ def run():
234234

235235
engine.enable_cache(expire_after=cache_ttl, drop_cache=options["drop-cache"])
236236
engine.enable_concurrency(int(options["concurrency"]))
237-
engine.setup()
238237

239238
log.info(f"Grafana version: {engine.version}")
240239

grafana_wtf/compat.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
from sys import modules
2-
31
import niquests
4-
import urllib3
2+
import requests_cache
3+
4+
5+
class CachedSession(requests_cache.session.CacheMixin, niquests.Session):
6+
"""
7+
Make Niquests compatible with Requests-Cache.
8+
"""
59

6-
# Amalgamate the module namespace to make all modules aiming
7-
# to use `requests`, in fact use `niquests` instead.
8-
modules["requests"] = niquests
9-
modules["requests.adapters"] = niquests.adapters
10-
modules["requests.sessions"] = niquests.sessions
11-
modules["requests.exceptions"] = niquests.exceptions
12-
modules["requests.packages.urllib3"] = urllib3
10+
pass

grafana_wtf/core.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
from grafana_client.api import GrafanaApi
1717
from grafana_client.client import GrafanaClientError, GrafanaUnauthorizedError
1818
from munch import Munch, munchify
19-
from requests_cache import CachedSession
2019
from tqdm import tqdm
2120
from tqdm.contrib.logging import tqdm_logging_redirect
2221
from urllib3.exceptions import InsecureRequestWarning
2322

2423
from grafana_wtf import __appname__, __version__
24+
from grafana_wtf.compat import CachedSession
2525
from grafana_wtf.model import (
2626
DashboardDetails,
2727
DashboardExplorationItem,
@@ -35,23 +35,34 @@
3535

3636

3737
class GrafanaEngine:
38-
session = niquests.Session()
38+
39+
# Configure a larger HTTP request pool.
40+
# TODO: Review the pool settings and eventually adjust according to concurrency level or other parameters.
41+
# https://urllib3.readthedocs.io/en/latest/advanced-usage.html#customizing-pool-behavior
42+
# https://laike9m.com/blog/requests-secret-pool_connections-and-pool_maxsize,89/
43+
session_args = dict(pool_connections=100, pool_maxsize=100, retries=5)
44+
45+
# The HTTP `User-Agent` header value.
46+
user_agent = f"{__appname__}/{__version__}"
3947

4048
def __init__(self, grafana_url, grafana_token=None):
4149
self.grafana_url = grafana_url
4250
self.grafana_token = grafana_token
4351

44-
self.grafana = None
45-
self.data = GrafanaDataModel()
52+
self.concurrency = 5
4653

54+
self.grafana = self.grafana_client_factory(self.grafana_url, grafana_token=self.grafana_token)
55+
self.set_user_agent()
56+
self.data = GrafanaDataModel()
4757
self.finder = JsonPathFinder()
4858

4959
self.taqadum = None
50-
self.concurrency = 5
51-
5260
self.debug = log.getEffectiveLevel() == logging.DEBUG
5361
self.progressbar = not self.debug
5462

63+
def set_session(self, session):
64+
self.grafana.client.s = session
65+
5566
def enable_cache(self, expire_after=60, drop_cache=False):
5667
if expire_after is None:
5768
log.info(f"Response cache will never expire (infinite caching)")
@@ -60,10 +71,13 @@ def enable_cache(self, expire_after=60, drop_cache=False):
6071
else:
6172
log.info(f"Response cache will expire after {expire_after} seconds")
6273

63-
self.session = CachedSession(cache_name=__appname__, expire_after=expire_after, use_cache_dir=True)
74+
session = CachedSession(
75+
cache_name=__appname__, expire_after=expire_after, use_cache_dir=True, **self.session_args
76+
)
77+
self.set_session(session)
78+
self.set_user_agent()
6479

65-
cache = self.session.cache
66-
log.info(f"Response cache database location is: {cache.db_path}")
80+
log.info(f"Response cache database: {session.cache.db_path}")
6781
if drop_cache:
6882
log.info("Dropping response cache")
6983
self.clear_cache()
@@ -102,23 +116,14 @@ def grafana_client_factory(cls, grafana_url, grafana_token=None):
102116
url_path_prefix=url.path.lstrip("/"),
103117
verify=verify,
104118
)
105-
if cls.session:
106-
user_agent = f"{__appname__}/{__version__}"
107-
cls.session.headers["User-Agent"] = user_agent
108-
grafana.client.s = cls.session
109119

110-
return grafana
120+
# Configure HTTP session to use a larger HTTP request pool.
121+
grafana.client.s = niquests.Session(**cls.session_args)
111122

112-
def setup(self):
113-
self.grafana = self.grafana_client_factory(self.grafana_url, grafana_token=self.grafana_token)
114-
115-
# Configure a larger HTTP request pool.
116-
# Todo: Review the pool settings and eventually adjust according to concurrency level or other parameters.
117-
# https://urllib3.readthedocs.io/en/latest/advanced-usage.html#customizing-pool-behavior
118-
# https://laike9m.com/blog/requests-secret-pool_connections-and-pool_maxsize,89/
119-
self.grafana.client.s = niquests.Session(pool_connections=100, pool_maxsize=100, retries=5)
123+
return grafana
120124

121-
return self
125+
def set_user_agent(self):
126+
self.grafana.client.s.headers["User-Agent"] = self.user_agent
122127

123128
def start_progressbar(self, total):
124129
if self.progressbar:

tests/conftest.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,6 @@ def grafana_version(docker_grafana):
320320
Return Grafana version number.
321321
"""
322322
engine = GrafanaWtf(grafana_url=docker_grafana, grafana_token=None)
323-
engine.setup()
324323
grafana_version = engine.version
325324
return grafana_version
326325

tests/test_core.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ def test_collect_datasource_items_variable_all():
4040

4141
def test_connect_success():
4242
wtf = GrafanaWtf("https://play.grafana.org")
43-
wtf.setup()
4443
health = wtf.health
4544
assert "commit" in health
4645
assert "version" in health
@@ -49,7 +48,6 @@ def test_connect_success():
4948

5049
def test_connect_failure():
5150
wtf = GrafanaWtf("http://localhost:1234")
52-
wtf.setup()
5351
with pytest.raises(ConnectionError) as ex:
5452
_ = wtf.health
5553
assert ex.match("The request to http://localhost:1234/api/health failed")
@@ -60,13 +58,11 @@ def test_connect_version(mock_get):
6058
mock_get.return_value = Mock()
6159
mock_get.return_value.return_value = {"commit": "14e988bd22", "database": "ok", "version": "9.0.1"}
6260
wtf = GrafanaWtf("http://localhost:1234")
63-
wtf.setup()
6461
assert wtf.version == "9.0.1"
6562

6663

6764
def test_connect_non_json_response():
6865
wtf = GrafanaWtf("https://example.org/")
69-
wtf.setup()
7066
with pytest.raises(ConnectionError) as ex:
7167
_ = wtf.health
7268
assert ex.match("The request to https://example.org/api/health failed: Client Error 404")

0 commit comments

Comments
 (0)