Skip to content

Commit b43aabc

Browse files
authored
Internal logging and tracing improvements. (#1886)
1 parent b0478c9 commit b43aabc

File tree

2 files changed

+68
-4
lines changed

2 files changed

+68
-4
lines changed

src/ragas/sdk.py

+13
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77

88
import requests
99

10+
from ragas._analytics import get_userid
1011
from ragas._version import __version__
1112
from ragas.exceptions import UploadException
13+
from ragas.utils import base_logger
1214

1315
# endpoint for uploading results
1416
RAGAS_API_URL = "https://api.ragas.io"
@@ -46,6 +48,7 @@ def upload_packet(path: str, data_json_string: str):
4648
"x-app-token": app_token,
4749
"x-source": RAGAS_API_SOURCE,
4850
"x-app-version": __version__,
51+
"x-ragas-lib-user-uuid": get_userid(),
4952
},
5053
)
5154
check_api_response(response)
@@ -67,6 +70,11 @@ def check_api_response(response: requests.Response) -> None:
6770
If authentication fails or other API errors occur
6871
"""
6972
if response.status_code == 403:
73+
base_logger.error(
74+
"[AUTHENTICATION_ERROR] The app token is invalid. "
75+
"Please check your RAGAS_APP_TOKEN environment variable. "
76+
f"Response Status: {response.status_code}, URL: {response.url}"
77+
)
7078
raise UploadException(
7179
status_code=response.status_code,
7280
message="AUTHENTICATION_ERROR: The app token is invalid. Please check your RAGAS_APP_TOKEN environment variable.",
@@ -85,6 +93,11 @@ def check_api_response(response: requests.Response) -> None:
8593
except Exception as _e:
8694
error_msg = f"\nStatus Code: {response.status_code}"
8795

96+
base_logger.error(
97+
f"[API_ERROR] Request failed. "
98+
f"Status Code: {response.status_code}, URL: {response.url}, "
99+
f"Error Message: {error_msg}"
100+
)
88101
raise UploadException(
89102
status_code=response.status_code, message=f"Request failed: {error_msg}"
90103
)

src/ragas/utils.py

+55-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import tiktoken
1313
from datasets import Dataset
1414

15+
from datetime import datetime
16+
1517
if t.TYPE_CHECKING:
1618
from ragas.metrics.base import Metric
1719

@@ -238,20 +240,69 @@ def batched(iterable: t.Iterable, n: int) -> t.Iterator[t.Tuple]:
238240
yield batch
239241

240242

241-
def set_logging_level(logger_name: str, level: int):
243+
_LOGGER_DATE_TIME = "%Y-%m-%d %H:%M:%S"
244+
245+
246+
def set_logging_level(logger_name: str = __name__, level: int = logging.DEBUG):
242247
"""
243248
Set the logging level for a logger. Useful for debugging.
244249
"""
245250
logger = logging.getLogger(logger_name)
246251
logger.setLevel(level)
247252

253+
log_format = (
254+
"[%(local_time)s - (%(utc_time)s UTC)] "
255+
"[%(levelname)s] [%(name)s] "
256+
"[RagasID: %(ragas_id)s, App-Version: %(app_version)s] %(message)s"
257+
)
258+
259+
# Create a formatter with the custom formatter
260+
formatter = _ContextualFormatter(log_format, datefmt=_LOGGER_DATE_TIME)
261+
248262
# Create a console handler and set its level
249263
console_handler = logging.StreamHandler()
250-
console_handler.setLevel(logging.DEBUG)
264+
console_handler.setLevel(level)
251265

252-
# Create a formatter and add it to the handler
253-
formatter = logging.Formatter("%(name)s - %(levelname)s - %(message)s")
266+
# Apply the formatter to the handler
254267
console_handler.setFormatter(formatter)
255268

256269
# Add the handler to the logger
257270
logger.addHandler(console_handler)
271+
272+
return logger
273+
274+
275+
class _ContextualFormatter(logging.Formatter):
276+
"""
277+
Custom logging formatter that adds context to the log records.
278+
"""
279+
280+
def format(self, record):
281+
from ragas._analytics import get_userid
282+
from ragas import __version__
283+
284+
# Add UTC time
285+
record.utc_time = self.format_time(record, _LOGGER_DATE_TIME)
286+
# Add local time
287+
record.local_time = self.format_time(record, _LOGGER_DATE_TIME, local_time=True)
288+
# Add additional context
289+
record.ragas_id = get_userid()
290+
record.app_version = __version__
291+
return super().format(record)
292+
293+
def format_time(self, record, datefmt=None, local_time=False):
294+
dt = (
295+
self.utc_converter(record.created)
296+
if not local_time
297+
else datetime.fromtimestamp(record.created)
298+
)
299+
if datefmt:
300+
return dt.strftime(datefmt)
301+
return dt.isoformat()
302+
303+
@staticmethod
304+
def utc_converter(timestamp):
305+
return datetime.utcfromtimestamp(timestamp) # UTC time conversion
306+
307+
308+
base_logger = set_logging_level()

0 commit comments

Comments
 (0)