Skip to content

Commit e537a96

Browse files
committed
Improved logging for RAPL permission issues and fixed tests
1 parent 335efe3 commit e537a96

File tree

5 files changed

+29
-27
lines changed

5 files changed

+29
-27
lines changed

carbontracker/components/component.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def collect_power_usage(self, epoch: int):
106106
# Only raise error if no measurements have been collected.
107107
if not self.power_usages[-1]:
108108
self.logger.err_critical(
109-
f"Could not read CPU/DRAM energy consumption due to lack of read-permissions.\n\tPlease run the following command(s): \n\t\t{"\n\t\t".join(commands)}"
109+
r"Could not read CPU/DRAM energy consumption due to lack of read-permissions.\n\tPlease run the following command(s): \n\t\t" + r"\n\t\t".join(commands)
110110
)
111111
# Append zero measurement to avoid further errors.
112112
self.power_usages.append([0])

carbontracker/exceptions.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import List
2+
13
class NoComponentsAvailableError(Exception):
24
def __init__(
35
self,
@@ -23,7 +25,7 @@ def __init__(self, expected_unit, received_unit, message):
2325
class IntelRaplPermissionError(Exception):
2426
"""Raised when an Intel RAPL permission error occurs."""
2527

26-
def __init__(self, file_names: list[str]):
28+
def __init__(self, file_names: List[str]):
2729
self.file_names = file_names
2830

2931

tests/components/test_intel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def test_available(self, mock_listdir, mock_exists):
1212
mock_exists.return_value = True
1313
mock_listdir.return_value = ["some_directory"]
1414

15-
component = Component(name='cpu', pids=[], devices_by_pid={})
15+
component = Component(name='cpu', pids=[], devices_by_pid={}, logger=None)
1616
self.assertTrue(component.available())
1717

1818
@patch("os.path.exists")
@@ -35,7 +35,7 @@ def test_available_false(self, mock_available, mock_listdir, mock_exists):
3535
mock_exists.return_value = False
3636
mock_listdir.return_value = []
3737

38-
cpu = Component(name='cpu', pids=[], devices_by_pid={})
38+
cpu = Component(name='cpu', pids=[], devices_by_pid={}, logger=None)
3939
self.assertFalse(cpu.available())
4040

4141
@patch("time.sleep")

tests/test_component.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,23 @@ class TestComponent(unittest.TestCase):
2424
def test_init_valid_component(
2525
self, mock_handlers_by_name, mock_error_by_name, mock_component_names
2626
):
27-
component = Component(name="gpu", pids=[], devices_by_pid=False)
27+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
2828
self.assertEqual(component.name, "gpu")
2929
self.assertEqual(component._handler, mock_handlers_by_name()[0]())
3030

3131
def test_init_invalid_component(self):
3232
with self.assertRaises(exceptions.ComponentNameError):
33-
Component(name="unknown", pids=[], devices_by_pid=False)
33+
Component(name="unknown", pids=[], devices_by_pid=False, logger=None)
3434

3535
def test_devices(self):
3636
handler_mock = MagicMock(devices=MagicMock(return_value=["Test GPU"]))
37-
component = Component(name="gpu", pids=[], devices_by_pid=False)
37+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
3838
component._handler = handler_mock
3939
self.assertEqual(component.devices(), ["Test GPU"])
4040

4141
def test_available_true(self):
4242
handler_mock = MagicMock(available=MagicMock(return_value=True))
43-
component = Component(name="gpu", pids=[], devices_by_pid=False)
43+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
4444
component._handler = handler_mock
4545
self.assertTrue(component.available())
4646

@@ -52,33 +52,33 @@ def test_available_true(self):
5252
return_value=False,
5353
)
5454
def test_available_false(self, mock_apple_gpu_available, mock_nvidia_gpu_available):
55-
component = Component(name="gpu", pids=[], devices_by_pid=False)
55+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
5656
self.assertFalse(component.available())
5757

5858
def test_collect_power_usage_no_measurement(self):
5959
handler_mock = MagicMock(
60-
power_usage=MagicMock(side_effect=exceptions.IntelRaplPermissionError)
60+
power_usage=MagicMock(side_effect=exceptions.IntelRaplPermissionError(file_names=["file1", "file2"]))
6161
)
62-
component = Component(name="cpu", pids=[], devices_by_pid=False)
62+
component = Component(name="cpu", pids=[], devices_by_pid=False, logger=MagicMock(err_critical=MagicMock()))
6363
component._handler = handler_mock
6464
component.collect_power_usage(epoch=1)
6565
self.assertEqual(component.power_usages, [[], [0]])
6666

6767
def test_collect_power_usage_with_measurement(self):
6868
handler_mock = MagicMock(power_usage=MagicMock(return_value=[1000]))
69-
component = Component(name="cpu", pids=[], devices_by_pid=False)
69+
component = Component(name="cpu", pids=[], devices_by_pid=False, logger=None)
7070
component._handler = handler_mock
7171
component.collect_power_usage(epoch=1)
7272
self.assertEqual(component.power_usages, [[1000]])
7373

7474
def test_collect_power_usage_with_measurement_but_no_epoch(self):
75-
power_collector = Component(name="cpu", pids=[], devices_by_pid=False)
75+
power_collector = Component(name="cpu", pids=[], devices_by_pid=False, logger=None)
7676
power_collector._handler = MagicMock(power_usage=MagicMock(return_value=[1000]))
7777
power_collector.collect_power_usage(epoch=0)
7878
assert len(power_collector.power_usages) == 0
7979

8080
def test_collect_power_usage_with_previous_measurement(self):
81-
power_collector = Component(name="cpu", pids=[], devices_by_pid=False)
81+
power_collector = Component(name="cpu", pids=[], devices_by_pid=False, logger=None)
8282
power_collector._handler = MagicMock(power_usage=MagicMock(return_value=[1000]))
8383
power_collector.collect_power_usage(epoch=1)
8484
power_collector.collect_power_usage(epoch=3)
@@ -88,13 +88,13 @@ def test_collect_power_usage_GPUPowerUsageRetrievalError(self):
8888
handler_mock = MagicMock(
8989
power_usage=MagicMock(side_effect=exceptions.GPUPowerUsageRetrievalError)
9090
)
91-
component = Component(name="gpu", pids=[], devices_by_pid=False)
91+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=MagicMock(err_critical=MagicMock()))
9292
component._handler = handler_mock
9393
component.collect_power_usage(epoch=1)
9494
self.assertEqual(component.power_usages, [[], [0]])
9595

9696
def test_energy_usage(self):
97-
component = Component(name="cpu", pids=[], devices_by_pid=False)
97+
component = Component(name="cpu", pids=[], devices_by_pid=False, logger=None)
9898
component.power_usages = [[1000], [2000], [3000]]
9999
epoch_times = [1, 2, 3]
100100
energy_usages = component.energy_usage(epoch_times)
@@ -104,14 +104,14 @@ def test_energy_usage(self):
104104
self.assertTrue(np.all(np.array(energy_usages) > 0))
105105

106106
def test_energy_usage_no_measurements(self):
107-
component = Component(name="cpu", pids=[], devices_by_pid=False)
107+
component = Component(name="cpu", pids=[], devices_by_pid=False, logger=None)
108108
component.power_usages = [[]]
109109
epoch_times = [1]
110110
energy_usages = component.energy_usage(epoch_times)
111111
self.assertEqual(energy_usages, [0])
112112

113113
def test_energy_usage_with_power_from_later_epoch(self):
114-
component = Component(name="cpu", pids=[], devices_by_pid=False)
114+
component = Component(name="cpu", pids=[], devices_by_pid=False, logger=None)
115115
component.power_usages = [[1000], [2000], [3000]]
116116
epoch_times = [1, 2, 3, 4]
117117
energy_usages = component.energy_usage(epoch_times)
@@ -121,7 +121,7 @@ def test_energy_usage_with_power_from_later_epoch(self):
121121
)
122122

123123
def test_energy_usage_no_power(self):
124-
component = Component(name="cpu", pids=[], devices_by_pid=False)
124+
component = Component(name="cpu", pids=[], devices_by_pid=False, logger=None)
125125
component.power_usages = [[], [], [], [], []]
126126
epoch_times = [1, 2, 3, 4, 5]
127127
energy_usages = component.energy_usage(epoch_times)
@@ -132,7 +132,7 @@ def test_energy_usage_no_power(self):
132132

133133
def test_init(self):
134134
handler_mock = MagicMock()
135-
component = Component(name="gpu", pids=[], devices_by_pid=False)
135+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
136136
component._handler = handler_mock
137137
component.init()
138138
handler_mock.init.assert_called_once()
@@ -144,15 +144,15 @@ def test_init(self):
144144

145145
def test_shutdown(self):
146146
handler_mock = MagicMock()
147-
component = Component(name="gpu", pids=[], devices_by_pid=False)
147+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
148148
component._handler = handler_mock
149149
component.shutdown()
150150
handler_mock.shutdown.assert_called_once()
151151

152152
def test_create_components(self):
153-
gpu = create_components("gpu", pids=[], devices_by_pid=False)
154-
cpu = create_components("cpu", pids=[], devices_by_pid=False)
155-
all_components = create_components("all", pids=[], devices_by_pid=False)
153+
gpu = create_components("gpu", pids=[], devices_by_pid=False, logger=None)
154+
cpu = create_components("cpu", pids=[], devices_by_pid=False, logger=None)
155+
all_components = create_components("all", pids=[], devices_by_pid=False, logger=None)
156156
self.assertEqual(len(gpu), 1)
157157
self.assertEqual(len(cpu), 1)
158158
self.assertEqual(len(all_components), 2)
@@ -166,12 +166,12 @@ def test_error_by_name(self):
166166
)
167167

168168
def test_handler_property_with_handler_set(self):
169-
component = Component(name="gpu", pids=[], devices_by_pid=False)
169+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
170170
component._handler = "test"
171171
self.assertEqual(component.handler, "test")
172172

173173
def test_handler_property_without_handler(self):
174-
component = Component(name="gpu", pids=[], devices_by_pid=False)
174+
component = Component(name="gpu", pids=[], devices_by_pid=False, logger=None)
175175
component._handler = None
176176
with self.assertRaises(exceptions.GPUError):
177177
component.handler()

tests/test_exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def test_unit_error(self):
1212

1313
def test_intel_rapl_permission_error(self):
1414
with self.assertRaises(exceptions.IntelRaplPermissionError):
15-
raise exceptions.IntelRaplPermissionError
15+
raise exceptions.IntelRaplPermissionError(file_names=["file1", "file2"])
1616

1717
def test_gpu_power_usage_retrieval_error(self):
1818
with self.assertRaises(exceptions.GPUPowerUsageRetrievalError):

0 commit comments

Comments
 (0)