Repository: Biometria-se/grizzly (language: python)

Issue:
update `pyzmq` dependency to >=23.0.0
in this version, `zmq.sugar.constants` is removed:
![image](https://user-images.githubusercontent.com/815510/169258217-6b25adba-553f-4004-95a9-d1a5c1e16769.png)

causing problems since we import constants from `zmq.sugar.constants` in various places.
request logger cleanup
this PR depends on whether locust PR 2083 is merged or not.

needs to be updated with new `requirements-*`.


Discussion / hints:
actually, check more dependencies:
-  `aenum` is version pinned, due to a change that was causing problems.
- `cryptography` is version pinned, since they have deprecated the blowfish algorithm, which caused `paramiko` to throw warnings
- `azure` dependencies is quite restricted, `azure-core` has released 2.0.0, but there was some conflicts with the other azure dependencies which not yet had been updated to use it
`locust`, `paramiko` and `aenum` will be updated in the scope of this issue. locust does not use `pymqi==23.0.0`, so we'll do the same.
This PR is closed and will be handled in another PR related to issue #105.

Fix patch:
diff --git a/grizzly/listeners/influxdb.py b/grizzly/listeners/influxdb.py
index 397b3825..fef92d9c 100644
--- a/grizzly/listeners/influxdb.py
+++ b/grizzly/listeners/influxdb.py
@@ -4,8 +4,7 @@
 import json
 
 from types import TracebackType
-from typing import Any, Dict, List, Optional, Type, Union, cast
-from typing_extensions import Literal
+from typing import Any, Dict, List, Optional, Type, Union, Literal, cast
 from datetime import datetime, timezone, timedelta
 from urllib.parse import urlparse, parse_qs, unquote
 
diff --git a/grizzly/locust.py b/grizzly/locust.py
index 8a2bff7e..452cbdb1 100644
--- a/grizzly/locust.py
+++ b/grizzly/locust.py
@@ -20,7 +20,7 @@
     RequestStats,
     CONSOLE_STATS_INTERVAL_SEC,
     STATS_NAME_WIDTH,
-    # STATS_TYPE_WIDTH,
+    STATS_TYPE_WIDTH,
     print_error_report,
     print_percentile_stats,
     print_stats,
@@ -556,20 +556,13 @@ def grizzly_print_stats(stats: RequestStats, current: bool = True, grizzly_style
         print_stats(stats, current=current)
         return
 
-    # @TODO: change when upgrading to locust 2.9.x
-    # name_column_width = (STATS_NAME_WIDTH - STATS_TYPE_WIDTH) + 4  # saved characters by compacting other columns
-    # console_logger.info(
-    #    ("%-" + str(STATS_TYPE_WIDTH) + "s %-" + str(name_column_width) + "s %7s %12s |%7s %7s %7s%7s | %7s %11s")
-    #    % ("Type", "Name", "# reqs", "# fails", "Avg", "Min", "Max", "Med", "req/s", "failures/s")
-    # )
-    # separator = f'{"-" * STATS_TYPE_WIDTH}|{"-" * (name_column_width)}|{"-" * 7}|{"-" * 13}|{"-" * 7}|{"-" * 7}|{"-" * 7}|{"-" * 7}|{"-" * 8}|{"-" * 11}'
-    # console_logger.info(separator)
-
+    name_column_width = (STATS_NAME_WIDTH - STATS_TYPE_WIDTH) + 4  # saved characters by compacting other columns
     stats_logger.info(
-        (" %-" + str(STATS_NAME_WIDTH) + "s %7s %12s  | %7s %7s %7s %7s  | %7s %7s")
-        % ("Name", "# reqs", "# fails", "Avg", "Min", "Max", "Median", "req/s", "failures/s")
+        ("%-" + str(STATS_TYPE_WIDTH) + "s %-" + str(name_column_width) + "s %7s %12s |%7s %7s %7s%7s | %7s %11s")
+        % ("Type", "Name", "# reqs", "# fails", "Avg", "Min", "Max", "Med", "req/s", "failures/s")
     )
-    stats_logger.info("-" * (80 + STATS_NAME_WIDTH))
+    separator = f'{"-" * STATS_TYPE_WIDTH}|{"-" * (name_column_width)}|{"-" * 7}|{"-" * 13}|{"-" * 7}|{"-" * 7}|{"-" * 7}|{"-" * 7}|{"-" * 8}|{"-" * 11}'
+    stats_logger.info(separator)
 
     keys: List[Union[Tuple[str, str], Tuple[str, str, int]]] = sorted(stats.entries.keys())
 
@@ -597,11 +590,6 @@ def grizzly_print_stats(stats: RequestStats, current: bool = True, grizzly_style
         r = stats.entries[key[:2]]
         stats_logger.info(r.to_string(current=current))
 
-    stats_logger.info("-" * (80 + STATS_NAME_WIDTH))
+    stats_logger.info(separator)
     stats_logger.info(stats.total.to_string(current=current))
-    stats_logger.info("")
-
-    # @TODO: change when upgrading to locust 2.9.x
-    # console_logger.info(separator)
-    # console_logger.info(stats.total.to_string(current=current))
-    # console_logger.info("")
+    stats_logger.info('')
diff --git a/grizzly/types.py b/grizzly/types.py
index 66ab0992..300d94f6 100644
--- a/grizzly/types.py
+++ b/grizzly/types.py
@@ -1,8 +1,8 @@
-from enum import Enum
+from enum import Enum, EnumMeta
 from typing import Callable, Optional, Tuple, Any, Union, Dict, TypeVar, List, cast
 from mypy_extensions import KwArg, Arg
 
-from aenum import Enum as AdvancedEnum, NoAlias
+from aenum import Enum as AdvancedEnum, NoAlias, EnumType as AdvancedEnumType
 
 from locust.clients import ResponseContextManager as RequestsResponseContextManager
 from locust.contrib.fasthttp import ResponseContextManager as FastResponseContextManager
@@ -70,7 +70,11 @@ def methods(self) -> List['RequestMethod']:
 
 
 # Enum is needed for keeping mypy happy
-class RequestMethod(Enum, AdvancedEnum, settings=NoAlias):
+class MixedEnumMeta(AdvancedEnumType, EnumMeta):
+    pass
+
+
+class RequestMethod(Enum, AdvancedEnum, metaclass=MixedEnumMeta, settings=NoAlias):
     SEND = RequestDirection.TO
     POST = RequestDirection.TO
     PUT = RequestDirection.TO
@@ -89,7 +93,7 @@ def direction(self) -> RequestDirection:
         return self.value
 
 
-class RequestType(Enum, AdvancedEnum, init='alias _weight'):
+class RequestType(Enum, AdvancedEnum, metaclass=MixedEnumMeta, init='alias _weight'):
     SCENARIO = ('SCEN', 0,)
     TESTDATA = ('TSTD', 1,)
     UNTIL = ('UNTL', None,)
diff --git a/grizzly/users/base/request_logger.py b/grizzly/users/base/request_logger.py
index 3180cabe..2e0ebaa1 100644
--- a/grizzly/users/base/request_logger.py
+++ b/grizzly/users/base/request_logger.py
@@ -9,7 +9,6 @@
 from urllib.parse import urlparse, urlunparse
 
 from locust.env import Environment
-from locust.contrib.fasthttp import ResponseContextManager as FastResponseContextManager
 from jinja2 import Template
 
 from ...tasks import RequestTask
@@ -79,8 +78,11 @@ def _remove_secrets_attribute(self, contents: Optional[Any]) -> Optional[Any]:
         return contents
 
     def _get_http_user_data(self, response: GrizzlyResponseContextManager, user: GrizzlyUser) -> Dict[str, Dict[str, Any]]:
-        request_body: Optional[str]
+        request_headers: Optional[Dict[str, Any]] = None
+        request_body: Optional[str] = None
+
         response_body: Optional[str] = None
+        response_headers: Optional[Dict[str, Any]] = None
 
         if response.text is not None:
             try:
@@ -95,72 +97,30 @@ def _get_http_user_data(self, response: GrizzlyResponseContextManager, user: Gri
                 if len(response_body.strip()) < 1:
                     response_body = None
 
-        try:
-            if isinstance(response, FastResponseContextManager):
-                if response._response is not None:
-                    sent_request = response._response._sent_request  # type: ignore
-
-                    if isinstance(sent_request, bytes):
-                        request = sent_request.decode('utf-8')
-                    elif isinstance(sent_request, str):
-                        request = sent_request
-                    else:
-                        request = None
-
-                    request_lines = request.split('\r\n')
-                    request_body = getattr(response, 'request_body', None)
-                    request_headers = {}
-
-                    _, request_url, _ = request_lines[0].split(' ', 2)
-                    request_url = request_url.strip()
-                    if len(request_url) < 1:
-                        request_url = None
-                    else:
-                        request_url = f'{user.host}{request_url}'
-
-                    for request_line in request_lines[1:]:
-                        request_line = request_line.strip()
-                        if ': ' not in request_line:
-                            continue
-
-                        key, value = request_line.strip().split(': ', 1)
-                        request_headers[key] = value
-
-                    if request_headers == {}:
-                        request_headers = None
-                else:
-                    request_body = None
-                    request_headers = None
-                    request_url = None
-
-                response_url = request_url
-                if response.headers is not None:
-                    response_headers = {key: value for key, value in response.headers.items()}  # type: ignore
-
-                    if len(response_headers) < 1:
-                        response_headers = None
+        response_headers = {key: value for key, value in cast(Dict[str, Any], response.headers).items()} if len(response.headers or {}) > 0 else None
+
+        request = response.request
+
+        if request is not None:
+            if isinstance(request.body, bytes):
+                request_body = request.body.decode('utf-8')
+            elif isinstance(request.body, str):
+                request_body = request.body
             else:
-                if isinstance(response.request.body, bytes):
-                    request_body = response.request.body.decode('utf-8')
-                elif isinstance(response.request.body, str):
-                    request_body = response.request.body
-                else:
-                    request_body = None
-
-                request_headers = dict(response.request.headers) if response.request.headers is not None and len(response.request.headers) > 0 else None
-                request_url = response.request.url
-                response_url = response.url
-                response_headers = dict(response.headers) if response.headers is not None and len(response.headers) > 0 else None
+                request_body = None
+
+            request_headers = {key: value for key, value in request.headers.items()} if len(request.headers or {}) > 0 else None
 
             if request_body is not None:
-                request_body = json.dumps(
-                    self._remove_secrets_attribute(
-                        json.loads(request_body)
-                    ),
-                    indent=2,
-                )
-        except (json.decoder.JSONDecodeError, TypeError):
-            request_body = str(request_body)
+                try:
+                    request_body = json.dumps(
+                        self._remove_secrets_attribute(
+                            json.loads(request_body)
+                        ),
+                        indent=2,
+                    )
+                except (json.decoder.JSONDecodeError, TypeError):
+                    request_body = str(request_body)
 
         response_time: Optional[str]
         if hasattr(response, 'request_meta') and response.request_meta is not None:
@@ -172,13 +132,13 @@ def _get_http_user_data(self, response: GrizzlyResponseContextManager, user: Gri
             'request': {
                 'time': None,
                 'duration': None,
-                'url': request_url,
+                'url': (request or response).url,
                 'metadata': request_headers,
                 'payload': request_body,
             },
             'response': {
                 'time': response_time,
-                'url': response_url,
+                'url': response.url,
                 'metadata': response_headers,
                 'payload': response_body,
                 'status': response.status_code,
diff --git a/grizzly/users/restapi.py b/grizzly/users/restapi.py
index a9c72b21..452b4ab5 100644
--- a/grizzly/users/restapi.py
+++ b/grizzly/users/restapi.py
@@ -570,44 +570,34 @@ def async_request(self, request: RequestTask) -> GrizzlyResponse:
         client = FastHttpSession(
             environment=self.environment,
             base_url=self.host,
-            # should be FastHttpUser, but really, could just be locust.user.users.User ?
-            user=self,  # type: ignore
+            user=self,
             insecure=not self._context.get('verify_certificates', True),
             max_retries=1,
             connection_timeout=60.0,
             network_timeout=60.0,
         )
 
-        return self._request(client, request, {})
+        return self._request(client, request)
 
     def request(self, request: RequestTask) -> GrizzlyResponse:
-        return self._request(
-            self.client, request, {
-                'verify': self._context.get('verify_certificates', True),
-            },
-        )
+        return self._request(self.client, request)
 
     @refresh_token()
-    def _request(self, client: Union[FastHttpSession, ResponseEventSession], request: RequestTask, parameters: Optional[Dict[str, Any]] = None) -> GrizzlyResponse:
+    def _request(self, client: Union[FastHttpSession, ResponseEventSession], request: RequestTask) -> GrizzlyResponse:
         if request.method not in [RequestMethod.GET, RequestMethod.PUT, RequestMethod.POST]:
             raise NotImplementedError(f'{request.method.name} is not implemented for {self.__class__.__name__}')
 
         request_name, endpoint, payload = self.render(request)
 
-        parameters = parameters or {}
-        parameters.update({'headers': self.headers})
+        parameters: Dict[str, Any] = {'headers': self.headers}
 
         url = f'{self.host}{endpoint}'
 
         # only render endpoint once, so needs to be done here
         if isinstance(client, ResponseEventSession):
             parameters.update({
-                'url': url,
                 'request': request,
-            })
-        else:
-            parameters.update({
-                'path': endpoint,
+                'verify': self._context.get('verify_certificates', True),
             })
 
         name = f'{request.scenario.identifier} {request_name}'
@@ -633,6 +623,7 @@ def _request(self, client: Union[FastHttpSession, ResponseEventSession], request
         with client.request(
             method=request.method.name,
             name=name,
+            url=url,
             catch_response=True,
             **parameters,
         ) as response:
diff --git a/requirements-ci.txt b/requirements-ci.txt
index 512884df..25fc7031 100644
--- a/requirements-ci.txt
+++ b/requirements-ci.txt
@@ -4,10 +4,10 @@
 #
 #    script/pip-compile.py
 #
-aenum==3.1.8 \
-    --hash=sha256:07ea89f43d78b3d5997b32b8d5b0ec3e5be17b3e05b7bac0154b8c484a4aeff5 \
-    --hash=sha256:859fe994719e6b5e39f15f73acd84e08b4e57dc642373b177a5fa6646798706a \
-    --hash=sha256:8dbe15f446eb8264b788dfeca163fb0a043d408d212152397dc11377b851e4ae
+aenum==3.1.11 \
+    --hash=sha256:12ae89967f2e25c0ce28c293955d643f891603488bc3d9946158ba2b35203638 \
+    --hash=sha256:525b4870a27d0b471c265bda692bc657f1e0dd7597ad4186d072c59f9db666f6 \
+    --hash=sha256:aed2c273547ae72a0d5ee869719c02a643da16bf507c80958faadc7e038e3f73
     # via grizzly-loadtester (pyproject.toml)
 astroid==2.11.5 \
     --hash=sha256:14ffbb4f6aa2cf474a0834014005487f7ecd8924996083ab411e7fa0b508ce0b \
@@ -155,17 +155,17 @@ brotli==1.0.9 \
     --hash=sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3 \
     --hash=sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1
     # via geventhttpclient
-build==0.7.0 \
-    --hash=sha256:1aaadcd69338252ade4f7ec1265e1a19184bf916d84c9b7df095f423948cb89f \
-    --hash=sha256:21b7ebbd1b22499c4dac536abc7606696ea4d909fd755e00f09f3c0f2c05e3c8
+build==0.8.0 \
+    --hash=sha256:19b0ed489f92ace6947698c3ca8436cb0556a66e2aa2d34cd70e2a5d27cd0437 \
+    --hash=sha256:887a6d471c901b1a6e6574ebaeeebb45e5269a79d095fe9a8f88d6614ed2e5f0
     # via grizzly-loadtester (pyproject.toml)
 cachetools==5.1.0 \
     --hash=sha256:4ebbd38701cdfd3603d1f751d851ed248ab4570929f2d8a7ce69e30c420b141c \
     --hash=sha256:8b3b8fa53f564762e5b221e9896798951e7f915513abf2ba072ce0f07f3f5a98
     # via google-auth
-certifi==2022.5.18 \
-    --hash=sha256:6ae10321df3e464305a46e997da41ea56c1d311fb9ff1dd4e04d6f14653ec63a \
-    --hash=sha256:8d15a5a7fde18536a249c49e07e8e462b8fc13de21b3c80e8a68315dfa227c99
+certifi==2022.5.18.1 \
+    --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \
+    --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a
     # via
     #   geventhttpclient
     #   msrest
@@ -246,74 +246,75 @@ configargparse==1.5.3 \
     --hash=sha256:18f6535a2db9f6e02bd5626cc7455eac3e96b9ab3d969d366f9aafd5c5c00fe7 \
     --hash=sha256:1b0b3cbf664ab59dada57123c81eff3d9737e0d11d8cf79e3d6eb10823f1739f
     # via locust
-coverage[toml]==6.3.3 \
-    --hash=sha256:06f54765cdbce99901871d50fe9f41d58213f18e98b170a30ca34f47de7dd5e8 \
-    --hash=sha256:114944e6061b68a801c5da5427b9173a0dd9d32cd5fcc18a13de90352843737d \
-    --hash=sha256:1414e8b124611bf4df8d77215bd32cba6e3425da8ce9c1f1046149615e3a9a31 \
-    --hash=sha256:2781c43bffbbec2b8867376d4d61916f5e9c4cc168232528562a61d1b4b01879 \
-    --hash=sha256:2ab88a01cd180b5640ccc9c47232e31924d5f9967ab7edd7e5c91c68eee47a69 \
-    --hash=sha256:338c417613f15596af9eb7a39353b60abec9d8ce1080aedba5ecee6a5d85f8d3 \
-    --hash=sha256:3401b0d2ed9f726fadbfa35102e00d1b3547b73772a1de5508ef3bdbcb36afe7 \
-    --hash=sha256:462105283de203df8de58a68c1bb4ba2a8a164097c2379f664fa81d6baf94b81 \
-    --hash=sha256:4cd696aa712e6cd16898d63cf66139dc70d998f8121ab558f0e1936396dbc579 \
-    --hash=sha256:4d06380e777dd6b35ee936f333d55b53dc4a8271036ff884c909cf6e94be8b6c \
-    --hash=sha256:61f4fbf3633cb0713437291b8848634ea97f89c7e849c2be17a665611e433f53 \
-    --hash=sha256:6d4a6f30f611e657495cc81a07ff7aa8cd949144e7667c5d3e680d73ba7a70e4 \
-    --hash=sha256:6f5fee77ec3384b934797f1873758f796dfb4f167e1296dc00f8b2e023ce6ee9 \
-    --hash=sha256:75b5dbffc334e0beb4f6c503fb95e6d422770fd2d1b40a64898ea26d6c02742d \
-    --hash=sha256:7835f76a081787f0ca62a53504361b3869840a1620049b56d803a8cb3a9eeea3 \
-    --hash=sha256:79bf405432428e989cad7b8bc60581963238f7645ae8a404f5dce90236cc0293 \
-    --hash=sha256:8329635c0781927a2c6ae068461e19674c564e05b86736ab8eb29c420ee7dc20 \
-    --hash=sha256:8586b177b4407f988731eb7f41967415b2197f35e2a6ee1a9b9b561f6323c8e9 \
-    --hash=sha256:892e7fe32191960da559a14536768a62e83e87bbb867e1b9c643e7e0fbce2579 \
-    --hash=sha256:91502bf27cbd5c83c95cfea291ef387469f2387508645602e1ca0fd8a4ba7548 \
-    --hash=sha256:93b16b08f94c92cab88073ffd185070cdcb29f1b98df8b28e6649145b7f2c90d \
-    --hash=sha256:9c9441d57b0963cf8340268ad62fc83de61f1613034b79c2b1053046af0c5284 \
-    --hash=sha256:ad8f9068f5972a46d50fe5f32c09d6ee11da69c560fcb1b4c3baea246ca4109b \
-    --hash=sha256:afb03f981fadb5aed1ac6e3dd34f0488e1a0875623d557b6fad09b97a942b38a \
-    --hash=sha256:b5ba058610e8289a07db2a57bce45a1793ec0d3d11db28c047aae2aa1a832572 \
-    --hash=sha256:baa8be8aba3dd1e976e68677be68a960a633a6d44c325757aefaa4d66175050f \
-    --hash=sha256:c06455121a089252b5943ea682187a4e0a5cf0a3fb980eb8e7ce394b144430a9 \
-    --hash=sha256:c1a9942e282cc9d3ed522cd3e3cab081149b27ea3bda72d6f61f84eaf88c1a63 \
-    --hash=sha256:c488db059848702aff30aa1d90ef87928d4e72e4f00717343800546fdbff0a94 \
-    --hash=sha256:cb5311d6ccbd22578c80028c5e292a7ab9adb91bd62c1982087fad75abe2e63d \
-    --hash=sha256:cbe91bc84be4e5ef0b1480d15c7b18e29c73bdfa33e07d3725da7d18e1b0aff2 \
-    --hash=sha256:cc692c9ee18f0dd3214843779ba6b275ee4bb9b9a5745ba64265bce911aefd1a \
-    --hash=sha256:cc972d829ad5ef4d4c5fcabd2bbe2add84ce8236f64ba1c0c72185da3a273130 \
-    --hash=sha256:ceb6534fcdfb5c503affb6b1130db7b5bfc8a0f77fa34880146f7a5c117987d0 \
-    --hash=sha256:d522f1dc49127eab0bfbba4e90fa068ecff0899bbf61bf4065c790ddd6c177fe \
-    --hash=sha256:db094a6a4ae6329ed322a8973f83630b12715654c197dd392410400a5bfa1a73 \
-    --hash=sha256:df32ee0f4935a101e4b9a5f07b617d884a531ed5666671ff6ac66d2e8e8246d8 \
-    --hash=sha256:e5af1feee71099ae2e3b086ec04f57f9950e1be9ecf6c420696fea7977b84738 \
-    --hash=sha256:e814a4a5a1d95223b08cdb0f4f57029e8eab22ffdbae2f97107aeef28554517e \
-    --hash=sha256:f8cabc5fd0091976ab7b020f5708335033e422de25e20ddf9416bdce2b7e07d8 \
-    --hash=sha256:fbc86ae8cc129c801e7baaafe3addf3c8d49c9c1597c44bdf2d78139707c3c62
+coverage[toml]==6.4 \
+    --hash=sha256:00c8544510f3c98476bbd58201ac2b150ffbcce46a8c3e4fb89ebf01998f806a \
+    --hash=sha256:016d7f5cf1c8c84f533a3c1f8f36126fbe00b2ec0ccca47cc5731c3723d327c6 \
+    --hash=sha256:03014a74023abaf5a591eeeaf1ac66a73d54eba178ff4cb1fa0c0a44aae70383 \
+    --hash=sha256:033ebec282793bd9eb988d0271c211e58442c31077976c19c442e24d827d356f \
+    --hash=sha256:21e6686a95025927775ac501e74f5940cdf6fe052292f3a3f7349b0abae6d00f \
+    --hash=sha256:26f8f92699756cb7af2b30720de0c5bb8d028e923a95b6d0c891088025a1ac8f \
+    --hash=sha256:2e76bd16f0e31bc2b07e0fb1379551fcd40daf8cdf7e24f31a29e442878a827c \
+    --hash=sha256:341e9c2008c481c5c72d0e0dbf64980a4b2238631a7f9780b0fe2e95755fb018 \
+    --hash=sha256:3cfd07c5889ddb96a401449109a8b97a165be9d67077df6802f59708bfb07720 \
+    --hash=sha256:4002f9e8c1f286e986fe96ec58742b93484195defc01d5cc7809b8f7acb5ece3 \
+    --hash=sha256:50ed480b798febce113709846b11f5d5ed1e529c88d8ae92f707806c50297abf \
+    --hash=sha256:543e172ce4c0de533fa892034cce260467b213c0ea8e39da2f65f9a477425211 \
+    --hash=sha256:5a78cf2c43b13aa6b56003707c5203f28585944c277c1f3f109c7b041b16bd39 \
+    --hash=sha256:5cd698341626f3c77784858427bad0cdd54a713115b423d22ac83a28303d1d95 \
+    --hash=sha256:60c2147921da7f4d2d04f570e1838db32b95c5509d248f3fe6417e91437eaf41 \
+    --hash=sha256:62d382f7d77eeeaff14b30516b17bcbe80f645f5cf02bb755baac376591c653c \
+    --hash=sha256:69432946f154c6add0e9ede03cc43b96e2ef2733110a77444823c053b1ff5166 \
+    --hash=sha256:727dafd7f67a6e1cad808dc884bd9c5a2f6ef1f8f6d2f22b37b96cb0080d4f49 \
+    --hash=sha256:742fb8b43835078dd7496c3c25a1ec8d15351df49fb0037bffb4754291ef30ce \
+    --hash=sha256:750e13834b597eeb8ae6e72aa58d1d831b96beec5ad1d04479ae3772373a8088 \
+    --hash=sha256:7b546cf2b1974ddc2cb222a109b37c6ed1778b9be7e6b0c0bc0cf0438d9e45a6 \
+    --hash=sha256:83bd142cdec5e4a5c4ca1d4ff6fa807d28460f9db919f9f6a31babaaa8b88426 \
+    --hash=sha256:8d2e80dd3438e93b19e1223a9850fa65425e77f2607a364b6fd134fcd52dc9df \
+    --hash=sha256:9229d074e097f21dfe0643d9d0140ee7433814b3f0fc3706b4abffd1e3038632 \
+    --hash=sha256:968ed5407f9460bd5a591cefd1388cc00a8f5099de9e76234655ae48cfdbe2c3 \
+    --hash=sha256:9c82f2cd69c71698152e943f4a5a6b83a3ab1db73b88f6e769fabc86074c3b08 \
+    --hash=sha256:a00441f5ea4504f5abbc047589d09e0dc33eb447dc45a1a527c8b74bfdd32c65 \
+    --hash=sha256:a022394996419142b33a0cf7274cb444c01d2bb123727c4bb0b9acabcb515dea \
+    --hash=sha256:af5b9ee0fc146e907aa0f5fb858c3b3da9199d78b7bb2c9973d95550bd40f701 \
+    --hash=sha256:b5578efe4038be02d76c344007b13119b2b20acd009a88dde8adec2de4f630b5 \
+    --hash=sha256:b84ab65444dcc68d761e95d4d70f3cfd347ceca5a029f2ffec37d4f124f61311 \
+    --hash=sha256:c53ad261dfc8695062fc8811ac7c162bd6096a05a19f26097f411bdf5747aee7 \
+    --hash=sha256:cc173f1ce9ffb16b299f51c9ce53f66a62f4d975abe5640e976904066f3c835d \
+    --hash=sha256:d548edacbf16a8276af13063a2b0669d58bbcfca7c55a255f84aac2870786a61 \
+    --hash=sha256:d55fae115ef9f67934e9f1103c9ba826b4c690e4c5bcf94482b8b2398311bf9c \
+    --hash=sha256:d8099ea680201c2221f8468c372198ceba9338a5fec0e940111962b03b3f716a \
+    --hash=sha256:e35217031e4b534b09f9b9a5841b9344a30a6357627761d4218818b865d45055 \
+    --hash=sha256:e4f52c272fdc82e7c65ff3f17a7179bc5f710ebc8ce8a5cadac81215e8326740 \
+    --hash=sha256:e637ae0b7b481905358624ef2e81d7fb0b1af55f5ff99f9ba05442a444b11e45 \
+    --hash=sha256:eef5292b60b6de753d6e7f2d128d5841c7915fb1e3321c3a1fe6acfe76c38052 \
+    --hash=sha256:fb45fe08e1abc64eb836d187b20a59172053999823f7f6ef4f18a819c44ba16f
     # via pytest-cov
-cryptography==36.0.2 \
-    --hash=sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b \
-    --hash=sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51 \
-    --hash=sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7 \
-    --hash=sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d \
-    --hash=sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6 \
-    --hash=sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29 \
-    --hash=sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9 \
-    --hash=sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf \
-    --hash=sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815 \
-    --hash=sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf \
-    --hash=sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85 \
-    --hash=sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77 \
-    --hash=sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86 \
-    --hash=sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb \
-    --hash=sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e \
-    --hash=sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0 \
-    --hash=sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3 \
-    --hash=sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84 \
-    --hash=sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2 \
-    --hash=sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6
+cryptography==37.0.2 \
+    --hash=sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804 \
+    --hash=sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178 \
+    --hash=sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717 \
+    --hash=sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982 \
+    --hash=sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004 \
+    --hash=sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe \
+    --hash=sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452 \
+    --hash=sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336 \
+    --hash=sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4 \
+    --hash=sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15 \
+    --hash=sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d \
+    --hash=sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c \
+    --hash=sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0 \
+    --hash=sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06 \
+    --hash=sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9 \
+    --hash=sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1 \
+    --hash=sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023 \
+    --hash=sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de \
+    --hash=sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f \
+    --hash=sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181 \
+    --hash=sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e \
+    --hash=sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a
     # via
     #   azure-identity
     #   azure-storage-blob
-    #   grizzly-loadtester (pyproject.toml)
     #   msal
     #   paramiko
     #   pyjwt
@@ -345,9 +346,9 @@ deprecated==1.2.13 \
     #   databind-core
     #   docspec
     #   nr-util
-dill==0.3.4 \
-    --hash=sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f \
-    --hash=sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675
+dill==0.3.5.1 \
+    --hash=sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302 \
+    --hash=sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86
     # via pylint
 docspec==2.0.1 \
     --hash=sha256:0a70cbd2a057279adc88b6d0c0dc74ee90e46d3741b3556336f822abe2d185ac \
@@ -538,17 +539,17 @@ greenlet==1.1.2 \
     --hash=sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c \
     --hash=sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b
     # via gevent
-grizzly-loadtester-cli==3.0.1 \
-    --hash=sha256:779ee76f6e8cdb0de98596d2af8791b71535c288b990198c3a76ed941ca76ea2 \
-    --hash=sha256:870ada30fe5b50549a0e573036b0da363e03be5f9d5238d49275b902f3d1d7d4
+grizzly-loadtester-cli==3.0.2 \
+    --hash=sha256:4e3c4cce3e78c0b4ab3a388dcf58ffa3b5e2183f830c8b9a98e43853f1dfb8bb \
+    --hash=sha256:ee1378278453f33a9de368ef3ca9dbf71c72c42a8991092f0987905212ceba31
     # via grizzly-loadtester (pyproject.toml)
 idna==3.3 \
     --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \
     --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d
     # via requests
-importlib-metadata==4.11.3 \
-    --hash=sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6 \
-    --hash=sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539
+importlib-metadata==4.11.4 \
+    --hash=sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700 \
+    --hash=sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec
     # via
     #   flask
     #   keyring
@@ -583,14 +584,13 @@ jeepney==0.8.0 \
     # via
     #   keyring
     #   secretstorage
-jinja2==3.0.3 \
-    --hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \
-    --hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7
+jinja2==3.1.2 \
+    --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \
+    --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61
     # via
     #   flask
     #   grizzly-loadtester (pyproject.toml)
     #   grizzly-loadtester-cli
-    #   locust
     #   mkdocs
     #   mkdocs-material
     #   pydoc-markdown
@@ -599,9 +599,9 @@ jsonpath-ng==1.5.3 \
     --hash=sha256:a273b182a82c1256daab86a313b937059261b5c5f8c4fa3fc38b882b344dd567 \
     --hash=sha256:f75b95dbecb8a0f3b86fd2ead21c2b022c3f5770957492b9b6196ecccfeb10aa
     # via grizzly-loadtester (pyproject.toml)
-keyring==23.5.0 \
-    --hash=sha256:9012508e141a80bd1c0b6778d5c610dd9f8c464d75ac6774248500503f972fb9 \
-    --hash=sha256:b0d28928ac3ec8e42ef4cc227822647a19f1d544f21f96457965dc01cf555261
+keyring==23.5.1 \
+    --hash=sha256:9ef58314bcc823f426b49ec787539a2d73571b37de4cd498f839803b01acff1e \
+    --hash=sha256:dee502cdf18a98211bef428eea11456a33c00718b2f08524fd5727c7f424bffd
     # via twine
 lazy-object-proxy==1.7.1 \
     --hash=sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7 \
@@ -642,9 +642,9 @@ lazy-object-proxy==1.7.1 \
     --hash=sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b \
     --hash=sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb
     # via astroid
-locust==2.8.6 \
-    --hash=sha256:011b16b5cf8b8cafe51c74cf86234afc6660ec7bdefbc6a89d6648548e1cc1be \
-    --hash=sha256:30dd8be2b9518ec06f4f18e061b2b625851faccadc70ffbc146b38f9b377b3d3
+locust==2.9.0 \
+    --hash=sha256:62b69109337c3e6542e35c40ad08ba57d3690b0d1468121ba613b3cc01a6340a \
+    --hash=sha256:c2355852b9bccef4d1cc4e587e3448a8b81c9622626248a5809a77c672f59757
     # via grizzly-loadtester (pyproject.toml)
 lxml==4.8.0 \
     --hash=sha256:078306d19a33920004addeb5f4630781aaeabb6a8d01398045fcde085091a169 \
@@ -836,30 +836,30 @@ msrest==0.6.21 \
     # via
     #   azure-servicebus
     #   azure-storage-blob
-mypy==0.950 \
-    --hash=sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d \
-    --hash=sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8 \
-    --hash=sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de \
-    --hash=sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038 \
-    --hash=sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed \
-    --hash=sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334 \
-    --hash=sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff \
-    --hash=sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2 \
-    --hash=sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22 \
-    --hash=sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2 \
-    --hash=sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2 \
-    --hash=sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605 \
-    --hash=sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb \
-    --hash=sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519 \
-    --hash=sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0 \
-    --hash=sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc \
-    --hash=sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b \
-    --hash=sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f \
-    --hash=sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075 \
-    --hash=sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef \
-    --hash=sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb \
-    --hash=sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a \
-    --hash=sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b
+mypy==0.960 \
+    --hash=sha256:0ebfb3f414204b98c06791af37a3a96772203da60636e2897408517fcfeee7a8 \
+    --hash=sha256:239d6b2242d6c7f5822163ee082ef7a28ee02e7ac86c35593ef923796826a385 \
+    --hash=sha256:29dc94d9215c3eb80ac3c2ad29d0c22628accfb060348fd23d73abe3ace6c10d \
+    --hash=sha256:2c7f8bb9619290836a4e167e2ef1f2cf14d70e0bc36c04441e41487456561409 \
+    --hash=sha256:33d53a232bb79057f33332dbbb6393e68acbcb776d2f571ba4b1d50a2c8ba873 \
+    --hash=sha256:3a3e525cd76c2c4f90f1449fd034ba21fcca68050ff7c8397bb7dd25dd8b8248 \
+    --hash=sha256:3eabcbd2525f295da322dff8175258f3fc4c3eb53f6d1929644ef4d99b92e72d \
+    --hash=sha256:481f98c6b24383188c928f33dd2f0776690807e12e9989dd0419edd5c74aa53b \
+    --hash=sha256:7a76dc4f91e92db119b1be293892df8379b08fd31795bb44e0ff84256d34c251 \
+    --hash=sha256:7d390248ec07fa344b9f365e6ed9d205bd0205e485c555bed37c4235c868e9d5 \
+    --hash=sha256:826a2917c275e2ee05b7c7b736c1e6549a35b7ea5a198ca457f8c2ebea2cbecf \
+    --hash=sha256:85cf2b14d32b61db24ade8ac9ae7691bdfc572a403e3cb8537da936e74713275 \
+    --hash=sha256:8d645e9e7f7a5da3ec3bbcc314ebb9bb22c7ce39e70367830eb3c08d0140b9ce \
+    --hash=sha256:925aa84369a07846b7f3b8556ccade1f371aa554f2bd4fb31cb97a24b73b036e \
+    --hash=sha256:a85a20b43fa69efc0b955eba1db435e2ffecb1ca695fe359768e0503b91ea89f \
+    --hash=sha256:bfd4f6536bd384c27c392a8b8f790fd0ed5c0cf2f63fc2fed7bce56751d53026 \
+    --hash=sha256:cb7752b24528c118a7403ee955b6a578bfcf5879d5ee91790667c8ea511d2085 \
+    --hash=sha256:cc537885891382e08129d9862553b3d00d4be3eb15b8cae9e2466452f52b0117 \
+    --hash=sha256:d4fccf04c1acf750babd74252e0f2db6bd2ac3aa8fe960797d9f3ef41cf2bfd4 \
+    --hash=sha256:f1ba54d440d4feee49d8768ea952137316d454b15301c44403db3f2cb51af024 \
+    --hash=sha256:f47322796c412271f5aea48381a528a613f33e0a115452d03ae35d673e6064f8 \
+    --hash=sha256:fbfb873cf2b8d8c3c513367febde932e061a5f73f762896826ba06391d932b2a \
+    --hash=sha256:ffdad80a92c100d1b0fe3d3cf1a4724136029a29afe8566404c0146747114382
     # via grizzly-loadtester (pyproject.toml)
 mypy-extensions==0.4.3 \
     --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \
@@ -918,9 +918,9 @@ pep517==0.12.0 \
     # via
     #   build
     #   pip-tools
-pip-tools==6.6.1 \
-    --hash=sha256:48a26382c8477adf2cca8b9128093f4778fdadaade74bfaab0832d53d9cb256a \
-    --hash=sha256:634e3e8d4707257c004313d16a9d6c14c1ce94d3c0fa1f93c38d264401f2e4f2
+pip-tools==6.6.2 \
+    --hash=sha256:6b486548e5a139e30e4c4a225b3b7c2d46942a9f6d1a91143c21b1de4d02fd9b \
+    --hash=sha256:f638503a9f77d98d9a7d72584b1508d3f82ed019b8fab24f4e5ad078c1b8c95e
     # via grizzly-loadtester (pyproject.toml)
 pkginfo==1.8.2 \
     --hash=sha256:542e0d0b6750e2e21c20179803e40ab50598d8066d51097a0e382cba9eb02bff \
@@ -942,67 +942,57 @@ portalocker==2.4.0 \
     --hash=sha256:a648ad761b8ea27370cb5915350122cd807b820d2193ed5c9cc28f163df637f4 \
     --hash=sha256:b092f48e1e30a234ab3dd1cfd44f2f235e8a41f4e310e463fc8d6798d1c3c235
     # via msal-extensions
-protobuf==3.20.1 \
-    --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \
-    --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \
-    --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \
-    --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \
-    --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \
-    --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \
-    --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \
-    --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \
-    --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \
-    --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \
-    --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \
-    --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \
-    --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \
-    --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \
-    --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \
-    --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \
-    --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \
-    --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \
-    --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \
-    --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \
-    --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \
-    --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \
-    --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \
-    --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3
+protobuf==4.21.0 \
+    --hash=sha256:14c5fa41122e270d815b954ecdc25cb107d44b7d039def5cc57a5e5a9ab8d741 \
+    --hash=sha256:157e4ad67bf75d5719516fbf13fd652c634fd71338e01d2ac872bf365213b7a6 \
+    --hash=sha256:182b626615043e191e994672b7bbf1036bad5edc9f8f300a2f3a1fe77409a444 \
+    --hash=sha256:2188063b59e1606cc45a1ad68beae7b94bec36e6d27d5e857dd611b79cdda99f \
+    --hash=sha256:2c753c5aa0943479a3f84b90e8c5bb28fef8cc3eb79c2c35e1bbf00d56cc435f \
+    --hash=sha256:4e78116673ba04e01e563f6a9cca2c72db0be8a3e1629094816357e81cc39d36 \
+    --hash=sha256:6efbe40afb1b0303def53b3c5ce211b14e10d73d63a3f8b669ac0e3b74e8f863 \
+    --hash=sha256:9a65e012bc06022e98a57165ea48438b3b9f652eee33db7cbecb883588f9f169 \
+    --hash=sha256:b33660b14d582a700a47c8808a3f2da33f5bb3be576a8ae419d608db6b4f19b0 \
+    --hash=sha256:bc78d6c23873ebf33076f0851ef64d050e7246d5b1e651b38a7e92c05f14881d \
+    --hash=sha256:c8fc31d44e239178da6a698e0b69798387469b89172de3470a49d799550523a7 \
+    --hash=sha256:c92a9e2a94b9df945a6c578c3f53ace862ed3a50e849f41c27106007cc63ca8c \
+    --hash=sha256:da3bb1acd646f01b4bdec128462441838e596899c5a5e1d2e8e31975f36cd0c4 \
+    --hash=sha256:f12e26fda74c40f308d37525e5276883388f25ff9a0c880f40f79d3ce9097d81
     # via
     #   google-api-core
     #   googleapis-common-protos
-psutil==5.9.0 \
-    --hash=sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5 \
-    --hash=sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a \
-    --hash=sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4 \
-    --hash=sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841 \
-    --hash=sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d \
-    --hash=sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d \
-    --hash=sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0 \
-    --hash=sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845 \
-    --hash=sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf \
-    --hash=sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b \
-    --hash=sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07 \
-    --hash=sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618 \
-    --hash=sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2 \
-    --hash=sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd \
-    --hash=sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666 \
-    --hash=sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce \
-    --hash=sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3 \
-    --hash=sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d \
-    --hash=sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25 \
-    --hash=sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492 \
-    --hash=sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b \
-    --hash=sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d \
-    --hash=sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2 \
-    --hash=sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203 \
-    --hash=sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2 \
-    --hash=sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94 \
-    --hash=sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9 \
-    --hash=sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64 \
-    --hash=sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56 \
-    --hash=sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3 \
-    --hash=sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c \
-    --hash=sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3
+psutil==5.9.1 \
+    --hash=sha256:068935df39055bf27a29824b95c801c7a5130f118b806eee663cad28dca97685 \
+    --hash=sha256:0904727e0b0a038830b019551cf3204dd48ef5c6868adc776e06e93d615fc5fc \
+    --hash=sha256:0f15a19a05f39a09327345bc279c1ba4a8cfb0172cc0d3c7f7d16c813b2e7d36 \
+    --hash=sha256:19f36c16012ba9cfc742604df189f2f28d2720e23ff7d1e81602dbe066be9fd1 \
+    --hash=sha256:20b27771b077dcaa0de1de3ad52d22538fe101f9946d6dc7869e6f694f079329 \
+    --hash=sha256:28976df6c64ddd6320d281128817f32c29b539a52bdae5e192537bc338a9ec81 \
+    --hash=sha256:29a442e25fab1f4d05e2655bb1b8ab6887981838d22effa2396d584b740194de \
+    --hash=sha256:3054e923204b8e9c23a55b23b6df73a8089ae1d075cb0bf711d3e9da1724ded4 \
+    --hash=sha256:32c52611756096ae91f5d1499fe6c53b86f4a9ada147ee42db4991ba1520e574 \
+    --hash=sha256:3a76ad658641172d9c6e593de6fe248ddde825b5866464c3b2ee26c35da9d237 \
+    --hash=sha256:44d1826150d49ffd62035785a9e2c56afcea66e55b43b8b630d7706276e87f22 \
+    --hash=sha256:4b6750a73a9c4a4e689490ccb862d53c7b976a2a35c4e1846d049dcc3f17d83b \
+    --hash=sha256:56960b9e8edcca1456f8c86a196f0c3d8e3e361320071c93378d41445ffd28b0 \
+    --hash=sha256:57f1819b5d9e95cdfb0c881a8a5b7d542ed0b7c522d575706a80bedc848c8954 \
+    --hash=sha256:58678bbadae12e0db55186dc58f2888839228ac9f41cc7848853539b70490021 \
+    --hash=sha256:645bd4f7bb5b8633803e0b6746ff1628724668681a434482546887d22c7a9537 \
+    --hash=sha256:799759d809c31aab5fe4579e50addf84565e71c1dc9f1c31258f159ff70d3f87 \
+    --hash=sha256:79c9108d9aa7fa6fba6e668b61b82facc067a6b81517cab34d07a84aa89f3df0 \
+    --hash=sha256:91c7ff2a40c373d0cc9121d54bc5f31c4fa09c346528e6a08d1845bce5771ffc \
+    --hash=sha256:9272167b5f5fbfe16945be3db475b3ce8d792386907e673a209da686176552af \
+    --hash=sha256:944c4b4b82dc4a1b805329c980f270f170fdc9945464223f2ec8e57563139cf4 \
+    --hash=sha256:a6a11e48cb93a5fa606306493f439b4aa7c56cb03fc9ace7f6bfa21aaf07c453 \
+    --hash=sha256:a8746bfe4e8f659528c5c7e9af5090c5a7d252f32b2e859c584ef7d8efb1e689 \
+    --hash=sha256:abd9246e4cdd5b554a2ddd97c157e292ac11ef3e7af25ac56b08b455c829dca8 \
+    --hash=sha256:b14ee12da9338f5e5b3a3ef7ca58b3cba30f5b66f7662159762932e6d0b8f680 \
+    --hash=sha256:b88f75005586131276634027f4219d06e0561292be8bd6bc7f2f00bdabd63c4e \
+    --hash=sha256:c7be9d7f5b0d206f0bbc3794b8e16fb7dbc53ec9e40bbe8787c6f2d38efcf6c9 \
+    --hash=sha256:d2d006286fbcb60f0b391741f520862e9b69f4019b4d738a2a45728c7e952f1b \
+    --hash=sha256:db417f0865f90bdc07fa30e1aadc69b6f4cad7f86324b02aa842034efe8d8c4d \
+    --hash=sha256:e7e10454cb1ab62cc6ce776e1c135a64045a11ec4c6d254d3f7689c16eb3efd2 \
+    --hash=sha256:f65f9a46d984b8cd9b3750c2bdb419b2996895b005aefa6cbaba9a143b1ce2c5 \
+    --hash=sha256:fea896b54f3a4ae6f790ac1d017101252c93f6fe075d0e7571543510f11d2676
     # via
     #   locust
     #   opencensus-ext-azure
@@ -1378,9 +1368,9 @@ types-pyyaml==5.4.12 \
     --hash=sha256:3f4daa754357491625ae8c3a39c9e1b0d7cd5632bc4e1c35e7a7f75a64aa124b \
     --hash=sha256:e06083f85375a5678e4c19452ed6467ce2167b71db222313e1792cb8fc76859a
     # via grizzly-loadtester (pyproject.toml)
-types-requests==2.27.27 \
-    --hash=sha256:6d8463ffe1f6edcf2e5361740a6140e7a16d427c267d83c7c1d3d1298f4e67c5 \
-    --hash=sha256:d618d9809fa32f514cf17cea8460814da671c56366fb1c908accca8bf183112b
+types-requests==2.27.28 \
+    --hash=sha256:46c72c9ddc73010b14cd19f67023df4a01519411ecf632a305b02e32ca8eb3b8 \
+    --hash=sha256:c2647aca57977bc7a4e9c9d9e14a6c76e6503bc64dcbc9f03836df26e54a80c8
     # via grizzly-loadtester (pyproject.toml)
 types-urllib3==1.26.14 \
     --hash=sha256:2a2578e4b36341ccd240b00fccda9826988ff0589a44ba4a664bbd69ef348d27 \
@@ -1395,7 +1385,6 @@ typing-extensions==3.10.0.2 \
     #   azure-servicebus
     #   databind-core
     #   databind-json
-    #   grizzly-loadtester (pyproject.toml)
     #   locust
     #   mypy
     #   nr-util
@@ -1617,9 +1606,9 @@ zope-interface==5.4.0 \
     # via gevent
 
 # The following packages are considered to be unsafe in a requirements file:
-pip==22.1 \
-    --hash=sha256:2debf847016cfe643fa1512e2d781d3ca9e5c878ba0652583842d50cc2bcc605 \
-    --hash=sha256:802e797fb741be1c2d475533d4ea951957e4940091422bd4a24848a7ac95609d
+pip==22.1.1 \
+    --hash=sha256:8dfb15d8a1c3d3085a4cbe11f29e19527dfaf2ba99354326fd62cec013eaee81 \
+    --hash=sha256:e7bcf0b2cbdec2af84cc1b7b79b25fdbd7228fbdb61a4dca0b82810d0ba9d18b
     # via pip-tools
 setuptools==62.3.2 \
     --hash=sha256:68e45d17c9281ba25dc0104eadd2647172b3472d9e01f911efa57965e8d51a36 \
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 9931f481..0d16beb2 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -4,10 +4,10 @@
 #
 #    script/pip-compile.py
 #
-aenum==3.1.8 \
-    --hash=sha256:07ea89f43d78b3d5997b32b8d5b0ec3e5be17b3e05b7bac0154b8c484a4aeff5 \
-    --hash=sha256:859fe994719e6b5e39f15f73acd84e08b4e57dc642373b177a5fa6646798706a \
-    --hash=sha256:8dbe15f446eb8264b788dfeca163fb0a043d408d212152397dc11377b851e4ae
+aenum==3.1.11 \
+    --hash=sha256:12ae89967f2e25c0ce28c293955d643f891603488bc3d9946158ba2b35203638 \
+    --hash=sha256:525b4870a27d0b471c265bda692bc657f1e0dd7597ad4186d072c59f9db666f6 \
+    --hash=sha256:aed2c273547ae72a0d5ee869719c02a643da16bf507c80958faadc7e038e3f73
     # via grizzly-loadtester (pyproject.toml)
 astroid==2.11.5 \
     --hash=sha256:14ffbb4f6aa2cf474a0834014005487f7ecd8924996083ab411e7fa0b508ce0b \
@@ -155,9 +155,9 @@ cachetools==5.1.0 \
     --hash=sha256:4ebbd38701cdfd3603d1f751d851ed248ab4570929f2d8a7ce69e30c420b141c \
     --hash=sha256:8b3b8fa53f564762e5b221e9896798951e7f915513abf2ba072ce0f07f3f5a98
     # via google-auth
-certifi==2022.5.18 \
-    --hash=sha256:6ae10321df3e464305a46e997da41ea56c1d311fb9ff1dd4e04d6f14653ec63a \
-    --hash=sha256:8d15a5a7fde18536a249c49e07e8e462b8fc13de21b3c80e8a68315dfa227c99
+certifi==2022.5.18.1 \
+    --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \
+    --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a
     # via
     #   geventhttpclient
     #   msrest
@@ -233,74 +233,75 @@ configargparse==1.5.3 \
     --hash=sha256:18f6535a2db9f6e02bd5626cc7455eac3e96b9ab3d969d366f9aafd5c5c00fe7 \
     --hash=sha256:1b0b3cbf664ab59dada57123c81eff3d9737e0d11d8cf79e3d6eb10823f1739f
     # via locust
-coverage[toml]==6.3.3 \
-    --hash=sha256:06f54765cdbce99901871d50fe9f41d58213f18e98b170a30ca34f47de7dd5e8 \
-    --hash=sha256:114944e6061b68a801c5da5427b9173a0dd9d32cd5fcc18a13de90352843737d \
-    --hash=sha256:1414e8b124611bf4df8d77215bd32cba6e3425da8ce9c1f1046149615e3a9a31 \
-    --hash=sha256:2781c43bffbbec2b8867376d4d61916f5e9c4cc168232528562a61d1b4b01879 \
-    --hash=sha256:2ab88a01cd180b5640ccc9c47232e31924d5f9967ab7edd7e5c91c68eee47a69 \
-    --hash=sha256:338c417613f15596af9eb7a39353b60abec9d8ce1080aedba5ecee6a5d85f8d3 \
-    --hash=sha256:3401b0d2ed9f726fadbfa35102e00d1b3547b73772a1de5508ef3bdbcb36afe7 \
-    --hash=sha256:462105283de203df8de58a68c1bb4ba2a8a164097c2379f664fa81d6baf94b81 \
-    --hash=sha256:4cd696aa712e6cd16898d63cf66139dc70d998f8121ab558f0e1936396dbc579 \
-    --hash=sha256:4d06380e777dd6b35ee936f333d55b53dc4a8271036ff884c909cf6e94be8b6c \
-    --hash=sha256:61f4fbf3633cb0713437291b8848634ea97f89c7e849c2be17a665611e433f53 \
-    --hash=sha256:6d4a6f30f611e657495cc81a07ff7aa8cd949144e7667c5d3e680d73ba7a70e4 \
-    --hash=sha256:6f5fee77ec3384b934797f1873758f796dfb4f167e1296dc00f8b2e023ce6ee9 \
-    --hash=sha256:75b5dbffc334e0beb4f6c503fb95e6d422770fd2d1b40a64898ea26d6c02742d \
-    --hash=sha256:7835f76a081787f0ca62a53504361b3869840a1620049b56d803a8cb3a9eeea3 \
-    --hash=sha256:79bf405432428e989cad7b8bc60581963238f7645ae8a404f5dce90236cc0293 \
-    --hash=sha256:8329635c0781927a2c6ae068461e19674c564e05b86736ab8eb29c420ee7dc20 \
-    --hash=sha256:8586b177b4407f988731eb7f41967415b2197f35e2a6ee1a9b9b561f6323c8e9 \
-    --hash=sha256:892e7fe32191960da559a14536768a62e83e87bbb867e1b9c643e7e0fbce2579 \
-    --hash=sha256:91502bf27cbd5c83c95cfea291ef387469f2387508645602e1ca0fd8a4ba7548 \
-    --hash=sha256:93b16b08f94c92cab88073ffd185070cdcb29f1b98df8b28e6649145b7f2c90d \
-    --hash=sha256:9c9441d57b0963cf8340268ad62fc83de61f1613034b79c2b1053046af0c5284 \
-    --hash=sha256:ad8f9068f5972a46d50fe5f32c09d6ee11da69c560fcb1b4c3baea246ca4109b \
-    --hash=sha256:afb03f981fadb5aed1ac6e3dd34f0488e1a0875623d557b6fad09b97a942b38a \
-    --hash=sha256:b5ba058610e8289a07db2a57bce45a1793ec0d3d11db28c047aae2aa1a832572 \
-    --hash=sha256:baa8be8aba3dd1e976e68677be68a960a633a6d44c325757aefaa4d66175050f \
-    --hash=sha256:c06455121a089252b5943ea682187a4e0a5cf0a3fb980eb8e7ce394b144430a9 \
-    --hash=sha256:c1a9942e282cc9d3ed522cd3e3cab081149b27ea3bda72d6f61f84eaf88c1a63 \
-    --hash=sha256:c488db059848702aff30aa1d90ef87928d4e72e4f00717343800546fdbff0a94 \
-    --hash=sha256:cb5311d6ccbd22578c80028c5e292a7ab9adb91bd62c1982087fad75abe2e63d \
-    --hash=sha256:cbe91bc84be4e5ef0b1480d15c7b18e29c73bdfa33e07d3725da7d18e1b0aff2 \
-    --hash=sha256:cc692c9ee18f0dd3214843779ba6b275ee4bb9b9a5745ba64265bce911aefd1a \
-    --hash=sha256:cc972d829ad5ef4d4c5fcabd2bbe2add84ce8236f64ba1c0c72185da3a273130 \
-    --hash=sha256:ceb6534fcdfb5c503affb6b1130db7b5bfc8a0f77fa34880146f7a5c117987d0 \
-    --hash=sha256:d522f1dc49127eab0bfbba4e90fa068ecff0899bbf61bf4065c790ddd6c177fe \
-    --hash=sha256:db094a6a4ae6329ed322a8973f83630b12715654c197dd392410400a5bfa1a73 \
-    --hash=sha256:df32ee0f4935a101e4b9a5f07b617d884a531ed5666671ff6ac66d2e8e8246d8 \
-    --hash=sha256:e5af1feee71099ae2e3b086ec04f57f9950e1be9ecf6c420696fea7977b84738 \
-    --hash=sha256:e814a4a5a1d95223b08cdb0f4f57029e8eab22ffdbae2f97107aeef28554517e \
-    --hash=sha256:f8cabc5fd0091976ab7b020f5708335033e422de25e20ddf9416bdce2b7e07d8 \
-    --hash=sha256:fbc86ae8cc129c801e7baaafe3addf3c8d49c9c1597c44bdf2d78139707c3c62
+coverage[toml]==6.4 \
+    --hash=sha256:00c8544510f3c98476bbd58201ac2b150ffbcce46a8c3e4fb89ebf01998f806a \
+    --hash=sha256:016d7f5cf1c8c84f533a3c1f8f36126fbe00b2ec0ccca47cc5731c3723d327c6 \
+    --hash=sha256:03014a74023abaf5a591eeeaf1ac66a73d54eba178ff4cb1fa0c0a44aae70383 \
+    --hash=sha256:033ebec282793bd9eb988d0271c211e58442c31077976c19c442e24d827d356f \
+    --hash=sha256:21e6686a95025927775ac501e74f5940cdf6fe052292f3a3f7349b0abae6d00f \
+    --hash=sha256:26f8f92699756cb7af2b30720de0c5bb8d028e923a95b6d0c891088025a1ac8f \
+    --hash=sha256:2e76bd16f0e31bc2b07e0fb1379551fcd40daf8cdf7e24f31a29e442878a827c \
+    --hash=sha256:341e9c2008c481c5c72d0e0dbf64980a4b2238631a7f9780b0fe2e95755fb018 \
+    --hash=sha256:3cfd07c5889ddb96a401449109a8b97a165be9d67077df6802f59708bfb07720 \
+    --hash=sha256:4002f9e8c1f286e986fe96ec58742b93484195defc01d5cc7809b8f7acb5ece3 \
+    --hash=sha256:50ed480b798febce113709846b11f5d5ed1e529c88d8ae92f707806c50297abf \
+    --hash=sha256:543e172ce4c0de533fa892034cce260467b213c0ea8e39da2f65f9a477425211 \
+    --hash=sha256:5a78cf2c43b13aa6b56003707c5203f28585944c277c1f3f109c7b041b16bd39 \
+    --hash=sha256:5cd698341626f3c77784858427bad0cdd54a713115b423d22ac83a28303d1d95 \
+    --hash=sha256:60c2147921da7f4d2d04f570e1838db32b95c5509d248f3fe6417e91437eaf41 \
+    --hash=sha256:62d382f7d77eeeaff14b30516b17bcbe80f645f5cf02bb755baac376591c653c \
+    --hash=sha256:69432946f154c6add0e9ede03cc43b96e2ef2733110a77444823c053b1ff5166 \
+    --hash=sha256:727dafd7f67a6e1cad808dc884bd9c5a2f6ef1f8f6d2f22b37b96cb0080d4f49 \
+    --hash=sha256:742fb8b43835078dd7496c3c25a1ec8d15351df49fb0037bffb4754291ef30ce \
+    --hash=sha256:750e13834b597eeb8ae6e72aa58d1d831b96beec5ad1d04479ae3772373a8088 \
+    --hash=sha256:7b546cf2b1974ddc2cb222a109b37c6ed1778b9be7e6b0c0bc0cf0438d9e45a6 \
+    --hash=sha256:83bd142cdec5e4a5c4ca1d4ff6fa807d28460f9db919f9f6a31babaaa8b88426 \
+    --hash=sha256:8d2e80dd3438e93b19e1223a9850fa65425e77f2607a364b6fd134fcd52dc9df \
+    --hash=sha256:9229d074e097f21dfe0643d9d0140ee7433814b3f0fc3706b4abffd1e3038632 \
+    --hash=sha256:968ed5407f9460bd5a591cefd1388cc00a8f5099de9e76234655ae48cfdbe2c3 \
+    --hash=sha256:9c82f2cd69c71698152e943f4a5a6b83a3ab1db73b88f6e769fabc86074c3b08 \
+    --hash=sha256:a00441f5ea4504f5abbc047589d09e0dc33eb447dc45a1a527c8b74bfdd32c65 \
+    --hash=sha256:a022394996419142b33a0cf7274cb444c01d2bb123727c4bb0b9acabcb515dea \
+    --hash=sha256:af5b9ee0fc146e907aa0f5fb858c3b3da9199d78b7bb2c9973d95550bd40f701 \
+    --hash=sha256:b5578efe4038be02d76c344007b13119b2b20acd009a88dde8adec2de4f630b5 \
+    --hash=sha256:b84ab65444dcc68d761e95d4d70f3cfd347ceca5a029f2ffec37d4f124f61311 \
+    --hash=sha256:c53ad261dfc8695062fc8811ac7c162bd6096a05a19f26097f411bdf5747aee7 \
+    --hash=sha256:cc173f1ce9ffb16b299f51c9ce53f66a62f4d975abe5640e976904066f3c835d \
+    --hash=sha256:d548edacbf16a8276af13063a2b0669d58bbcfca7c55a255f84aac2870786a61 \
+    --hash=sha256:d55fae115ef9f67934e9f1103c9ba826b4c690e4c5bcf94482b8b2398311bf9c \
+    --hash=sha256:d8099ea680201c2221f8468c372198ceba9338a5fec0e940111962b03b3f716a \
+    --hash=sha256:e35217031e4b534b09f9b9a5841b9344a30a6357627761d4218818b865d45055 \
+    --hash=sha256:e4f52c272fdc82e7c65ff3f17a7179bc5f710ebc8ce8a5cadac81215e8326740 \
+    --hash=sha256:e637ae0b7b481905358624ef2e81d7fb0b1af55f5ff99f9ba05442a444b11e45 \
+    --hash=sha256:eef5292b60b6de753d6e7f2d128d5841c7915fb1e3321c3a1fe6acfe76c38052 \
+    --hash=sha256:fb45fe08e1abc64eb836d187b20a59172053999823f7f6ef4f18a819c44ba16f
     # via pytest-cov
-cryptography==36.0.2 \
-    --hash=sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b \
-    --hash=sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51 \
-    --hash=sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7 \
-    --hash=sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d \
-    --hash=sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6 \
-    --hash=sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29 \
-    --hash=sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9 \
-    --hash=sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf \
-    --hash=sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815 \
-    --hash=sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf \
-    --hash=sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85 \
-    --hash=sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77 \
-    --hash=sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86 \
-    --hash=sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb \
-    --hash=sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e \
-    --hash=sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0 \
-    --hash=sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3 \
-    --hash=sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84 \
-    --hash=sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2 \
-    --hash=sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6
+cryptography==37.0.2 \
+    --hash=sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804 \
+    --hash=sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178 \
+    --hash=sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717 \
+    --hash=sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982 \
+    --hash=sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004 \
+    --hash=sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe \
+    --hash=sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452 \
+    --hash=sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336 \
+    --hash=sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4 \
+    --hash=sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15 \
+    --hash=sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d \
+    --hash=sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c \
+    --hash=sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0 \
+    --hash=sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06 \
+    --hash=sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9 \
+    --hash=sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1 \
+    --hash=sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023 \
+    --hash=sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de \
+    --hash=sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f \
+    --hash=sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181 \
+    --hash=sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e \
+    --hash=sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a
     # via
     #   azure-identity
     #   azure-storage-blob
-    #   grizzly-loadtester (pyproject.toml)
     #   msal
     #   paramiko
     #   pyjwt
@@ -331,9 +332,9 @@ deprecated==1.2.13 \
     #   databind-core
     #   docspec
     #   nr-util
-dill==0.3.4 \
-    --hash=sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f \
-    --hash=sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675
+dill==0.3.5.1 \
+    --hash=sha256:33501d03270bbe410c72639b350e941882a8b0fd55357580fbc873fba0c59302 \
+    --hash=sha256:d75e41f3eff1eee599d738e76ba8f4ad98ea229db8b085318aa2b3333a208c86
     # via pylint
 docspec==2.0.1 \
     --hash=sha256:0a70cbd2a057279adc88b6d0c0dc74ee90e46d3741b3556336f822abe2d185ac \
@@ -520,17 +521,17 @@ greenlet==1.1.2 \
     --hash=sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c \
     --hash=sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b
     # via gevent
-grizzly-loadtester-cli==3.0.1 \
-    --hash=sha256:779ee76f6e8cdb0de98596d2af8791b71535c288b990198c3a76ed941ca76ea2 \
-    --hash=sha256:870ada30fe5b50549a0e573036b0da363e03be5f9d5238d49275b902f3d1d7d4
+grizzly-loadtester-cli==3.0.2 \
+    --hash=sha256:4e3c4cce3e78c0b4ab3a388dcf58ffa3b5e2183f830c8b9a98e43853f1dfb8bb \
+    --hash=sha256:ee1378278453f33a9de368ef3ca9dbf71c72c42a8991092f0987905212ceba31
     # via grizzly-loadtester (pyproject.toml)
 idna==3.3 \
     --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \
     --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d
     # via requests
-importlib-metadata==4.11.3 \
-    --hash=sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6 \
-    --hash=sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539
+importlib-metadata==4.11.4 \
+    --hash=sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700 \
+    --hash=sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec
     # via
     #   flask
     #   markdown
@@ -557,14 +558,13 @@ itsdangerous==2.1.2 \
     --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \
     --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a
     # via flask
-jinja2==3.0.3 \
-    --hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \
-    --hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7
+jinja2==3.1.2 \
+    --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \
+    --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61
     # via
     #   flask
     #   grizzly-loadtester (pyproject.toml)
     #   grizzly-loadtester-cli
-    #   locust
     #   mkdocs
     #   mkdocs-material
     #   pydoc-markdown
@@ -612,9 +612,9 @@ lazy-object-proxy==1.7.1 \
     --hash=sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b \
     --hash=sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb
     # via astroid
-locust==2.8.6 \
-    --hash=sha256:011b16b5cf8b8cafe51c74cf86234afc6660ec7bdefbc6a89d6648548e1cc1be \
-    --hash=sha256:30dd8be2b9518ec06f4f18e061b2b625851faccadc70ffbc146b38f9b377b3d3
+locust==2.9.0 \
+    --hash=sha256:62b69109337c3e6542e35c40ad08ba57d3690b0d1468121ba613b3cc01a6340a \
+    --hash=sha256:c2355852b9bccef4d1cc4e587e3448a8b81c9622626248a5809a77c672f59757
     # via grizzly-loadtester (pyproject.toml)
 lxml==4.8.0 \
     --hash=sha256:078306d19a33920004addeb5f4630781aaeabb6a8d01398045fcde085091a169 \
@@ -806,30 +806,30 @@ msrest==0.6.21 \
     # via
     #   azure-servicebus
     #   azure-storage-blob
-mypy==0.950 \
-    --hash=sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d \
-    --hash=sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8 \
-    --hash=sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de \
-    --hash=sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038 \
-    --hash=sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed \
-    --hash=sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334 \
-    --hash=sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff \
-    --hash=sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2 \
-    --hash=sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22 \
-    --hash=sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2 \
-    --hash=sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2 \
-    --hash=sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605 \
-    --hash=sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb \
-    --hash=sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519 \
-    --hash=sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0 \
-    --hash=sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc \
-    --hash=sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b \
-    --hash=sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f \
-    --hash=sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075 \
-    --hash=sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef \
-    --hash=sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb \
-    --hash=sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a \
-    --hash=sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b
+mypy==0.960 \
+    --hash=sha256:0ebfb3f414204b98c06791af37a3a96772203da60636e2897408517fcfeee7a8 \
+    --hash=sha256:239d6b2242d6c7f5822163ee082ef7a28ee02e7ac86c35593ef923796826a385 \
+    --hash=sha256:29dc94d9215c3eb80ac3c2ad29d0c22628accfb060348fd23d73abe3ace6c10d \
+    --hash=sha256:2c7f8bb9619290836a4e167e2ef1f2cf14d70e0bc36c04441e41487456561409 \
+    --hash=sha256:33d53a232bb79057f33332dbbb6393e68acbcb776d2f571ba4b1d50a2c8ba873 \
+    --hash=sha256:3a3e525cd76c2c4f90f1449fd034ba21fcca68050ff7c8397bb7dd25dd8b8248 \
+    --hash=sha256:3eabcbd2525f295da322dff8175258f3fc4c3eb53f6d1929644ef4d99b92e72d \
+    --hash=sha256:481f98c6b24383188c928f33dd2f0776690807e12e9989dd0419edd5c74aa53b \
+    --hash=sha256:7a76dc4f91e92db119b1be293892df8379b08fd31795bb44e0ff84256d34c251 \
+    --hash=sha256:7d390248ec07fa344b9f365e6ed9d205bd0205e485c555bed37c4235c868e9d5 \
+    --hash=sha256:826a2917c275e2ee05b7c7b736c1e6549a35b7ea5a198ca457f8c2ebea2cbecf \
+    --hash=sha256:85cf2b14d32b61db24ade8ac9ae7691bdfc572a403e3cb8537da936e74713275 \
+    --hash=sha256:8d645e9e7f7a5da3ec3bbcc314ebb9bb22c7ce39e70367830eb3c08d0140b9ce \
+    --hash=sha256:925aa84369a07846b7f3b8556ccade1f371aa554f2bd4fb31cb97a24b73b036e \
+    --hash=sha256:a85a20b43fa69efc0b955eba1db435e2ffecb1ca695fe359768e0503b91ea89f \
+    --hash=sha256:bfd4f6536bd384c27c392a8b8f790fd0ed5c0cf2f63fc2fed7bce56751d53026 \
+    --hash=sha256:cb7752b24528c118a7403ee955b6a578bfcf5879d5ee91790667c8ea511d2085 \
+    --hash=sha256:cc537885891382e08129d9862553b3d00d4be3eb15b8cae9e2466452f52b0117 \
+    --hash=sha256:d4fccf04c1acf750babd74252e0f2db6bd2ac3aa8fe960797d9f3ef41cf2bfd4 \
+    --hash=sha256:f1ba54d440d4feee49d8768ea952137316d454b15301c44403db3f2cb51af024 \
+    --hash=sha256:f47322796c412271f5aea48381a528a613f33e0a115452d03ae35d673e6064f8 \
+    --hash=sha256:fbfb873cf2b8d8c3c513367febde932e061a5f73f762896826ba06391d932b2a \
+    --hash=sha256:ffdad80a92c100d1b0fe3d3cf1a4724136029a29afe8566404c0146747114382
     # via grizzly-loadtester (pyproject.toml)
 mypy-extensions==0.4.3 \
     --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \
@@ -897,67 +897,57 @@ portalocker==2.4.0 \
     --hash=sha256:a648ad761b8ea27370cb5915350122cd807b820d2193ed5c9cc28f163df637f4 \
     --hash=sha256:b092f48e1e30a234ab3dd1cfd44f2f235e8a41f4e310e463fc8d6798d1c3c235
     # via msal-extensions
-protobuf==3.20.1 \
-    --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \
-    --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \
-    --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \
-    --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \
-    --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \
-    --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \
-    --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \
-    --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \
-    --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \
-    --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \
-    --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \
-    --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \
-    --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \
-    --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \
-    --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \
-    --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \
-    --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \
-    --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \
-    --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \
-    --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \
-    --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \
-    --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \
-    --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \
-    --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3
+protobuf==4.21.0 \
+    --hash=sha256:14c5fa41122e270d815b954ecdc25cb107d44b7d039def5cc57a5e5a9ab8d741 \
+    --hash=sha256:157e4ad67bf75d5719516fbf13fd652c634fd71338e01d2ac872bf365213b7a6 \
+    --hash=sha256:182b626615043e191e994672b7bbf1036bad5edc9f8f300a2f3a1fe77409a444 \
+    --hash=sha256:2188063b59e1606cc45a1ad68beae7b94bec36e6d27d5e857dd611b79cdda99f \
+    --hash=sha256:2c753c5aa0943479a3f84b90e8c5bb28fef8cc3eb79c2c35e1bbf00d56cc435f \
+    --hash=sha256:4e78116673ba04e01e563f6a9cca2c72db0be8a3e1629094816357e81cc39d36 \
+    --hash=sha256:6efbe40afb1b0303def53b3c5ce211b14e10d73d63a3f8b669ac0e3b74e8f863 \
+    --hash=sha256:9a65e012bc06022e98a57165ea48438b3b9f652eee33db7cbecb883588f9f169 \
+    --hash=sha256:b33660b14d582a700a47c8808a3f2da33f5bb3be576a8ae419d608db6b4f19b0 \
+    --hash=sha256:bc78d6c23873ebf33076f0851ef64d050e7246d5b1e651b38a7e92c05f14881d \
+    --hash=sha256:c8fc31d44e239178da6a698e0b69798387469b89172de3470a49d799550523a7 \
+    --hash=sha256:c92a9e2a94b9df945a6c578c3f53ace862ed3a50e849f41c27106007cc63ca8c \
+    --hash=sha256:da3bb1acd646f01b4bdec128462441838e596899c5a5e1d2e8e31975f36cd0c4 \
+    --hash=sha256:f12e26fda74c40f308d37525e5276883388f25ff9a0c880f40f79d3ce9097d81
     # via
     #   google-api-core
     #   googleapis-common-protos
-psutil==5.9.0 \
-    --hash=sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5 \
-    --hash=sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a \
-    --hash=sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4 \
-    --hash=sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841 \
-    --hash=sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d \
-    --hash=sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d \
-    --hash=sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0 \
-    --hash=sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845 \
-    --hash=sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf \
-    --hash=sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b \
-    --hash=sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07 \
-    --hash=sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618 \
-    --hash=sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2 \
-    --hash=sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd \
-    --hash=sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666 \
-    --hash=sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce \
-    --hash=sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3 \
-    --hash=sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d \
-    --hash=sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25 \
-    --hash=sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492 \
-    --hash=sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b \
-    --hash=sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d \
-    --hash=sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2 \
-    --hash=sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203 \
-    --hash=sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2 \
-    --hash=sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94 \
-    --hash=sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9 \
-    --hash=sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64 \
-    --hash=sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56 \
-    --hash=sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3 \
-    --hash=sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c \
-    --hash=sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3
+psutil==5.9.1 \
+    --hash=sha256:068935df39055bf27a29824b95c801c7a5130f118b806eee663cad28dca97685 \
+    --hash=sha256:0904727e0b0a038830b019551cf3204dd48ef5c6868adc776e06e93d615fc5fc \
+    --hash=sha256:0f15a19a05f39a09327345bc279c1ba4a8cfb0172cc0d3c7f7d16c813b2e7d36 \
+    --hash=sha256:19f36c16012ba9cfc742604df189f2f28d2720e23ff7d1e81602dbe066be9fd1 \
+    --hash=sha256:20b27771b077dcaa0de1de3ad52d22538fe101f9946d6dc7869e6f694f079329 \
+    --hash=sha256:28976df6c64ddd6320d281128817f32c29b539a52bdae5e192537bc338a9ec81 \
+    --hash=sha256:29a442e25fab1f4d05e2655bb1b8ab6887981838d22effa2396d584b740194de \
+    --hash=sha256:3054e923204b8e9c23a55b23b6df73a8089ae1d075cb0bf711d3e9da1724ded4 \
+    --hash=sha256:32c52611756096ae91f5d1499fe6c53b86f4a9ada147ee42db4991ba1520e574 \
+    --hash=sha256:3a76ad658641172d9c6e593de6fe248ddde825b5866464c3b2ee26c35da9d237 \
+    --hash=sha256:44d1826150d49ffd62035785a9e2c56afcea66e55b43b8b630d7706276e87f22 \
+    --hash=sha256:4b6750a73a9c4a4e689490ccb862d53c7b976a2a35c4e1846d049dcc3f17d83b \
+    --hash=sha256:56960b9e8edcca1456f8c86a196f0c3d8e3e361320071c93378d41445ffd28b0 \
+    --hash=sha256:57f1819b5d9e95cdfb0c881a8a5b7d542ed0b7c522d575706a80bedc848c8954 \
+    --hash=sha256:58678bbadae12e0db55186dc58f2888839228ac9f41cc7848853539b70490021 \
+    --hash=sha256:645bd4f7bb5b8633803e0b6746ff1628724668681a434482546887d22c7a9537 \
+    --hash=sha256:799759d809c31aab5fe4579e50addf84565e71c1dc9f1c31258f159ff70d3f87 \
+    --hash=sha256:79c9108d9aa7fa6fba6e668b61b82facc067a6b81517cab34d07a84aa89f3df0 \
+    --hash=sha256:91c7ff2a40c373d0cc9121d54bc5f31c4fa09c346528e6a08d1845bce5771ffc \
+    --hash=sha256:9272167b5f5fbfe16945be3db475b3ce8d792386907e673a209da686176552af \
+    --hash=sha256:944c4b4b82dc4a1b805329c980f270f170fdc9945464223f2ec8e57563139cf4 \
+    --hash=sha256:a6a11e48cb93a5fa606306493f439b4aa7c56cb03fc9ace7f6bfa21aaf07c453 \
+    --hash=sha256:a8746bfe4e8f659528c5c7e9af5090c5a7d252f32b2e859c584ef7d8efb1e689 \
+    --hash=sha256:abd9246e4cdd5b554a2ddd97c157e292ac11ef3e7af25ac56b08b455c829dca8 \
+    --hash=sha256:b14ee12da9338f5e5b3a3ef7ca58b3cba30f5b66f7662159762932e6d0b8f680 \
+    --hash=sha256:b88f75005586131276634027f4219d06e0561292be8bd6bc7f2f00bdabd63c4e \
+    --hash=sha256:c7be9d7f5b0d206f0bbc3794b8e16fb7dbc53ec9e40bbe8787c6f2d38efcf6c9 \
+    --hash=sha256:d2d006286fbcb60f0b391741f520862e9b69f4019b4d738a2a45728c7e952f1b \
+    --hash=sha256:db417f0865f90bdc07fa30e1aadc69b6f4cad7f86324b02aa842034efe8d8c4d \
+    --hash=sha256:e7e10454cb1ab62cc6ce776e1c135a64045a11ec4c6d254d3f7689c16eb3efd2 \
+    --hash=sha256:f65f9a46d984b8cd9b3750c2bdb419b2996895b005aefa6cbaba9a143b1ce2c5 \
+    --hash=sha256:fea896b54f3a4ae6f790ac1d017101252c93f6fe075d0e7571543510f11d2676
     # via
     #   locust
     #   opencensus-ext-azure
@@ -1305,9 +1295,9 @@ types-pyyaml==5.4.12 \
     --hash=sha256:3f4daa754357491625ae8c3a39c9e1b0d7cd5632bc4e1c35e7a7f75a64aa124b \
     --hash=sha256:e06083f85375a5678e4c19452ed6467ce2167b71db222313e1792cb8fc76859a
     # via grizzly-loadtester (pyproject.toml)
-types-requests==2.27.27 \
-    --hash=sha256:6d8463ffe1f6edcf2e5361740a6140e7a16d427c267d83c7c1d3d1298f4e67c5 \
-    --hash=sha256:d618d9809fa32f514cf17cea8460814da671c56366fb1c908accca8bf183112b
+types-requests==2.27.28 \
+    --hash=sha256:46c72c9ddc73010b14cd19f67023df4a01519411ecf632a305b02e32ca8eb3b8 \
+    --hash=sha256:c2647aca57977bc7a4e9c9d9e14a6c76e6503bc64dcbc9f03836df26e54a80c8
     # via grizzly-loadtester (pyproject.toml)
 types-urllib3==1.26.14 \
     --hash=sha256:2a2578e4b36341ccd240b00fccda9826988ff0589a44ba4a664bbd69ef348d27 \
@@ -1322,7 +1312,6 @@ typing-extensions==3.10.0.2 \
     #   azure-servicebus
     #   databind-core
     #   databind-json
-    #   grizzly-loadtester (pyproject.toml)
     #   locust
     #   mypy
     #   nr-util
diff --git a/requirements-script.txt b/requirements-script.txt
index c5b2e857..44162c5d 100644
--- a/requirements-script.txt
+++ b/requirements-script.txt
@@ -4,9 +4,9 @@
 #
 #    script/pip-compile.py
 #
-certifi==2022.5.18 \
-    --hash=sha256:6ae10321df3e464305a46e997da41ea56c1d311fb9ff1dd4e04d6f14653ec63a \
-    --hash=sha256:8d15a5a7fde18536a249c49e07e8e462b8fc13de21b3c80e8a68315dfa227c99
+certifi==2022.5.18.1 \
+    --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \
+    --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a
     # via requests
 chardet==4.0.0 \
     --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \
diff --git a/requirements.txt b/requirements.txt
index fb4771a3..334db2c8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,10 +4,10 @@
 #
 #    script/pip-compile.py
 #
-aenum==3.1.8 \
-    --hash=sha256:07ea89f43d78b3d5997b32b8d5b0ec3e5be17b3e05b7bac0154b8c484a4aeff5 \
-    --hash=sha256:859fe994719e6b5e39f15f73acd84e08b4e57dc642373b177a5fa6646798706a \
-    --hash=sha256:8dbe15f446eb8264b788dfeca163fb0a043d408d212152397dc11377b851e4ae
+aenum==3.1.11 \
+    --hash=sha256:12ae89967f2e25c0ce28c293955d643f891603488bc3d9946158ba2b35203638 \
+    --hash=sha256:525b4870a27d0b471c265bda692bc657f1e0dd7597ad4186d072c59f9db666f6 \
+    --hash=sha256:aed2c273547ae72a0d5ee869719c02a643da16bf507c80958faadc7e038e3f73
     # via grizzly-loadtester (pyproject.toml)
 azure-common==1.1.28 \
     --hash=sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3 \
@@ -137,9 +137,9 @@ cachetools==5.1.0 \
     --hash=sha256:4ebbd38701cdfd3603d1f751d851ed248ab4570929f2d8a7ce69e30c420b141c \
     --hash=sha256:8b3b8fa53f564762e5b221e9896798951e7f915513abf2ba072ce0f07f3f5a98
     # via google-auth
-certifi==2022.5.18 \
-    --hash=sha256:6ae10321df3e464305a46e997da41ea56c1d311fb9ff1dd4e04d6f14653ec63a \
-    --hash=sha256:8d15a5a7fde18536a249c49e07e8e462b8fc13de21b3c80e8a68315dfa227c99
+certifi==2022.5.18.1 \
+    --hash=sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7 \
+    --hash=sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a
     # via
     #   geventhttpclient
     #   msrest
@@ -212,31 +212,32 @@ configargparse==1.5.3 \
     --hash=sha256:18f6535a2db9f6e02bd5626cc7455eac3e96b9ab3d969d366f9aafd5c5c00fe7 \
     --hash=sha256:1b0b3cbf664ab59dada57123c81eff3d9737e0d11d8cf79e3d6eb10823f1739f
     # via locust
-cryptography==36.0.2 \
-    --hash=sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b \
-    --hash=sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51 \
-    --hash=sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7 \
-    --hash=sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d \
-    --hash=sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6 \
-    --hash=sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29 \
-    --hash=sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9 \
-    --hash=sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf \
-    --hash=sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815 \
-    --hash=sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf \
-    --hash=sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85 \
-    --hash=sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77 \
-    --hash=sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86 \
-    --hash=sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb \
-    --hash=sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e \
-    --hash=sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0 \
-    --hash=sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3 \
-    --hash=sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84 \
-    --hash=sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2 \
-    --hash=sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6
+cryptography==37.0.2 \
+    --hash=sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804 \
+    --hash=sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178 \
+    --hash=sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717 \
+    --hash=sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982 \
+    --hash=sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004 \
+    --hash=sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe \
+    --hash=sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452 \
+    --hash=sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336 \
+    --hash=sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4 \
+    --hash=sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15 \
+    --hash=sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d \
+    --hash=sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c \
+    --hash=sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0 \
+    --hash=sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06 \
+    --hash=sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9 \
+    --hash=sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1 \
+    --hash=sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023 \
+    --hash=sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de \
+    --hash=sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f \
+    --hash=sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181 \
+    --hash=sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e \
+    --hash=sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a
     # via
     #   azure-identity
     #   azure-storage-blob
-    #   grizzly-loadtester (pyproject.toml)
     #   msal
     #   paramiko
     #   pyjwt
@@ -412,9 +413,9 @@ idna==3.3 \
     --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \
     --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d
     # via requests
-importlib-metadata==4.11.3 \
-    --hash=sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6 \
-    --hash=sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539
+importlib-metadata==4.11.4 \
+    --hash=sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700 \
+    --hash=sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec
     # via flask
 influxdb==5.3.1 \
     --hash=sha256:46f85e7b04ee4b3dee894672be6a295c94709003a7ddea8820deec2ac4d8b27a \
@@ -430,21 +431,20 @@ itsdangerous==2.1.2 \
     --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \
     --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a
     # via flask
-jinja2==3.0.3 \
-    --hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \
-    --hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7
+jinja2==3.1.2 \
+    --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \
+    --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61
     # via
     #   flask
     #   grizzly-loadtester (pyproject.toml)
-    #   locust
 jsonpath-ng==1.5.3 \
     --hash=sha256:292a93569d74029ba75ac2dc3d3630fc0e17b2df26119a165fa1d498ca47bf65 \
     --hash=sha256:a273b182a82c1256daab86a313b937059261b5c5f8c4fa3fc38b882b344dd567 \
     --hash=sha256:f75b95dbecb8a0f3b86fd2ead21c2b022c3f5770957492b9b6196ecccfeb10aa
     # via grizzly-loadtester (pyproject.toml)
-locust==2.8.6 \
-    --hash=sha256:011b16b5cf8b8cafe51c74cf86234afc6660ec7bdefbc6a89d6648548e1cc1be \
-    --hash=sha256:30dd8be2b9518ec06f4f18e061b2b625851faccadc70ffbc146b38f9b377b3d3
+locust==2.9.0 \
+    --hash=sha256:62b69109337c3e6542e35c40ad08ba57d3690b0d1468121ba613b3cc01a6340a \
+    --hash=sha256:c2355852b9bccef4d1cc4e587e3448a8b81c9622626248a5809a77c672f59757
     # via grizzly-loadtester (pyproject.toml)
 lxml==4.8.0 \
     --hash=sha256:078306d19a33920004addeb5f4630781aaeabb6a8d01398045fcde085091a169 \
@@ -646,67 +646,57 @@ portalocker==2.4.0 \
     --hash=sha256:a648ad761b8ea27370cb5915350122cd807b820d2193ed5c9cc28f163df637f4 \
     --hash=sha256:b092f48e1e30a234ab3dd1cfd44f2f235e8a41f4e310e463fc8d6798d1c3c235
     # via msal-extensions
-protobuf==3.20.1 \
-    --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \
-    --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \
-    --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \
-    --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \
-    --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \
-    --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \
-    --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \
-    --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \
-    --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \
-    --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \
-    --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \
-    --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \
-    --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \
-    --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \
-    --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \
-    --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \
-    --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \
-    --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \
-    --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \
-    --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \
-    --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \
-    --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \
-    --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \
-    --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3
+protobuf==4.21.0 \
+    --hash=sha256:14c5fa41122e270d815b954ecdc25cb107d44b7d039def5cc57a5e5a9ab8d741 \
+    --hash=sha256:157e4ad67bf75d5719516fbf13fd652c634fd71338e01d2ac872bf365213b7a6 \
+    --hash=sha256:182b626615043e191e994672b7bbf1036bad5edc9f8f300a2f3a1fe77409a444 \
+    --hash=sha256:2188063b59e1606cc45a1ad68beae7b94bec36e6d27d5e857dd611b79cdda99f \
+    --hash=sha256:2c753c5aa0943479a3f84b90e8c5bb28fef8cc3eb79c2c35e1bbf00d56cc435f \
+    --hash=sha256:4e78116673ba04e01e563f6a9cca2c72db0be8a3e1629094816357e81cc39d36 \
+    --hash=sha256:6efbe40afb1b0303def53b3c5ce211b14e10d73d63a3f8b669ac0e3b74e8f863 \
+    --hash=sha256:9a65e012bc06022e98a57165ea48438b3b9f652eee33db7cbecb883588f9f169 \
+    --hash=sha256:b33660b14d582a700a47c8808a3f2da33f5bb3be576a8ae419d608db6b4f19b0 \
+    --hash=sha256:bc78d6c23873ebf33076f0851ef64d050e7246d5b1e651b38a7e92c05f14881d \
+    --hash=sha256:c8fc31d44e239178da6a698e0b69798387469b89172de3470a49d799550523a7 \
+    --hash=sha256:c92a9e2a94b9df945a6c578c3f53ace862ed3a50e849f41c27106007cc63ca8c \
+    --hash=sha256:da3bb1acd646f01b4bdec128462441838e596899c5a5e1d2e8e31975f36cd0c4 \
+    --hash=sha256:f12e26fda74c40f308d37525e5276883388f25ff9a0c880f40f79d3ce9097d81
     # via
     #   google-api-core
     #   googleapis-common-protos
-psutil==5.9.0 \
-    --hash=sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5 \
-    --hash=sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a \
-    --hash=sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4 \
-    --hash=sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841 \
-    --hash=sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d \
-    --hash=sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d \
-    --hash=sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0 \
-    --hash=sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845 \
-    --hash=sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf \
-    --hash=sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b \
-    --hash=sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07 \
-    --hash=sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618 \
-    --hash=sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2 \
-    --hash=sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd \
-    --hash=sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666 \
-    --hash=sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce \
-    --hash=sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3 \
-    --hash=sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d \
-    --hash=sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25 \
-    --hash=sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492 \
-    --hash=sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b \
-    --hash=sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d \
-    --hash=sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2 \
-    --hash=sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203 \
-    --hash=sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2 \
-    --hash=sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94 \
-    --hash=sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9 \
-    --hash=sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64 \
-    --hash=sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56 \
-    --hash=sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3 \
-    --hash=sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c \
-    --hash=sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3
+psutil==5.9.1 \
+    --hash=sha256:068935df39055bf27a29824b95c801c7a5130f118b806eee663cad28dca97685 \
+    --hash=sha256:0904727e0b0a038830b019551cf3204dd48ef5c6868adc776e06e93d615fc5fc \
+    --hash=sha256:0f15a19a05f39a09327345bc279c1ba4a8cfb0172cc0d3c7f7d16c813b2e7d36 \
+    --hash=sha256:19f36c16012ba9cfc742604df189f2f28d2720e23ff7d1e81602dbe066be9fd1 \
+    --hash=sha256:20b27771b077dcaa0de1de3ad52d22538fe101f9946d6dc7869e6f694f079329 \
+    --hash=sha256:28976df6c64ddd6320d281128817f32c29b539a52bdae5e192537bc338a9ec81 \
+    --hash=sha256:29a442e25fab1f4d05e2655bb1b8ab6887981838d22effa2396d584b740194de \
+    --hash=sha256:3054e923204b8e9c23a55b23b6df73a8089ae1d075cb0bf711d3e9da1724ded4 \
+    --hash=sha256:32c52611756096ae91f5d1499fe6c53b86f4a9ada147ee42db4991ba1520e574 \
+    --hash=sha256:3a76ad658641172d9c6e593de6fe248ddde825b5866464c3b2ee26c35da9d237 \
+    --hash=sha256:44d1826150d49ffd62035785a9e2c56afcea66e55b43b8b630d7706276e87f22 \
+    --hash=sha256:4b6750a73a9c4a4e689490ccb862d53c7b976a2a35c4e1846d049dcc3f17d83b \
+    --hash=sha256:56960b9e8edcca1456f8c86a196f0c3d8e3e361320071c93378d41445ffd28b0 \
+    --hash=sha256:57f1819b5d9e95cdfb0c881a8a5b7d542ed0b7c522d575706a80bedc848c8954 \
+    --hash=sha256:58678bbadae12e0db55186dc58f2888839228ac9f41cc7848853539b70490021 \
+    --hash=sha256:645bd4f7bb5b8633803e0b6746ff1628724668681a434482546887d22c7a9537 \
+    --hash=sha256:799759d809c31aab5fe4579e50addf84565e71c1dc9f1c31258f159ff70d3f87 \
+    --hash=sha256:79c9108d9aa7fa6fba6e668b61b82facc067a6b81517cab34d07a84aa89f3df0 \
+    --hash=sha256:91c7ff2a40c373d0cc9121d54bc5f31c4fa09c346528e6a08d1845bce5771ffc \
+    --hash=sha256:9272167b5f5fbfe16945be3db475b3ce8d792386907e673a209da686176552af \
+    --hash=sha256:944c4b4b82dc4a1b805329c980f270f170fdc9945464223f2ec8e57563139cf4 \
+    --hash=sha256:a6a11e48cb93a5fa606306493f439b4aa7c56cb03fc9ace7f6bfa21aaf07c453 \
+    --hash=sha256:a8746bfe4e8f659528c5c7e9af5090c5a7d252f32b2e859c584ef7d8efb1e689 \
+    --hash=sha256:abd9246e4cdd5b554a2ddd97c157e292ac11ef3e7af25ac56b08b455c829dca8 \
+    --hash=sha256:b14ee12da9338f5e5b3a3ef7ca58b3cba30f5b66f7662159762932e6d0b8f680 \
+    --hash=sha256:b88f75005586131276634027f4219d06e0561292be8bd6bc7f2f00bdabd63c4e \
+    --hash=sha256:c7be9d7f5b0d206f0bbc3794b8e16fb7dbc53ec9e40bbe8787c6f2d38efcf6c9 \
+    --hash=sha256:d2d006286fbcb60f0b391741f520862e9b69f4019b4d738a2a45728c7e952f1b \
+    --hash=sha256:db417f0865f90bdc07fa30e1aadc69b6f4cad7f86324b02aa842034efe8d8c4d \
+    --hash=sha256:e7e10454cb1ab62cc6ce776e1c135a64045a11ec4c6d254d3f7689c16eb3efd2 \
+    --hash=sha256:f65f9a46d984b8cd9b3750c2bdb419b2996895b005aefa6cbaba9a143b1ce2c5 \
+    --hash=sha256:fea896b54f3a4ae6f790ac1d017101252c93f6fe075d0e7571543510f11d2676
     # via
     #   locust
     #   opencensus-ext-azure
@@ -946,13 +936,11 @@ six==1.16.0 \
     #   parse-type
     #   python-dateutil
     #   uamqp
-typing-extensions==3.10.0.2 \
-    --hash=sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e \
-    --hash=sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7 \
-    --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34
+typing-extensions==4.2.0 \
+    --hash=sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708 \
+    --hash=sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376
     # via
     #   azure-servicebus
-    #   grizzly-loadtester (pyproject.toml)
     #   locust
 tzdata==2022.1 \
     --hash=sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9 \
diff --git a/setup.cfg b/setup.cfg
index 55330fa9..c2dcd3fd 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -34,7 +34,7 @@ keywords =
 python_requires = >=3.8
 packages = find:
 install_requires =
-    aenum ==3.1.8
+    aenum >3.1.8
     azure-core <1.23.0,<2.0.0
     azure-servicebus >=7.6.0,<8.0.0
     azure-storage-blob >=12.9.0,<12.12.0
@@ -42,7 +42,7 @@ install_requires =
     influxdb >=5.3.1,<6.0.0
     Jinja2 >=3.0.3,<4.0.0
     jsonpath-ng >=1.5.3,<2.0.0
-    locust ==2.8.6
+    locust ==2.9.0
     lxml >=4.8.0,<5.0.0
     mypy-extensions >=0.4.3
     opencensus-ext-azure >=1.1.1
@@ -50,11 +50,9 @@ install_requires =
     python-dateutil >=2.8.2,<3.0.0
     backports.zoneinfo >=0.2.1;python_version<'3.9'
     pyzmq >=22.3.0,<23.0.0
-    typing-extensions >=3.10.0,<4.0.0
     PyYAML >=5.3.0,<6.0.0
     setproctitle >=1.2.2
     tzdata >=2022.1
-    cryptography==36.0.2
 
 [options.entry_points]
 console_scripts =


Test patch:
diff --git a/tests/fixtures.py b/tests/fixtures.py
index 2b698c58..e3971af3 100644
--- a/tests/fixtures.py
+++ b/tests/fixtures.py
@@ -17,10 +17,11 @@
 import gevent
 
 from locust.clients import ResponseContextManager
-from locust.contrib.fasthttp import FastResponse
+from locust.contrib.fasthttp import FastResponse, FastRequest
 from locust.env import Environment
 from locust.runners import Runner
 from geventhttpclient.header import Headers
+from geventhttpclient.response import HTTPSocketPoolResponse
 from _pytest.tmpdir import TempPathFactory
 from pytest_mock.plugin import MockerFixture
 from paramiko.transport import Transport
@@ -435,7 +436,7 @@ def __call__(
         else:
             event = None
 
-        if cls_rcm == ResponseContextManager:
+        if cls_rcm is ResponseContextManager:
             response = Response()
             if response_headers is not None:
                 response.headers = CaseInsensitiveDict(**response_headers)
@@ -459,14 +460,13 @@ def __call__(
             _build_request = self._build_request
             request_url = url
 
-            class FakeGhcResponse:
-                _headers_index: Headers
+            class FakeGhcResponse(HTTPSocketPoolResponse):
+                _headers_index: Optional[Headers]
                 _sent_request: str
+                _sock: Any
 
                 def __init__(self) -> None:
-                    self._headers_index = Headers()
-                    for key, value in (response_headers or {}).items():
-                        self._headers_index.add(key, value)
+                    self._headers_index = None
 
                     self._sent_request = _build_request(
                         request_method or '',
@@ -474,11 +474,20 @@ def __init__(self) -> None:
                         body=jsondumps(request_body or ''),
                         headers=request_headers,
                     )
+                    self._sock = None
 
                 def get_code(self) -> int:
                     return status_code
 
-            response = FastResponse(FakeGhcResponse())
+            request = FastRequest(url, method=request_method, headers=Headers(), payload=request_body)
+            for key, value in (request_headers or {}).items():
+                request.headers.add(key, value)
+
+            response = FastResponse(FakeGhcResponse(), request)
+            response.headers = Headers()
+            for key, value in (response_headers or {}).items():
+                response.headers.add(key, value)
+
             if response_body is not None:
                 response._cached_content = jsondumps(response_body).encode('utf-8')
             else:
diff --git a/tests/test_grizzly/test_locust.py b/tests/test_grizzly/test_locust.py
index 3922d411..9eac9607 100644
--- a/tests/test_grizzly/test_locust.py
+++ b/tests/test_grizzly/test_locust.py
@@ -919,12 +919,14 @@ def test_grizzly_print_stats(caplog: LogCaptureFixture, mocker: MockerFixture) -
     locust_stats = caplog.messages
     caplog.clear()
 
+    import re
+
     for ident in range(1, scenario_count):
         index = (ident - 1) * ((len(request_types_sequence) * request_types_sequence_count) + 4) + 2
-        assert grizzly_stats[index].strip().startswith(f'SCEN {ident:03}')
-        assert grizzly_stats[index + 1].strip().startswith(f'TSTD {ident:03}')
-        assert grizzly_stats[index + 2].strip().startswith(f'GET {ident:03} 01-get-test')
-        assert grizzly_stats[index + (len(request_types_sequence) * request_types_sequence_count) + 3].strip().startswith(f'VAR {ident:03} var-test')
+        assert re.match(fr'^SCEN\s+{ident:03}', grizzly_stats[index].strip())
+        assert re.match(fr'^TSTD\s+{ident:03}', grizzly_stats[index + 1].strip())
+        assert re.match(fr'^GET\s+{ident:03} 01-get-test', grizzly_stats[index + 2].strip())
+        assert re.match(fr'^VAR\s+{ident:03} var-test', grizzly_stats[index + (len(request_types_sequence) * request_types_sequence_count) + 3].strip())
 
     for stat in grizzly_stats:
         assert stat in locust_stats
diff --git a/tests/test_grizzly/users/base/test_request_logger.py b/tests/test_grizzly/users/base/test_request_logger.py
index 99dea053..fa2d8db3 100644
--- a/tests/test_grizzly/users/base/test_request_logger.py
+++ b/tests/test_grizzly/users/base/test_request_logger.py
@@ -257,7 +257,7 @@ def test_request_logger_http(
 {
   "Content-Type": "application/json",
   "Content-Length": "1337"
-}''' in log_file_contents
+}'''.lower() in log_file_contents.lower()
             assert '''metadata:
 {
   "x-cookie": "asdfasdfasdf"
diff --git a/tests/test_grizzly/users/test_restapi.py b/tests/test_grizzly/users/test_restapi.py
index 4a3a6b9d..7ddfba7f 100644
--- a/tests/test_grizzly/users/test_restapi.py
+++ b/tests/test_grizzly/users/test_restapi.py
@@ -694,6 +694,7 @@ def test_async_request(self, restapi_user: RestApiScenarioFixture, mocker: Mocke
 
         assert request_spy.call_count == 1
         args, _ = request_spy.call_args_list[-1]
+        assert len(args) == 2
         assert isinstance(args[0], FastHttpSession)
         assert args[0].environment is user.environment
         assert args[0].base_url == user.host
@@ -703,7 +704,6 @@ def test_async_request(self, restapi_user: RestApiScenarioFixture, mocker: Mocke
         assert args[0].client.clientpool.client_args.get('network_timeout', None) == 60.0
         assert args[0].client.clientpool.client_args.get('ssl_context_factory', None) is gevent.ssl.create_default_context  # pylint: disable=no-member
         assert args[1] is request
-        assert args[2] == {}
 
         user._context['verify_certificates'] = False
 
@@ -725,19 +725,12 @@ def test_request(self, restapi_user: RestApiScenarioFixture, mocker: MockerFixtu
 
         assert request_spy.call_count == 1
         args, _ = request_spy.call_args_list[-1]
+        assert len(args) == 2
         assert args[0] is user.client
         assert args[1] is request
-        assert (args[2].get('verify', None) or False)
-
-        user._context['verify_certificates'] = False
 
         user.request(request)
 
-        assert request_spy.call_count == 2
-        args, _ = request_spy.call_args_list[-1]
-        print(args)
-        assert not args[2].get('verify', True)
-
     @pytest.mark.parametrize('request_func', [RestApiUser.request, RestApiUser.async_request])
     def test__request(
         self,
@@ -748,21 +741,22 @@ def test__request(
     ) -> None:
         user, scenario = restapi_user
 
-        def mock_client_post(status_code: int) -> None:
-            def client_post(_: ResponseEventSession, *args: Tuple[Any, ...], **kwargs: Dict[str, Any]) -> GrizzlyResponseContextManager:
+        class ClientRequestMock:
+            def __init__(self, status_code: int, user: GrizzlyUser, request_func: Callable[[RestApiUser, RequestTask], GrizzlyResponse]) -> None:
+                self.status_code = status_code
+                self.user = user
+                self.spy = mocker.spy(self, 'request')
+
+                if request_func is RestApiUser.request:
+                    namespace = 'grizzly.clients.ResponseEventSession.request'
+                else:
+                    namespace = 'grizzly.users.restapi.FastHttpSession.request'
+
+                mocker.patch(namespace, self.request)
+
+            def request(self, *args: Tuple[Any, ...], **kwargs: Dict[str, Any]) -> GrizzlyResponseContextManager:
                 cls_rcm = cast(Type[GrizzlyResponseContextManager], ResponseContextManager if request_func is RestApiUser.request else FastResponseContextManager)
-                return response_context_manager_fixture(cls_rcm, status_code, user.environment, response_body={}, **kwargs)  # type: ignore
-
-            if request_func is RestApiUser.request:
-                mocker.patch(
-                    'grizzly.clients.ResponseEventSession.request',
-                    client_post,
-                )
-            else:
-                mocker.patch(
-                    'grizzly.users.restapi.FastHttpSession.request',
-                    client_post,
-                )
+                return response_context_manager_fixture(cls_rcm, self.status_code, self.user.environment, response_body={}, **kwargs)  # type: ignore
 
         request = cast(RequestTask, scenario.tasks[-1])
 
@@ -780,7 +774,7 @@ def client_post(_: ResponseEventSession, *args: Tuple[Any, ...], **kwargs: Dict[
 
         user.add_context(remote_variables)
 
-        mock_client_post(status_code=400)
+        request_mock = ClientRequestMock(status_code=400, user=user, request_func=request_func)
 
         scenario.failure_exception = StopUser
 
@@ -788,49 +782,85 @@ def client_post(_: ResponseEventSession, *args: Tuple[Any, ...], **kwargs: Dict[
         with pytest.raises(StopUser):
             request_func(user, request)
 
+        assert request_mock.spy.call_count == 1
+
         scenario.failure_exception = RestartScenario
 
         # status_code != 200, stop_on_failure = True
         with pytest.raises(RestartScenario):
             request_func(user, request)
 
+        assert request_mock.spy.call_count == 2
+
         request.response.add_status_code(400)
 
         with pytest.raises(ResultSuccess):
             request_func(user, request)
 
+        assert request_mock.spy.call_count == 3
+
         request.response.add_status_code(-400)
         scenario.failure_exception = None
 
         # status_code != 200, stop_on_failure = False
         metadata, payload = request_func(user, request)
 
+        assert request_mock.spy.call_count == 4
+        _, kwargs = request_mock.spy.call_args_list[-1]
+        assert kwargs.get('method', None) == request.method.name
+        assert kwargs.get('name', '').startswith(request.scenario.identifier)
+        assert kwargs.get('catch_response', False)
+        assert kwargs.get('url', None) == f'{user.host}{request.endpoint}'
+
+        if request_func is RestApiUser.request:
+            assert kwargs.get('request', None) is request
+            assert kwargs.get('verify', False)
+
         assert metadata is None
         assert payload == '{}'
 
-        mock_client_post(status_code=200)
+        request_mock = ClientRequestMock(status_code=200, user=user, request_func=request_func)
+
+        user._context['verify_certificates'] = False
 
         request.response.add_status_code(-200)
         request_func(user, request)
 
+        assert request_mock.spy.call_count == 1
+        _, kwargs = request_mock.spy.call_args_list[-1]
+        assert kwargs.get('method', None) == request.method.name
+        assert kwargs.get('name', '').startswith(request.scenario.identifier)
+        assert kwargs.get('catch_response', False)
+        assert kwargs.get('url', None) == f'{user.host}{request.endpoint}'
+
+        if request_func is RestApiUser.request:
+            assert kwargs.get('request', None) is request
+            assert not kwargs.get('verify', True)
+
         request.response.add_status_code(200)
 
         # status_code == 200
         with pytest.raises(ResultSuccess):
             request_func(user, request)
 
+        assert request_mock.spy.call_count == 2
+
         # incorrect formated [json] payload
         request.source = '{"hello: "world"}'
 
         with pytest.raises(StopUser):
             request_func(user, request)
 
+        assert request_mock.spy.call_count == 2
+
         # unsupported request method
         request.method = RequestMethod.RECEIVE
 
         with pytest.raises(NotImplementedError):
             request_func(user, request)
 
+        assert request_mock.spy.call_count == 2
+
     def test_add_context(self, restapi_user: RestApiScenarioFixture) -> None:
         user, _ = restapi_user