QTZPOC-20

QTZPOC-20: Implement structured logging with metadata for repository, worker, and OPC activities.
This commit is contained in:
2026-09-10 14:15:42 -03:00
parent 4cccc45c34
commit 6c0d178f99
5 changed files with 60 additions and 41 deletions

View File

@@ -27,25 +27,27 @@ from laborious.utils.repository.model_repository import (
@patch('laborious.utils.repository.model_repository.gc')
def test_force_memory_release_success(gc, ctypes):
logger = MagicMock()
metadata = {'model_name': 'my-model'}
force_memory_release(logger)
force_memory_release(logger, metadata)
gc.collect.assert_called_once()
ctypes.CDLL.return_value.malloc_trim.assert_called_once_with(0)
logger.info.assert_called_once_with('Memory released')
logger.custom_info.assert_called_once_with('Memory released', metadata)
@patch('laborious.utils.repository.model_repository.ctypes')
@patch('laborious.utils.repository.model_repository.gc')
def test_force_memory_release_error(gc, ctypes):
logger = MagicMock()
metadata = {'model_name': 'my-model'}
ctypes.CDLL.return_value.malloc_trim.side_effect = Exception('error')
force_memory_release(logger)
force_memory_release(logger, metadata)
gc.collect.assert_called_once()
ctypes.CDLL.return_value.malloc_trim.assert_called_once_with(0)
logger.info.assert_called_once_with('Memory release failed: error')
logger.custom_info.assert_called_once_with('Memory release failed: error', metadata)
@pytest.fixture
@@ -807,7 +809,7 @@ def test_check_cache_retention_true(datetime_mock, mlflow_repository):
def test_handle_valid_model(mlflow_repository):
cache = {'target': {'model': 'model', 'artifact_path': 'test_artifact_path'}}
output = mlflow_repository.handle_valid_model('model_name', cache)
output = mlflow_repository.handle_valid_model('model_name', cache, {})
assert output == {'model': 'model', 'artifact_path': 'test_artifact_path'}
@@ -817,7 +819,7 @@ def test_handle_outdated_model(mlflow_repository):
'target': {'model': 'model', 'artifact_path': 'test_artifact_path'}
}
}
mlflow_repository.handle_outdated_model('model_name', 'model_name_transform')
mlflow_repository.handle_outdated_model('model_name', 'model_name_transform', {})
assert mlflow_repository.model_cache == {}
@@ -857,7 +859,9 @@ async def test_get_model_cached_valid(mlflow_repository):
)
mlflow_repository.handle_valid_model.assert_called_once_with(
model_name='model_name', cache=mlflow_repository.model_cache['model_name_predict']
model_name='model_name',
cache=mlflow_repository.model_cache['model_name_predict'],
metadata={},
)
mlflow_repository.handle_outdated_model.assert_not_called()
@@ -887,7 +891,7 @@ async def test_get_model_cached_outdated(mlflow_repository):
)
mlflow_repository.handle_valid_model.assert_not_called()
mlflow_repository.handle_outdated_model.assert_called_once_with(
model_name='model_name', model_key='model_name_predict'
model_name='model_name', model_key='model_name_predict', metadata={}
)
@@ -916,7 +920,7 @@ async def test_get_cached_operation_retention_0(force_memory_release, mlflow_rep
'model_name', data, 'transform', 0, 'sklearn', {}
)
assert output == model.predict.return_value
force_memory_release.assert_called_once_with(mlflow_repository.logger)
force_memory_release.assert_called_once_with(mlflow_repository.logger, {})
@patch('laborious.utils.repository.model_repository.force_memory_release')
@@ -1316,7 +1320,7 @@ async def test_create_new_experiment(
]
)
force_memory_release.assert_called_once_with(mlflow_repository.logger)
force_memory_release.assert_called_once_with(mlflow_repository.logger, metadata['metadata'])
assert report == {
'run_id': mlflow.start_run.return_value.__enter__.return_value.info.run_id,

View File

@@ -210,7 +210,7 @@ class TestMainHappyPath:
@patch('laborious.worker.worker.metrics.APP_UP')
@patch('laborious.worker.worker.start_http_server')
def test_start_prometheus_server_marks_the_app_up(mock_start_http_server, mock_app_up):
start_prometheus_server()
start_prometheus_server(MagicMock(), {})
mock_start_http_server.assert_called_once()
mock_app_up.labels.return_value.set.assert_called_once_with(1)
@@ -224,7 +224,7 @@ def test_start_prometheus_server_exits_the_process_on_failure(
):
mock_start_http_server.side_effect = OSError('port in use')
start_prometheus_server()
start_prometheus_server(MagicMock(), {})
mock_os_exit.assert_called_once_with(1)
mock_app_up.labels.return_value.set.assert_not_called()
@@ -238,6 +238,6 @@ def test_start_prometheus_server_reads_the_configured_port(
):
monkeypatch.setenv('HTTP_METRICS_PORT', port_env)
start_prometheus_server()
start_prometheus_server(MagicMock(), {})
mock_start_http_server.assert_called_once_with(int(port_env))