11from importlib .metadata import version
2- from logging import Logger
2+ from logging import DEBUG , INFO , Logger
33from typing import Callable
44
55from httpx import Client , HTTPStatusError , Response
1818from marketdata .resources .stocks import StocksResource
1919from marketdata .settings import settings
2020from marketdata .types import UserRateLimits
21+ from marketdata .utils import format_duration_log
2122
2223
2324class 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
0 commit comments