Skip to content

Commit 6ddb323

Browse files
maxxgxCopilot
andauthored
🔧 chore(geti-inspect): configure loggers (#3039)
* refactor workers into class Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * configure loguru Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * fix ruff Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * fix mypy Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * fix line too long Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * add trackio and tensorboard logger Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * style fix Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * fix logs endpoint and tests Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * address comments Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * address copilot comments Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * fix ruff Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> * Update application/backend/src/services/training_service.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Max Xiang <maxx.rift@gmail.com> * Update application/backend/src/api/dependencies.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Max Xiang <maxx.rift@gmail.com> * Update application/backend/src/core/scheduler.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Max Xiang <maxx.rift@gmail.com> * Update application/backend/src/services/job_service.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Max Xiang <maxx.rift@gmail.com> * Update application/backend/src/services/training_service.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Max Xiang <maxx.rift@gmail.com> * use text/event-stream Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> --------- Signed-off-by: Ma, Xiangxiang <xiangxiang.ma@intel.com> Signed-off-by: Max Xiang <maxx.rift@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent cdeeaff commit 6ddb323

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1361
-695
lines changed

application/backend/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ wheels/
1414
TODO*
1515

1616
data/
17+
logs/
18+
sink/
19+
1720
.idea
1821
.DS_Store
1922
.inspect.db

application/backend/pyproject.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ dependencies = [
2121
"opencv-python-headless~=4.12",
2222
"watchdog==6.0.0",
2323
"uvloop==0.21.0",
24+
"loguru==0.7.3",
25+
"trackio~=0.6.0",
2426
]
2527

2628
[dependency-groups]
@@ -36,6 +38,7 @@ lint = [
3638
"ruff~=0.11.2",
3739
"mypy~=1.17",
3840
"types-requests~=2.32.4",
41+
"types-PyYAML~=6.0.12",
3942
]
4043

4144
[project.optional-dependencies]
@@ -69,6 +72,12 @@ filterwarnings = [
6972
# Suppress AsyncMock coroutine warnings - these are test artifacts from unittest.mock
7073
# framework internals during garbage collection, not actual code issues
7174
"ignore:coroutine.*was never awaited:RuntimeWarning:unittest.mock",
75+
# Suppress websockets deprecation warnings from uvicorn (third-party dependency issue)
76+
"ignore:.*websockets.legacy is deprecated.*:DeprecationWarning",
77+
"ignore:.*WebSocketServerProtocol is deprecated.*:DeprecationWarning",
78+
# Suppress third-party library deprecation warnings
79+
"ignore:Jupyter is migrating its paths.*:DeprecationWarning:jupyter_client",
80+
"ignore:.*sentry_sdk.Hub.*is deprecated.*:DeprecationWarning",
7281
]
7382

7483
[tool.ruff.lint.per-file-ignores]

application/backend/src/api/dependencies.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Annotated
33
from uuid import UUID
44

5-
from fastapi import Depends, HTTPException, Request, status, Form
5+
from fastapi import Depends, Form, HTTPException, Request, status
66

77
from core import Scheduler
88
from services import (
@@ -103,42 +103,46 @@ def is_valid_uuid(identifier: str) -> bool:
103103
return True
104104

105105

106-
def get_uuid(identifier: str, name: str = "DIO") -> UUID:
106+
def get_uuid(identifier: str, name: str) -> UUID:
107107
"""Initializes and validates a source ID"""
108108
if not is_valid_uuid(identifier):
109109
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=f"Invalid {name} ID")
110110
return UUID(identifier)
111111

112112

113-
def get_source_id(source_id: str) -> UUID:
113+
async def get_source_id(source_id: str) -> UUID:
114114
"""Initializes and validates a source ID"""
115115
if not is_valid_uuid(source_id):
116116
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid source ID")
117117
return UUID(source_id)
118118

119119

120-
def get_sink_id(sink_id: str) -> UUID:
120+
async def get_sink_id(sink_id: str) -> UUID:
121121
"""Initializes and validates a sink ID"""
122122
if not is_valid_uuid(sink_id):
123123
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid sink ID")
124124
return UUID(sink_id)
125125

126126

127-
def get_project_id(project_id: str) -> UUID:
127+
async def get_project_id(project_id: str) -> UUID:
128128
"""Initializes and validates a project ID"""
129129
return get_uuid(project_id, "project")
130130

131131

132-
def get_media_id(media_id: str) -> UUID:
132+
async def get_media_id(media_id: str) -> UUID:
133133
"""Initializes and validates a media ID"""
134134
return get_uuid(media_id, "media")
135135

136136

137-
def get_model_id(model_id: str) -> UUID:
137+
async def get_model_id(model_id: str) -> UUID:
138138
"""Initializes and validates a media ID"""
139139
return get_uuid(model_id, "model")
140140

141141

142+
async def get_job_id(job_id: str) -> UUID:
143+
"""Initializes and validates a job ID"""
144+
return get_uuid(job_id, "job")
145+
142146
async def get_webrtc_manager(request: Request) -> WebRTCManager:
143147
"""Provides the global WebRTCManager instance from FastAPI application's state."""
144148
return request.app.state.webrtc_manager

application/backend/src/api/endpoints/job_endpoints.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
# Copyright (C) 2025 Intel Corporation
22
# SPDX-License-Identifier: Apache-2.0
33

4-
import logging
54
from typing import Annotated
5+
from uuid import UUID
66

77
from fastapi import APIRouter, Body, Depends
8+
from fastapi.responses import StreamingResponse
89

9-
from api.dependencies import get_job_service
10+
from api.dependencies import get_job_id, get_job_service
1011
from api.endpoints import API_PREFIX
1112
from pydantic_models import JobList
1213
from pydantic_models.job import JobSubmitted, TrainJobPayload
1314
from services import JobService
1415

15-
logger = logging.getLogger(__name__)
16-
1716
job_api_prefix_url = API_PREFIX + "/jobs"
1817
job_router = APIRouter(
1918
prefix=job_api_prefix_url,
@@ -34,3 +33,12 @@ async def submit_train_job(
3433
) -> JobSubmitted:
3534
"""Endpoint to submit a training job"""
3635
return await job_service.submit_train_job(payload=payload)
36+
37+
38+
@job_router.get("/{job_id}/logs")
39+
async def get_job_logs(
40+
job_id: Annotated[UUID, Depends(get_job_id)],
41+
job_service: Annotated[JobService, Depends(get_job_service)],
42+
) -> StreamingResponse:
43+
"""Endpoint to get the logs of a job by its ID"""
44+
return StreamingResponse(job_service.stream_logs(job_id=job_id), media_type="text/event-stream")

application/backend/src/api/endpoints/media_endpoints.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Copyright (C) 2025 Intel Corporation
22
# SPDX-License-Identifier: Apache-2.0
33

4-
import logging
54
from typing import Annotated
65
from uuid import UUID
76

@@ -14,8 +13,6 @@
1413
from pydantic_models import Media, MediaList
1514
from services.media_service import MediaService
1615

17-
logger = logging.getLogger(__name__)
18-
1916
media_api_prefix_url = API_PREFIX + "/projects/{project_id}"
2017
media_router = APIRouter(
2118
prefix=media_api_prefix_url,

application/backend/src/api/endpoints/model_endpoints.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
# Copyright (C) 2025 Intel Corporation
22
# SPDX-License-Identifier: Apache-2.0
3-
import logging
43
from typing import Annotated
54
from uuid import UUID
65

7-
from fastapi import APIRouter, Depends, Request, UploadFile, HTTPException, status
6+
from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile, status
87

9-
from api.dependencies import get_model_id, get_model_service, get_project_id, get_device_name
8+
from api.dependencies import get_device_name, get_model_id, get_model_service, get_project_id
109
from api.endpoints.project_endpoints import project_api_prefix_url
1110
from api.media_rest_validator import MediaRestValidator
1211
from exceptions import ResourceNotFoundException
@@ -15,8 +14,6 @@
1514
from services import ModelService
1615
from services.exceptions import DeviceNotFoundError
1716

18-
logger = logging.getLogger(__name__)
19-
2017
model_api_prefix_url = project_api_prefix_url + "/{project_id}/models"
2118
model_router = APIRouter(
2219
prefix=model_api_prefix_url,

application/backend/src/api/endpoints/pipeline_endpoints.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
"""Endpoints for managing pipelines"""
55

6-
import logging
76
from typing import Annotated
87
from uuid import UUID
98

@@ -17,7 +16,6 @@
1716
from pydantic_models.pipeline import Pipeline, PipelineStatus
1817
from services import PipelineService
1918

20-
logger = logging.getLogger(__name__)
2119
router = APIRouter(prefix="/api/projects/{project_id}/pipeline", tags=["Pipelines"])
2220

2321
UPDATE_PIPELINE_BODY_DESCRIPTION = """

application/backend/src/api/endpoints/project_endpoints.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Copyright (C) 2025 Intel Corporation
22
# SPDX-License-Identifier: Apache-2.0
33

4-
import logging
54
from typing import Annotated
65
from uuid import UUID
76

@@ -12,8 +11,6 @@
1211
from pydantic_models import Project, ProjectList
1312
from services import ProjectService
1413

15-
logger = logging.getLogger(__name__)
16-
1714
project_api_prefix_url = API_PREFIX + "/projects"
1815
project_router = APIRouter(
1916
prefix=project_api_prefix_url,

application/backend/src/api/endpoints/sink_endpoints.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
"""Endpoints for managing pipeline sinks"""
55

6-
import logging
76
from typing import Annotated
87
from uuid import UUID
98

@@ -18,7 +17,6 @@
1817
from pydantic_models.sink import SinkAdapter
1918
from services import ConfigurationService, ResourceAlreadyExistsError, ResourceInUseError, ResourceNotFoundError
2019

21-
logger = logging.getLogger(__name__)
2220
router = APIRouter(prefix="/api/sinks", tags=["Sinks"])
2321

2422
CREATE_SINK_BODY_DESCRIPTION = """

application/backend/src/api/endpoints/source_endpoints.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
"""Endpoints for managing pipeline sources"""
55

6-
import logging
76
from typing import Annotated
87
from uuid import UUID
98

@@ -18,7 +17,6 @@
1817
from pydantic_models.source import SourceAdapter
1918
from services import ConfigurationService, ResourceAlreadyExistsError, ResourceInUseError, ResourceNotFoundError
2019

21-
logger = logging.getLogger(__name__)
2220
router = APIRouter(prefix="/api/sources", tags=["Sources"])
2321

2422
CREATE_SOURCE_BODY_DESCRIPTION = """

0 commit comments

Comments
 (0)