Skip to content

Commit bd48bdc

Browse files
authored
Merge pull request #92 from danabens/metrics-buffering-fix
fix metric buffer not flushing on newline
2 parents 955b7c5 + 221d103 commit bd48bdc

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ var/
2020
.installed.cfg
2121
*.egg
2222
*.gz
23+
.eggs
2324

2425
# Installer logs
2526
pip-log.txt

src/smexperiments/metrics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def log_metric(self, metric_name, value, timestamp=None, iteration_number=None):
5656
if self._closed:
5757
raise SageMakerMetricsWriterException("log_metric called on a closed writer")
5858
elif not self._file:
59-
self._file = open(self._get_metrics_file_path(), "a")
59+
self._file = open(self._get_metrics_file_path(), "a", buffering=1)
6060
self._file.write(json.dumps(raw_metric_data.to_record()))
6161
self._file.write("\n")
6262
else:

tests/unit/test_metrics.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,31 @@ def test_file_metrics_writer_log_metric(timestamp, filepath):
111111
assert 2 == entry_four["IterationNumber"]
112112

113113

114+
def test_file_metrics_writer_flushes_buffer_every_line_log_metric(filepath):
115+
writer = metrics.SageMakerFileMetricsWriter(filepath)
116+
117+
writer.log_metric(metric_name="foo", value=1.0)
118+
119+
lines = [x for x in open(filepath).read().split("\n") if x]
120+
[entry_one] = [json.loads(line) for line in lines]
121+
assert "foo" == entry_one["MetricName"]
122+
assert 1.0 == entry_one["Value"]
123+
124+
writer.log_metric(metric_name="bar", value=2.0)
125+
lines = [x for x in open(filepath).read().split("\n") if x]
126+
[entry_one, entry_two] = [json.loads(line) for line in lines]
127+
assert "bar" == entry_two["MetricName"]
128+
assert 2.0 == entry_two["Value"]
129+
130+
writer.log_metric(metric_name="biz", value=3.0)
131+
lines = [x for x in open(filepath).read().split("\n") if x]
132+
[entry_one, entry_two, entry_three] = [json.loads(line) for line in lines]
133+
assert "biz" == entry_three["MetricName"]
134+
assert 3.0 == entry_three["Value"]
135+
136+
writer.close()
137+
138+
114139
def test_file_metrics_writer_context_manager(timestamp, filepath):
115140
with metrics.SageMakerFileMetricsWriter(filepath) as writer:
116141
writer.log_metric("foo", value=1.0, timestamp=timestamp)

0 commit comments

Comments
 (0)