diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b610592700..d6580e638d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -6,6 +6,7 @@ CHANGELOG ========= * feature: Local Mode: Add support for Batch Inference +* feature: Add timestamp to secondary status in training job output 1.11.2 ====== diff --git a/src/sagemaker/utils.py b/src/sagemaker/utils.py index c190987c31..4e70d01790 100644 --- a/src/sagemaker/utils.py +++ b/src/sagemaker/utils.py @@ -181,18 +181,17 @@ def secondary_training_status_message(job_description, prev_description): if prev_description_secondary_transitions is not None else 0 current_transitions = job_description['SecondaryStatusTransitions'] - if len(current_transitions) == prev_transitions_num: - return current_transitions[-1]['StatusMessage'] - else: - transitions_to_print = current_transitions[prev_transitions_num - len(current_transitions):] - status_strs = [] - for transition in transitions_to_print: - message = transition['StatusMessage'] - time_str = datetime.utcfromtimestamp( - time.mktime(transition['StartTime'].timetuple())).strftime('%Y-%m-%d %H:%M:%S') - status_strs.append('{} {} - {}'.format(time_str, transition['Status'], message)) - - return '\n'.join(status_strs) + transitions_to_print = current_transitions[-1:] if len(current_transitions) == prev_transitions_num else \ + current_transitions[prev_transitions_num - len(current_transitions):] + + status_strs = [] + for transition in transitions_to_print: + message = transition['StatusMessage'] + time_str = datetime.utcfromtimestamp( + time.mktime(job_description['LastModifiedTime'].timetuple())).strftime('%Y-%m-%d %H:%M:%S') + status_strs.append('{} {} - {}'.format(time_str, transition['Status'], message)) + + return '\n'.join(status_strs) def download_folder(bucket_name, prefix, target, sagemaker_session): diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 0caa7ae6df..14dcff4a96 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -146,7 +146,7 @@ def test_secondary_training_status_changed_empty(): def test_secondary_training_status_message_status_changed(): now = datetime.now() - TRAINING_JOB_DESCRIPTION_1['SecondaryStatusTransitions'][-1]['StartTime'] = now + TRAINING_JOB_DESCRIPTION_1['LastModifiedTime'] = now expected = '{} {} - {}'.format( datetime.utcfromtimestamp(time.mktime(now.timetuple())).strftime('%Y-%m-%d %H:%M:%S'), STATUS, @@ -157,13 +157,18 @@ def test_secondary_training_status_message_status_changed(): def test_secondary_training_status_message_status_not_changed(): now = datetime.now() - TRAINING_JOB_DESCRIPTION_1['SecondaryStatusTransitions'][-1]['StartTime'] = now - assert secondary_training_status_message(TRAINING_JOB_DESCRIPTION_1, TRAINING_JOB_DESCRIPTION_2) == MESSAGE + TRAINING_JOB_DESCRIPTION_1['LastModifiedTime'] = now + expected = '{} {} - {}'.format( + datetime.utcfromtimestamp(time.mktime(now.timetuple())).strftime('%Y-%m-%d %H:%M:%S'), + STATUS, + MESSAGE + ) + assert secondary_training_status_message(TRAINING_JOB_DESCRIPTION_1, TRAINING_JOB_DESCRIPTION_2) == expected def test_secondary_training_status_message_prev_missing(): now = datetime.now() - TRAINING_JOB_DESCRIPTION_1['SecondaryStatusTransitions'][-1]['StartTime'] = now + TRAINING_JOB_DESCRIPTION_1['LastModifiedTime'] = now expected = '{} {} - {}'.format( datetime.utcfromtimestamp(time.mktime(now.timetuple())).strftime('%Y-%m-%d %H:%M:%S'), STATUS,