Skip to content

Commit a8344c8

Browse files
committed
improve logging
1 parent 524ce4a commit a8344c8

File tree

5 files changed

+31
-33
lines changed

5 files changed

+31
-33
lines changed

functions-python/helpers/logger.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ def init_logger():
5151
Initializes the logger with level INFO if not set in the environment.
5252
On cloud environment it will also initialize the GCP logger.
5353
"""
54-
logging.basicConfig(level=get_env_logging_level())
54+
logging_level = get_env_logging_level()
55+
logging.basicConfig(level=logging_level)
56+
logging.info("Logger initialized with level: %s", logging_level)
5557
global _logging_initialized
5658
if not is_local_env() and not _logging_initialized:
5759
# Avoids initializing the logs multiple times due to performance concerns
@@ -81,6 +83,7 @@ def get_logger(name: str, stable_id: str = None):
8183
if stable_id
8284
else logging.getLogger(name)
8385
)
86+
logger.setLevel(level=get_env_logging_level())
8487
if stable_id and not any(
8588
isinstance(log_filter, StableIdFilter) for log_filter in logger.filters
8689
):

functions-python/helpers/runtime_metrics.py

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import functools
12
import time
23
import tracemalloc
34
import psutil
45
import logging
56

67

7-
def track_metrics(metrics=("time", "memory", "cpu"), logger=None):
8+
def track_metrics(metrics=("time", "memory", "cpu")):
89
"""Decorator to track specified metrics (time, memory, cpu) during function execution.
910
The decorator logs the metrics using the provided logger or a default logger if none is provided.
1011
Args:
@@ -18,18 +19,13 @@ def example_function():
1819
return sum(data)
1920
"""
2021

21-
def decorator(func):
22+
def decorator(funct):
23+
@functools.wraps(funct)
2224
def wrapper(*args, **kwargs):
25+
logger = kwargs.get("logger")
2326
if not logger:
2427
# Use a default logger if none is provided
25-
logger_instance = logging.getLogger(func.__name__)
26-
# handler = logging.StreamHandler()
27-
# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
28-
# handler.setFormatter(formatter)
29-
# logger_instance.addHandler(handler)
30-
# logger_instance.setLevel(logging.DEBUG)
31-
else:
32-
logger_instance = logger
28+
logger = logging.getLogger(funct.__name__)
3329

3430
process = psutil.Process()
3531
tracemalloc.start() if "memory" in metrics else None
@@ -39,30 +35,30 @@ def wrapper(*args, **kwargs):
3935
)
4036

4137
try:
42-
result = func(*args, **kwargs)
38+
result = funct(*args, **kwargs)
4339
except Exception as e:
44-
logger_instance.error(
45-
f"Function '{func.__name__}' raised an exception: {e}"
46-
)
40+
logger.error(f"Function '{funct.__name__}' raised an exception: {e}")
4741
raise
4842
finally:
43+
metrics_message = ""
4944
if "time" in metrics:
5045
duration = time.time() - start_time
51-
logger_instance.debug(
52-
f"Function '{func.__name__}' executed in {duration:.2f} seconds."
53-
)
46+
metrics_message = f"time: {duration:.2f} seconds"
5447
if "memory" in metrics:
5548
current, peak = tracemalloc.get_traced_memory()
5649
tracemalloc.stop()
57-
logger_instance.debug(
58-
f"Function '{func.__name__}' peak memory usage: {peak / (1024 ** 2):.2f} MB."
59-
)
50+
if metrics_message:
51+
metrics_message += ", "
52+
metrics_message += f"memory: {current / (1024 ** 2):.2f} MB (peak: {peak / (1024 ** 2):.2f} MB)"
6053
if "cpu" in metrics:
6154
cpu_after = process.cpu_percent(interval=None)
62-
logger_instance.debug(
63-
f"Function '{func.__name__}' CPU usage: {cpu_after - cpu_before:.2f}%."
55+
if metrics_message:
56+
metrics_message += ", "
57+
metrics_message += f"cpu: {cpu_after - cpu_before:.2f}%"
58+
if len(metrics_message) > 0:
59+
logger.info(
60+
"Function metrics('%s'): %s", funct.__name__, metrics_message
6461
)
65-
6662
return result
6763

6864
return wrapper

functions-python/reverse_geolocation/src/reverse_geolocation_processor.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -385,11 +385,9 @@ def extract_location_aggregates_per_point(
385385

386386

387387
@with_db_session
388-
@track_metrics(
389-
metrics=("time", "memory", "cpu"), logger=get_logger(__name__, "stable_id")
390-
)
388+
@track_metrics(metrics=("time", "memory", "cpu"))
391389
def update_dataset_bounding_box(
392-
dataset_id: str, stops_df: pd.DataFrame, db_session: Session
390+
dataset_id: str, stops_df: pd.DataFrame, logger: logging.Logger, db_session: Session
393391
) -> shapely.Polygon:
394392
"""
395393
Update the bounding box of the dataset using the stops DataFrame.
@@ -476,7 +474,7 @@ def reverse_geolocation_process(
476474
logger = get_logger(__name__, stable_id)
477475
try:
478476
# Update the bounding box of the dataset
479-
bounding_box = update_dataset_bounding_box(dataset_id, stops_df)
477+
bounding_box = update_dataset_bounding_box(dataset_id, stops_df, logger)
480478

481479
location_groups = reverse_geolocation(
482480
strategy,
@@ -516,9 +514,7 @@ def reverse_geolocation_process(
516514
return str(e), ERROR_STATUS_CODE
517515

518516

519-
@track_metrics(
520-
metrics=("time", "memory", "cpu"), logger=get_logger(__name__, "stable_id")
521-
)
517+
@track_metrics(metrics=("time", "memory", "cpu"))
522518
def reverse_geolocation(
523519
strategy,
524520
stable_id,

functions-python/reverse_geolocation/src/scripts/reverse_geolocation_process_verifier.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from google.cloud import storage
1010

1111
from reverse_geolocation_processor import reverse_geolocation_process
12+
from shared.helpers.logger import init_logger
1213

1314
HOST = "localhost"
1415
PORT = 9023
@@ -24,6 +25,8 @@
2425
# Load environment variables from .env.local
2526
load_dotenv(dotenv_path=".env.local")
2627

28+
init_logger()
29+
2730

2831
def download_to_local(url: str, filename: str):
2932
"""

functions-python/reverse_geolocation/tests/test_reverse_geolocation_processor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ def test_update_dataset_bounding_box_success(self, db_session):
620620

621621
# Call the function
622622
bounding_box = update_dataset_bounding_box(
623-
dataset_id, stops_df, db_session=db_session
623+
dataset_id, stops_df, db_session=db_session, logger=logger
624624
)
625625

626626
# Expected bounding box: POLYGON((30 10, 40 10, 40 20, 30 20, 30 10))

0 commit comments

Comments
 (0)