Skip to content

Commit 6699db5

Browse files
authored
chore: improve logs on validation report processing functions (#1214)
1 parent 9d46194 commit 6699db5

File tree

7 files changed

+58
-50
lines changed

7 files changed

+58
-50
lines changed

functions-python/process_validation_report/src/main.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@
3232
Notice,
3333
Gtfsdataset,
3434
)
35-
from shared.helpers.logger import Logger
35+
from shared.helpers.logger import init_logger
3636
from shared.helpers.transform import get_nested_value
3737
from shared.helpers.feed_status import update_feed_statuses_query
3838

39-
logging.basicConfig(level=logging.INFO)
39+
init_logger()
4040

4141
FILES_ENDPOINT = os.getenv("FILES_ENDPOINT")
4242

@@ -91,11 +91,11 @@ def validate_json_report(json_report_url):
9191
try:
9292
json_report, code = read_json_report(json_report_url)
9393
if code != 200:
94-
logging.error(f"Error reading JSON report: {code}")
94+
logging.error("Error reading JSON report: %s", code)
9595
return f"Error reading JSON report at url {json_report_url}.", code
9696
return json_report, 200
9797
except Exception as error: # JSONDecodeError or RequestException
98-
logging.error(f"Error reading JSON report: {error}")
98+
logging.error("Error reading JSON report: %s", str(error))
9999
return f"Error reading JSON report at url {json_report_url}: {error}", 500
100100

101101

@@ -112,11 +112,13 @@ def parse_json_report(json_report):
112112
if "validatorVersion" in json_report["summary"]:
113113
version = json_report["summary"]["validatorVersion"]
114114
logging.info(
115-
f"Validation report validated at {validated_at} with version {version}."
115+
"Validation report validated_at: %s with version: %s.",
116+
validated_at,
117+
version,
116118
)
117119
return validated_at, version
118120
except Exception as error:
119-
logging.error(f"Error parsing JSON report: {error}")
121+
logging.error("Error parsing JSON report: %s", error)
120122
raise Exception(f"Error parsing JSON report: {error}")
121123

122124

@@ -135,7 +137,7 @@ def generate_report_entities(
135137
"""
136138
entities = []
137139
report_id = f"{dataset_stable_id}_{version}"
138-
logging.info(f"Creating validation report entities for {report_id}.")
140+
logging.info("Creating validation report entities for: %s.", report_id)
139141

140142
html_report_url = (
141143
f"{FILES_ENDPOINT}/{feed_stable_id}/{dataset_stable_id}/report_{version}.html"
@@ -146,7 +148,7 @@ def generate_report_entities(
146148
# Check if report already exists
147149
# If exists, the function should graceful finish avoiding retry mechanism to trigger again
148150
if get_validation_report(report_id, session):
149-
logging.warning(f"Validation report {report_id} already exists. Terminating.")
151+
logging.warning("Validation report %s already exists. Terminating.", report_id)
150152
return []
151153

152154
validation_report_entity = Validationreport(
@@ -284,8 +286,9 @@ def create_validation_report_entities(
284286
return str(error), 200
285287

286288
update_feed_statuses_query(db_session, [feed_stable_id])
287-
288-
return f"Created {len(entities)} entities.", 200
289+
result = f"Created {len(entities)} entities."
290+
logging.info(result)
291+
return result, 200
289292
except Exception as error:
290293
logging.error("Error creating validation report entities: : %s", error)
291294
return f"Error creating validation report entities: {error}", 500
@@ -314,10 +317,9 @@ def process_validation_report(request):
314317
:param request: Request object containing 'dataset_id' and 'feed_id'
315318
:return: HTTP response indicating the result of the operation
316319
"""
317-
Logger.init_logger()
318320
request_json = request.get_json(silent=True)
319321
logging.info(
320-
f"Processing validation report function called with request: {request_json}"
322+
"Processing validation report function called with request: %s", request_json
321323
)
322324
if (
323325
not request_json
@@ -335,7 +337,10 @@ def process_validation_report(request):
335337
feed_id = request_json["feed_id"]
336338
validator_version = request_json["validator_version"]
337339
logging.info(
338-
f"Processing validation report version {validator_version} for dataset {dataset_id} in feed {feed_id}."
340+
"Processing validation report version: %s for dataset: %s in feed: %s.",
341+
validator_version,
342+
dataset_id,
343+
feed_id,
339344
)
340345
return create_validation_report_entities(feed_id, dataset_id, validator_version)
341346

@@ -370,8 +375,10 @@ def compute_validation_report_counters(request, db_session: Session):
370375
.offset(offset)
371376
.all()
372377
)
373-
print(
374-
f"Processing {len(validation_reports)} validation reports from offset {offset}."
378+
logging.info(
379+
"Processing %s validation reports from offset: %s.",
380+
len(validation_reports),
381+
offset,
375382
)
376383
# Break the loop if no more reports are found
377384
if len(validation_reports) == 0:
@@ -380,10 +387,17 @@ def compute_validation_report_counters(request, db_session: Session):
380387
for report in validation_reports:
381388
populate_counters(report.notices, report)
382389
logging.info(
383-
f"Updated ValidationReport {report.id} with counters: "
384-
f"INFO={report.total_info}, WARNING={report.total_warning}, ERROR={report.total_error}, "
385-
f"Unique INFO Code={report.unique_info_count}, Unique WARNING Code={report.unique_warning_count}, "
386-
f"Unique ERROR Code={report.unique_error_count}"
390+
"Updated ValidationReport %s with counters: "
391+
"INFO=%s, WARNING=%s, ERROR=%s, "
392+
"Unique INFO Code=%s, Unique WARNING Code=%s, "
393+
"Unique ERROR Code=%s",
394+
report.id,
395+
report.total_info,
396+
report.total_warning,
397+
report.total_error,
398+
report.unique_info_count,
399+
report.unique_warning_count,
400+
report.unique_error_count,
387401
)
388402

389403
# Commit the changes for the current batch
@@ -420,7 +434,7 @@ def process_validation_report_notices(notices):
420434
total_error += notice.total_notices
421435
error_codes.add(notice.notice_code)
422436
case _:
423-
logging.warning(f"Unknown severity: {notice.severity}")
437+
logging.warning("Unknown severity: %s", notice.severity)
424438

425439
return {
426440
"total_info": total_info,

functions-python/process_validation_report/tests/test_validation_report.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,8 @@ def test_create_validation_report_entities_missing_dataset(self, mock_get):
206206
message,
207207
)
208208

209-
@patch("main.Logger")
210209
@patch("main.create_validation_report_entities")
211-
def test_process_validation_report(self, create_validation_report_entities_mock, _):
210+
def test_process_validation_report(self, create_validation_report_entities_mock):
212211
request = MagicMock(
213212
get_json=MagicMock(
214213
return_value={
@@ -221,10 +220,9 @@ def test_process_validation_report(self, create_validation_report_entities_mock,
221220
process_validation_report(request)
222221
create_validation_report_entities_mock.assert_called_once()
223222

224-
@patch("main.Logger")
225223
@patch("main.create_validation_report_entities")
226224
def test_process_validation_report_invalid_request(
227-
self, create_validation_report_entities_mock, _
225+
self, create_validation_report_entities_mock
228226
):
229227
request = MagicMock(
230228
get_json=MagicMock(

functions-python/update_validation_report/src/main.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
from shared.helpers.gtfs_validator_common import get_gtfs_validator_results_bucket
3636
from shared.database.database import with_db_session
3737

38-
from shared.helpers.logger import Logger
38+
from shared.helpers.logger import init_logger
3939
from shared.helpers.validation_report.validation_report_update import execute_workflows
4040

41-
logging.basicConfig(level=logging.INFO)
41+
init_logger()
4242
env = os.getenv("ENV", "dev").lower()
4343
bucket_name = f"mobilitydata-datasets-{env}"
4444

@@ -49,8 +49,6 @@ def update_validation_report(request: flask.Request, db_session: Session):
4949
"""
5050
Update the validation report for the datasets that need it
5151
"""
52-
Logger.init_logger()
53-
5452
request_json = request.get_json()
5553
validator_endpoint = request_json.get(
5654
"validator_endpoint", os.getenv("WEB_VALIDATOR_URL")
@@ -77,10 +75,10 @@ def update_validation_report(request: flask.Request, db_session: Session):
7775
latest_datasets = get_latest_datasets_without_validation_reports(
7876
db_session, validator_version, force_update
7977
)
80-
logging.info(f"Retrieved {len(latest_datasets)} latest datasets.")
78+
logging.info("Retrieved %s latest datasets.", len(latest_datasets))
8179

8280
valid_latest_datasets = get_datasets_for_validation(latest_datasets)
83-
logging.info(f"Retrieved {len(latest_datasets)} blobs to update.")
81+
logging.info("Retrieved %s blobs to update.", len(latest_datasets))
8482

8583
execution_triggered_datasets = execute_workflows(
8684
valid_latest_datasets, validator_endpoint, bypass_db_update, reports_bucket_name
@@ -115,7 +113,7 @@ def get_validator_version(validator_url: str) -> str:
115113
"""
116114
response = requests.get(f"{validator_url}/version")
117115
validator_version = response.json()["version"]
118-
logging.info(f"Validator version: {validator_version}")
116+
logging.info("Validator version: %s", validator_version)
119117
return validator_version
120118

121119

@@ -172,7 +170,9 @@ def get_datasets_for_validation(
172170
else:
173171
report_update_needed.append((feed_id, dataset_id))
174172
logging.info(
175-
f"Dataset blob found for {feed_id}/{dataset_id} -- Adding to update list"
173+
"Dataset blob found for %s/%s -- Adding to update list",
174+
feed_id,
175+
dataset_id,
176176
)
177177
except Exception as e:
178178
logging.error(

functions-python/update_validation_report/tests/test_update_validation_report.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ def create_dataset_blob(name, exists):
103103
@patch("google.cloud.storage.Blob", autospec=True)
104104
@patch("requests.get", autospec=True)
105105
@patch("google.cloud.storage.Client", autospec=True)
106-
@patch("main.Logger", autospec=True)
107106
@patch("google.cloud.workflows_v1.WorkflowsClient", autospec=True)
108107
@patch("google.cloud.workflows.executions_v1.ExecutionsClient", autospec=True)
109108
@patch("google.cloud.workflows.executions_v1.Execution", autospec=True)
@@ -112,7 +111,6 @@ def test_update_validation_report(
112111
execution_mock,
113112
executions_client_mock,
114113
workflows_client_mock,
115-
mock_logger,
116114
mock_client,
117115
mock_get,
118116
mock_blob,

functions-python/validation_to_ndjson/src/main.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import functions_framework
55
from cloudevents.http import CloudEvent
66

7-
from shared.helpers.logger import Logger
7+
from shared.helpers.logger import init_logger
88
from google.cloud import storage
99
from validation_report_converter import (
1010
ValidationReportConverter,
@@ -13,7 +13,7 @@
1313
)
1414

1515

16-
logging.basicConfig(level=logging.INFO)
16+
init_logger()
1717

1818

1919
def parse_resource_data(data: dict) -> tuple:
@@ -39,11 +39,14 @@ def convert_reports_to_ndjson(cloud_event: CloudEvent):
3939
Convert a validation report to NDJSON format.
4040
@param cloud_event: The CloudEvent object.
4141
"""
42-
Logger.init_logger()
4342
logging.info("Function triggered")
4443
stable_id, dataset_id, report_id, url = parse_resource_data(cloud_event.data)
4544
logging.info(
46-
f"Stable ID: {stable_id}, Dataset ID: {dataset_id}, URL: {url}, Report ID: {report_id}"
45+
"Stable ID: %s, Dataset ID: %s, URL: %s, Report ID: %s",
46+
stable_id,
47+
dataset_id,
48+
url,
49+
report_id,
4750
)
4851
converter_type = ValidationReportConverter.get_converter()
4952
converter_type(stable_id, dataset_id, report_id, url).process()
@@ -53,7 +56,6 @@ def convert_reports_to_ndjson(cloud_event: CloudEvent):
5356
@functions_framework.http
5457
def batch_convert_reports_to_ndjson(request: flask.Request):
5558
"""Batch convert all reports in the bucket to NDJSON format."""
56-
Logger.init_logger()
5759
logging.info("Function triggered")
5860

5961
# 1. Get the validator version from the request
@@ -62,7 +64,7 @@ def batch_convert_reports_to_ndjson(request: flask.Request):
6264
validator_version = request_json.get("validator_version", "")
6365
report_suffix = f"{validator_version}.json"
6466
except Exception as e:
65-
logging.error(f"Failed to get validator version: {e}")
67+
logging.error("Failed to get validator version: %s", e)
6668
report_suffix = ".json"
6769

6870
# 2. Get all reports in the bucket
@@ -73,7 +75,7 @@ def batch_convert_reports_to_ndjson(request: flask.Request):
7375
for blob in blobs
7476
if "report_" in blob.name and blob.name.endswith(report_suffix)
7577
]
76-
logging.info(f"Found {len(report_blobs)} reports to process.")
78+
logging.info("Found %s reports to process.", len(report_blobs))
7779

7880
# 3. For each report create cloud event and call convert_reports_to_ndjson
7981
for blob in report_blobs:

functions-python/validation_to_ndjson/src/validation_report_converter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def __init__(
3232
try:
3333
self.validation_report = requests.get(validation_report_url).json()
3434
except Exception as e:
35-
logging.error(f"Failed to download the validation report: {e}")
35+
logging.error("Failed to download the validation report: %", e)
3636
self.validation_report = None
3737
self.stable_id = stable_id
3838
self.dataset_id = dataset_id
@@ -69,7 +69,7 @@ def process(self) -> None:
6969
f"{self.report_id}.ndjson"
7070
)
7171
if self.validation_report is None:
72-
logging.error(f"Validation report is empty for {self.report_id}.")
72+
logging.error("Validation report is empty for %s.", self.report_id)
7373
return
7474

7575
# Add feedId to the JSON data
@@ -93,7 +93,7 @@ def process(self) -> None:
9393
ndjson_content = json.dumps(json_data, separators=(",", ":"))
9494
ndjson_blob = bucket.blob(ndjson_blob_name)
9595
ndjson_blob.upload_from_string(ndjson_content + "\n")
96-
logging.info(f"Processed and uploaded {ndjson_blob_name}")
96+
logging.info("Processed and uploaded %s to", ndjson_blob_name)
9797

9898

9999
class GTFSValidationReportConverter(ValidationReportConverter):

functions-python/validation_to_ndjson/tests/test_main.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99

1010

1111
class TestReportConversionFunctions(unittest.TestCase):
12-
@patch("main.Logger.init_logger")
1312
@patch("main.ValidationReportConverter.get_converter")
1413
@patch("main.parse_resource_data")
1514
def test_convert_reports_to_ndjson(
16-
self, mock_parse_resource_data, mock_get_converter, mock_init_logger
15+
self, mock_parse_resource_data, mock_get_converter
1716
):
1817
# Setup mocks
1918
mock_converter_class = MagicMock()
@@ -42,7 +41,6 @@ def test_convert_reports_to_ndjson(
4241
result = convert_reports_to_ndjson(cloud_event)
4342

4443
# Assertions
45-
mock_init_logger.assert_called_once()
4644
mock_parse_resource_data.assert_called_once_with(cloud_event.data)
4745
mock_get_converter.assert_called_once()
4846
mock_converter_class.assert_called_once_with(
@@ -51,11 +49,10 @@ def test_convert_reports_to_ndjson(
5149
mock_converter_instance.process.assert_called_once()
5250
self.assertEqual(result, ("stable_id", "dataset_id", "url"))
5351

54-
@patch("main.Logger.init_logger")
5552
@patch("main.storage.Client")
5653
@patch("main.convert_reports_to_ndjson")
5754
def test_batch_convert_reports_to_ndjson(
58-
self, mock_convert_reports_to_ndjson, mock_storage_client, mock_init_logger
55+
self, mock_convert_reports_to_ndjson, mock_storage_client
5956
):
6057
# Setup mocks
6158
mock_blob1 = MagicMock()
@@ -70,7 +67,6 @@ def test_batch_convert_reports_to_ndjson(
7067
result = batch_convert_reports_to_ndjson(None)
7168

7269
# Assertions
73-
mock_init_logger.assert_called_once()
7470
mock_storage_client().list_blobs.assert_called_once()
7571
self.assertEqual(mock_convert_reports_to_ndjson.call_count, 2)
7672
self.assertEqual(result, "Success converting reports to NDJSON")

0 commit comments

Comments
 (0)