From 65fe26375ea6100c439f1c4ab1fe9c0aecef85a2 Mon Sep 17 00:00:00 2001 From: Luke Gerschwitz Date: Wed, 22 Jan 2025 20:25:49 +1030 Subject: [PATCH 1/3] fix: fix ValueError when updating a data quality monitoring schedule --- src/sagemaker/model_monitor/model_monitoring.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sagemaker/model_monitor/model_monitoring.py b/src/sagemaker/model_monitor/model_monitoring.py index 436377fea5..8160d4bf31 100644 --- a/src/sagemaker/model_monitor/model_monitoring.py +++ b/src/sagemaker/model_monitor/model_monitoring.py @@ -2413,7 +2413,12 @@ def _update_data_quality_monitoring_schedule( ) self.sagemaker_session.sagemaker_client.create_data_quality_job_definition(**request_dict) try: - self._update_monitoring_schedule(new_job_definition_name, schedule_cron_expression) + self._update_monitoring_schedule( + job_definition_name=new_job_definition_name, + schedule_cron_expression=schedule_cron_expression, + data_analysis_start_time=data_analysis_start_time, + data_analysis_end_time=data_analysis_end_time + ) self.job_definition_name = new_job_definition_name if role is not None: self.role = role From cca737ac3ae5d101065eb100d3abcd0f10ce6962 Mon Sep 17 00:00:00 2001 From: Luke Gerschwitz Date: Sat, 1 Feb 2025 16:47:42 +1030 Subject: [PATCH 2/3] Add unit test --- .../model_monitor/model_monitoring.py | 2 +- .../monitor/test_model_monitoring.py | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/sagemaker/model_monitor/model_monitoring.py b/src/sagemaker/model_monitor/model_monitoring.py index 8160d4bf31..3bc29a1cf4 100644 --- a/src/sagemaker/model_monitor/model_monitoring.py +++ b/src/sagemaker/model_monitor/model_monitoring.py @@ -2417,7 +2417,7 @@ def _update_data_quality_monitoring_schedule( job_definition_name=new_job_definition_name, schedule_cron_expression=schedule_cron_expression, data_analysis_start_time=data_analysis_start_time, - data_analysis_end_time=data_analysis_end_time + data_analysis_end_time=data_analysis_end_time, ) self.job_definition_name = new_job_definition_name if role is not None: diff --git a/tests/unit/sagemaker/monitor/test_model_monitoring.py b/tests/unit/sagemaker/monitor/test_model_monitoring.py index d31b9f8527..c0ac8317e8 100644 --- a/tests/unit/sagemaker/monitor/test_model_monitoring.py +++ b/tests/unit/sagemaker/monitor/test_model_monitoring.py @@ -73,6 +73,7 @@ LINFINITY_METHOD = "LInfinity" CRON_DAILY = CronExpressionGenerator.daily() +CRON_NOW = CronExpressionGenerator.now() BASELINING_JOB_NAME = "baselining-job" BASELINE_DATASET_PATH = "/my/local/path/baseline.csv" PREPROCESSOR_PATH = "/my/local/path/preprocessor.py" @@ -1136,6 +1137,36 @@ def _test_data_quality_monitor_update_schedule(data_quality_monitor, sagemaker_s sagemaker_session.sagemaker_client.delete_data_quality_job_definition.assert_not_called() sagemaker_session.sagemaker_client.create_data_quality_job_definition.assert_not_called() + # update schedule + sagemaker_session.describe_monitoring_schedule = MagicMock() + sagemaker_session.sagemaker_client.describe_data_quality_job_definition = MagicMock() + sagemaker_session.sagemaker_client.create_data_quality_job_definition = MagicMock() + + # Test updating monitoring schedule with schedule_cron_expression set to NOW + sagemaker_session.sagemaker_client.update_monitoring_schedule = Mock() + data_quality_monitor.update_monitoring_schedule( + data_analysis_start_time="-PT24H", + data_analysis_end_time="-PT0H", + schedule_cron_expression=CRON_NOW + ) + + sagemaker_session.sagemaker_client.update_monitoring_schedule.assert_called_once_with( + MonitoringScheduleName=data_quality_monitor.monitoring_schedule_name, + MonitoringScheduleConfig={ + "MonitoringJobDefinitionName": data_quality_monitor.job_definition_name, + "MonitoringType": DefaultModelMonitor.monitoring_type(), + "ScheduleConfig": { + "ScheduleExpression": CRON_NOW, + "DataAnalysisStartTime": "-PT24H", + "DataAnalysisEndTime": "-PT0H", + } + }, + ) + + # A new data quality job definition should be created + sagemaker_session.sagemaker_client.describe_data_quality_job_definition.assert_called_once() + sagemaker_session.sagemaker_client.create_data_quality_job_definition.assert_called_once() + # update one property of job definition time.sleep( 0.001 From c38c85fdc26a47c85919c2a69dd61ad9e6cb7840 Mon Sep 17 00:00:00 2001 From: Luke Gerschwitz Date: Tue, 4 Feb 2025 13:21:23 +1030 Subject: [PATCH 3/3] black formatting --- tests/unit/sagemaker/monitor/test_model_monitoring.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/sagemaker/monitor/test_model_monitoring.py b/tests/unit/sagemaker/monitor/test_model_monitoring.py index c0ac8317e8..b338885491 100644 --- a/tests/unit/sagemaker/monitor/test_model_monitoring.py +++ b/tests/unit/sagemaker/monitor/test_model_monitoring.py @@ -1142,12 +1142,12 @@ def _test_data_quality_monitor_update_schedule(data_quality_monitor, sagemaker_s sagemaker_session.sagemaker_client.describe_data_quality_job_definition = MagicMock() sagemaker_session.sagemaker_client.create_data_quality_job_definition = MagicMock() - # Test updating monitoring schedule with schedule_cron_expression set to NOW + # Test updating monitoring schedule with schedule_cron_expression set to NOW sagemaker_session.sagemaker_client.update_monitoring_schedule = Mock() data_quality_monitor.update_monitoring_schedule( data_analysis_start_time="-PT24H", data_analysis_end_time="-PT0H", - schedule_cron_expression=CRON_NOW + schedule_cron_expression=CRON_NOW, ) sagemaker_session.sagemaker_client.update_monitoring_schedule.assert_called_once_with( @@ -1159,7 +1159,7 @@ def _test_data_quality_monitor_update_schedule(data_quality_monitor, sagemaker_s "ScheduleExpression": CRON_NOW, "DataAnalysisStartTime": "-PT24H", "DataAnalysisEndTime": "-PT0H", - } + }, }, )