Skip to content

Commit 926f557

Browse files
authored
fix: removes broken filter in log method (#405)
1 parent de91ea8 commit 926f557

4 files changed

Lines changed: 42 additions & 93 deletions

File tree

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Module to handle logging submit job requests"""
22

33
import logging
4-
from typing import Any
54
from enum import Enum
5+
from typing import Any
66

77

88
class EventType(str, Enum):
@@ -13,20 +13,9 @@ class EventType(str, Enum):
1313
STAGE_FAILURE = "stage_failure"
1414

1515

16-
def log_stage_event(
17-
message: str,
18-
event_type: EventType,
19-
**extra_fields: Any
16+
def log_submit_job_request(
17+
content: Any, event_type: EventType | None = None
2018
) -> None:
21-
"""Emit a structured log record for stage lifecycle events."""
22-
23-
logging.info(
24-
message,
25-
extra={"event_type": event_type.value, **extra_fields},
26-
)
27-
28-
29-
def log_submit_job_request(content: Any) -> None:
3019
"""
3120
Parses content object to log any lines with a subject_id and
3221
acquisition_name.
@@ -35,16 +24,22 @@ def log_submit_job_request(content: Any) -> None:
3524
----------
3625
content : Any
3726
Pulled from request json, which may or may not return expected dict
27+
event_type: EventType | None
28+
Type of event to log. Default is None.
3829
"""
39-
if isinstance(content, list) and all(
40-
isinstance(row, dict) for row in content
30+
upload_jobs = content.get("upload_jobs")
31+
if (
32+
upload_jobs is not None
33+
and isinstance(upload_jobs, list)
34+
and all(isinstance(row, dict) for row in upload_jobs)
4135
):
42-
for row in content:
36+
for row in upload_jobs:
4337
subject_id = row.get("subject_id")
4438
acquisition_name = row.get("s3_prefix")
45-
log_stage_event(
46-
"Handling request",
47-
event_type=EventType.STAGE_START,
48-
subject_id=subject_id,
49-
acquisition_name=acquisition_name,
50-
)
39+
extra_info = {
40+
"subject_id": subject_id,
41+
"acquisition_name": acquisition_name,
42+
}
43+
if event_type is not None:
44+
extra_info["event_type"] = event_type
45+
logging.info("Handling request", extra=extra_info)

src/aind_data_transfer_service/server.py

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
)
3434
from aind_data_transfer_service.log_handler import (
3535
EventType,
36-
log_stage_event,
3736
log_submit_job_request,
3837
)
3938
from aind_data_transfer_service.models.core import (
@@ -358,7 +357,9 @@ async def submit_jobs_v2(request: Request):
358357
logging.info("Received request to submit jobs v2")
359358
content = await request.json()
360359
try:
361-
log_submit_job_request(content=content)
360+
log_submit_job_request(
361+
content=content, event_type=EventType.STAGE_START
362+
)
362363
params = AirflowDagRunsRequestParameters(
363364
dag_ids=["transform_and_upload_v2", "run_list_of_jobs"],
364365
states=["running", "queued"],
@@ -395,24 +396,12 @@ async def submit_jobs_v2(request: Request):
395396
url=os.getenv("AIND_AIRFLOW_SERVICE_URL"),
396397
json={"conf": full_content},
397398
)
398-
status_code = response.status_code
399-
response_json = response.json()
400-
if status_code > 300:
401-
log_stage_event(
402-
"Failed submit jobs v2 request",
403-
event_type=EventType.STAGE_FAILURE,
404-
dag_id=model.dag_id,
405-
total_jobs=total_jobs,
406-
status_code=status_code,
407-
)
408-
else:
409-
log_stage_event(
410-
"Completed submit jobs v2 request",
411-
event_type=EventType.STAGE_COMPLETE,
412-
dag_id=model.dag_id,
413-
total_jobs=total_jobs,
414-
status_code=status_code,
415-
)
399+
response.raise_for_status()
400+
status_code = response.status_code
401+
response_json = response.json()
402+
log_submit_job_request(
403+
content=content, event_type=EventType.STAGE_COMPLETE
404+
)
416405
return JSONResponse(
417406
status_code=status_code,
418407
content={
@@ -422,6 +411,9 @@ async def submit_jobs_v2(request: Request):
422411
)
423412
except ValidationError as e:
424413
logging.warning(f"There were validation errors processing {content}")
414+
log_submit_job_request(
415+
content=content, event_type=EventType.STAGE_FAILURE
416+
)
425417
return JSONResponse(
426418
status_code=406,
427419
content={
@@ -431,11 +423,8 @@ async def submit_jobs_v2(request: Request):
431423
)
432424
except Exception as e:
433425
logging.exception(e, exc_info=True)
434-
log_stage_event(
435-
"Failed submit jobs v2 request",
436-
event_type=EventType.STAGE_FAILURE,
437-
content=content,
438-
error=str(e.args),
426+
log_submit_job_request(
427+
content=content, event_type=EventType.STAGE_FAILURE
439428
)
440429
return JSONResponse(
441430
status_code=500,

tests/test_log_handler.py

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from aind_data_transfer_service import CustomJsonFormatter
1010
from aind_data_transfer_service.log_handler import (
1111
EventType,
12-
log_stage_event,
1312
log_submit_job_request,
1413
)
1514

@@ -20,8 +19,12 @@ class TestLogHandler(unittest.TestCase):
2019
@patch("logging.info")
2120
def test_log_submit_job_request(self, mock_log: MagicMock):
2221
"""Tests log_submit_job_request"""
23-
content = [{"s3_prefix": "abc-123", "subject_id": "123456"}]
24-
log_submit_job_request(content=content)
22+
content = {
23+
"upload_jobs": [{"s3_prefix": "abc-123", "subject_id": "123456"}]
24+
}
25+
log_submit_job_request(
26+
content=content, event_type=EventType.STAGE_START
27+
)
2528
mock_log.assert_called_once_with(
2629
"Handling request",
2730
extra={
@@ -31,26 +34,6 @@ def test_log_submit_job_request(self, mock_log: MagicMock):
3134
},
3235
)
3336

34-
@patch("logging.info")
35-
def test_log_stage_event(self, mock_log: MagicMock):
36-
"""Tests log_stage_event emits structured extra fields."""
37-
38-
log_stage_event(
39-
"Completed submit jobs v2 request",
40-
event_type=EventType.STAGE_COMPLETE,
41-
dag_id="run_list_of_jobs",
42-
total_jobs=2,
43-
)
44-
45-
mock_log.assert_called_once_with(
46-
"Completed submit jobs v2 request",
47-
extra={
48-
"event_type": EventType.STAGE_COMPLETE,
49-
"dag_id": "run_list_of_jobs",
50-
"total_jobs": 2,
51-
},
52-
)
53-
5437

5538
class TestCustomJsonFormatter(unittest.TestCase):
5639
"""Tests methods CustomJsonFormatter from init module"""

tests/test_server.py

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,7 +1577,6 @@ def test_submit_v1_v2_jobs_406(
15771577

15781578
@patch.dict(os.environ, EXAMPLE_ENV_VAR1, clear=True)
15791579
@patch("httpx.AsyncClient.post")
1580-
@patch("aind_data_transfer_service.server.log_stage_event")
15811580
@patch("aind_data_transfer_service.server.get_airflow_jobs")
15821581
@patch("aind_data_transfer_service.server.get_project_names")
15831582
@patch("aind_data_transfer_service.server.get_job_types")
@@ -1586,7 +1585,6 @@ def test_submit_v1_v2_jobs_200(
15861585
mock_get_job_types: MagicMock,
15871586
mock_get_project_names: MagicMock,
15881587
mock_get_airflow_jobs: MagicMock,
1589-
mock_log_stage_event: MagicMock,
15901588
mock_post: MagicMock,
15911589
):
15921590
"""Tests submit jobs success."""
@@ -1618,18 +1616,10 @@ def test_submit_v1_v2_jobs_200(
16181616
params=expected_airflow_params, get_confs=True
16191617
)
16201618
self.assertEqual(1, mock_get_project_names.call_count)
1621-
self.assertEqual(4, len(captured.output))
1622-
mock_log_stage_event.assert_called_once_with(
1623-
"Completed submit jobs v2 request",
1624-
event_type="stage_complete",
1625-
dag_id="transform_and_upload_v2",
1626-
total_jobs=1,
1627-
status_code=200,
1628-
)
1619+
self.assertEqual(6, len(captured.output))
16291620

16301621
@patch.dict(os.environ, EXAMPLE_ENV_VAR1, clear=True)
16311622
@patch("httpx.AsyncClient.post")
1632-
@patch("aind_data_transfer_service.server.log_stage_event")
16331623
@patch("aind_data_transfer_service.server.get_airflow_jobs")
16341624
@patch("aind_data_transfer_service.server.get_project_names")
16351625
@patch("aind_data_transfer_service.server.get_job_types")
@@ -1638,7 +1628,6 @@ def test_submit_v1_v2_jobs_500(
16381628
mock_get_job_types: MagicMock,
16391629
mock_get_project_names: MagicMock,
16401630
mock_get_airflow_jobs: MagicMock,
1641-
mock_log_stage_event: MagicMock,
16421631
mock_post: MagicMock,
16431632
):
16441633
"""Tests submit jobs failure."""
@@ -1670,14 +1659,7 @@ def test_submit_v1_v2_jobs_500(
16701659
params=expected_airflow_params, get_confs=True
16711660
)
16721661
self.assertEqual(1, mock_get_project_names.call_count)
1673-
self.assertEqual(4, len(captured.output))
1674-
mock_log_stage_event.assert_called_once_with(
1675-
"Failed submit jobs v2 request",
1676-
event_type="stage_failure",
1677-
dag_id="transform_and_upload_v2",
1678-
total_jobs=1,
1679-
status_code=500,
1680-
)
1662+
self.assertEqual(7, len(captured.output))
16811663

16821664
@patch.dict(os.environ, EXAMPLE_ENV_VAR1, clear=True)
16831665
@patch("httpx.AsyncClient.post")
@@ -1773,7 +1755,7 @@ def test_submit_v2_jobs_200_basic_serialization(
17731755
url="/api/v2/submit_jobs", json=post_request_content_v2
17741756
)
17751757
self.assertEqual(200, submit_job_response.status_code)
1776-
self.assertEqual(5, len(captured.output))
1758+
self.assertEqual(6, len(captured.output))
17771759
mock_get_job_types.assert_called_once_with("v2")
17781760
mock_get_airflow_jobs.assert_called_once()
17791761
self.assertEqual(1, mock_get_project_names.call_count)
@@ -1822,7 +1804,7 @@ def test_validate_json(
18221804
)
18231805
mock_get_job_types.assert_called_once_with("v2")
18241806
self.assertEqual(1, mock_get_project_names.call_count)
1825-
self.assertEqual(3, len(captured.output))
1807+
self.assertEqual(4, len(captured.output))
18261808

18271809
@patch("aind_data_transfer_service.server.get_airflow_jobs")
18281810
@patch("aind_data_transfer_service.server.get_project_names")

0 commit comments

Comments
 (0)