Skip to content

Commit 3f7e0c1

Browse files
Merge pull request #4 from MarketDataApp/RESOURCE_LOGGING
IMPROVE: Resource logs lifecycle on client
2 parents 21a684d + 332af16 commit 3f7e0c1

18 files changed

Lines changed: 97 additions & 22 deletions

File tree

src/marketdata/api_status.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import datetime
2+
import logging
23
from enum import Enum
34
from typing import TYPE_CHECKING
45

@@ -76,6 +77,7 @@ def refresh(self, client: "MarketDataClient") -> bool:
7677
check_rate_limits=False,
7778
include_api_version=False,
7879
populate_rate_limits=False,
80+
response_log_level=logging.DEBUG,
7981
)
8082
data = response.json()
8183
self.update(data)

src/marketdata/client.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from importlib.metadata import version
2-
from logging import Logger
2+
from logging import DEBUG, INFO, Logger
33
from typing import Callable
44

55
from httpx import Client, HTTPStatusError, Response
@@ -18,6 +18,7 @@
1818
from marketdata.resources.stocks import StocksResource
1919
from marketdata.settings import settings
2020
from marketdata.types import UserRateLimits
21+
from marketdata.utils import format_duration_log
2122

2223

2324
class MarketDataClient:
@@ -134,10 +135,11 @@ def _setup_rate_limits(self):
134135
self.logger.debug("Setting up rate limits")
135136
self._make_request(
136137
method="GET",
137-
url="/user/",
138+
url="user/",
138139
check_rate_limits=False,
139140
include_api_version=False,
140141
populate_rate_limits=True,
142+
response_log_level=DEBUG,
141143
)
142144

143145
def _extract_rate_limits(self, response: Response) -> UserRateLimits:
@@ -149,6 +151,18 @@ def _extract_rate_limits(self, response: Response) -> UserRateLimits:
149151
requests_consumed=int(response.headers["x-api-ratelimit-consumed"]),
150152
)
151153

154+
def _pre_request_logs(self, method: str, url: str, **kwargs):
155+
self.logger.debug(f"Making request to URL: {self.base_url}/{url}")
156+
157+
def _post_request_logs(self, response: Response, response_log_level: int = INFO):
158+
cf_request_id = response.headers.get("cf-ray")
159+
duration = format_duration_log(response.elapsed.total_seconds() * 1000)
160+
method = response.request.method
161+
status = response.status_code
162+
url = response.request.url
163+
message = f"{method} {status} {duration} {cf_request_id} {url}"
164+
self.logger.log(response_log_level, message)
165+
152166
def _make_request(
153167
self,
154168
method: str,
@@ -159,6 +173,7 @@ def _make_request(
159173
timeout: int = HTTP_TIMEOUT,
160174
retry_status_codes: list[int] = RETRY_STATUS_CODES,
161175
raise_for_status: bool = True,
176+
response_log_level: int = INFO,
162177
**kwargs,
163178
) -> Response:
164179
if self.token is NO_TOKEN_VALUE:
@@ -169,7 +184,9 @@ def _make_request(
169184
if include_api_version:
170185
url = f"{self.api_version}/{url}"
171186

187+
self._pre_request_logs(method, url, **kwargs)
172188
response = self.client.request(method, url, **kwargs, timeout=timeout)
189+
self._post_request_logs(response, response_log_level)
173190

174191
self._validate_response_status_code(
175192
response, retry_status_codes, raise_for_status

src/marketdata/resources/base.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ class BaseResource:
1818
def __init__(self, client: "MarketDataClient"):
1919
self.client = client
2020
self.logger = self.client.logger
21-
self.logger.info(f"Initializing {self.__class__.__name__} API handler resource")
21+
self.logger.debug(
22+
f"Initializing {self.__class__.__name__} API handler resource"
23+
)
2224

2325
def _build_url(
2426
self,

src/marketdata/resources/funds/candles.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def candles(
3838
extra_params=kwargs,
3939
excluded_params=["symbol", "resolution"],
4040
)
41-
self.logger.debug(f"Fetching funds candles for symbol: {symbol} using url: {url}")
41+
self.logger.debug("Fetching funds candles ...")
4242

4343
response = self.client._make_request(method="GET", url=url)
4444

src/marketdata/resources/markets/status.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def status(
4242
extra_params=kwargs,
4343
excluded_params=[],
4444
)
45-
self.logger.debug(f"Fetching market status using url: {url}")
45+
self.logger.debug("Fetching market status...")
4646

4747
response = self.client._make_request(method="GET", url=url)
4848

src/marketdata/resources/options/chain.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ def chain(
3131
"""
3232
Fetches the options chain for a given symbol with extensive filtering options.
3333
"""
34-
self.logger.debug(f"Fetching options chain for symbol: {symbol}")
3534
user_universal_params = self._validate_user_universal_params(
3635
self.client.default_params, user_universal_params
3736
)
@@ -44,7 +43,7 @@ def chain(
4443
excluded_params=["symbol"],
4544
)
4645

47-
self.logger.debug(f"Using {symbol} with url: {url}")
46+
self.logger.debug("Fetching options chain...")
4847

4948
response = self.client._make_request(method="GET", url=url)
5049

src/marketdata/resources/options/expirations.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ def expirations(
3535
"""
3636
Fetches available expiration dates for a given symbol.
3737
"""
38-
self.logger.debug(f"Fetching options expirations for symbol: {symbol}")
3938
user_universal_params = self._validate_user_universal_params(
4039
self.client.default_params, user_universal_params
4140
)
@@ -47,7 +46,7 @@ def expirations(
4746
extra_params=kwargs,
4847
excluded_params=["symbol"],
4948
)
50-
self.logger.debug(f"Using {symbol} with url: {url}")
49+
self.logger.debug("Fetching options expirations...")
5150

5251
response = self.client._make_request(method="GET", url=url)
5352

src/marketdata/resources/options/lookup.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ def lookup(
3737
Fetches options lookup data for a given lookup string.
3838
The lookup string should contain the underlying symbol, expiration date, strike price, and option side.
3939
"""
40-
self.logger.debug(f"Fetching options lookup for lookup: {lookup}")
4140
user_universal_params = self._validate_user_universal_params(
4241
self.client.default_params, user_universal_params
4342
)
@@ -54,7 +53,7 @@ def lookup(
5453
extra_params=kwargs,
5554
excluded_params=excluded_params,
5655
)
57-
self.logger.debug(f"Using {lookup} with url: {url}")
56+
self.logger.debug("Fetching options lookup...")
5857

5958
response = self.client._make_request(method="GET", url=url)
6059

src/marketdata/resources/options/quotes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ def _get_response(symbol: str) -> Response:
5656
extra_params=kwargs,
5757
excluded_params=["symbols"],
5858
)
59-
self.logger.debug(f"Using {symbol} with url: {url}")
6059
response = self.client._make_request(method="GET", url=url)
6160
return response
6261

62+
self.logger.debug("Fetching options quotes...")
6363
with ThreadPoolExecutor(max_workers=MAX_CONCURRENT_REQUESTS) as executor:
6464
futures = [
6565
executor.submit(_get_response, symbol) for symbol in input_params.symbols

src/marketdata/resources/options/strikes.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ def strikes(
3535
"""
3636
Fetches available strikes for a given symbol.
3737
"""
38-
self.logger.debug(f"Fetching options strikes for symbol: {symbol}")
3938
user_universal_params = self._validate_user_universal_params(
4039
self.client.default_params, user_universal_params
4140
)
@@ -47,7 +46,7 @@ def strikes(
4746
extra_params=kwargs,
4847
excluded_params=["symbol"],
4948
)
50-
self.logger.debug(f"Using {symbol} with url: {url}")
49+
self.logger.debug("Fetching options strikes...")
5150

5251
response = self.client._make_request(method="GET", url=url)
5352

0 commit comments

Comments
 (0)