Skip to content

Commit 46ec318

Browse files
committed
Add tests for timeout
* test_timeout_value which checks that every timeout call is done with the configuration value * test_timeout_warning which checks that a warning is raised when the timeout raises an exception
1 parent 20e90c9 commit 46ec318

2 files changed

Lines changed: 61 additions & 1 deletion

File tree

disk/datadog_checks/disk/disk.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def check(self, instance):
7878

7979
# Get disk metrics here to be able to exclude on total usage
8080
try:
81+
self.log.debug("Check %s", part.mountpoint)
8182
disk_usage = timeout(self._timeout)(psutil.disk_usage)(part.mountpoint)
8283
except TimeoutException:
8384
self.log.warning(

disk/tests/test_unit.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
from six import iteritems
1010

1111
from datadog_checks.base.utils.platform import Platform
12+
from datadog_checks.base.utils.timeout import TimeoutException
1213
from datadog_checks.disk import Disk
1314

1415
from .common import DEFAULT_DEVICE_BASE_NAME, DEFAULT_DEVICE_NAME, DEFAULT_FILE_SYSTEM, DEFAULT_MOUNT_POINT
15-
from .mocks import MockDiskMetrics, mock_blkid_output
16+
from .mocks import MockDiskMetrics, MockPart, mock_blkid_output
1617

1718

1819
def test_default_options():
@@ -212,3 +213,61 @@ def test_blkid_cache_file_contains_no_labels(
212213
c.check(instance_blkid_cache_file_no_label)
213214
for metric in chain(gauge_metrics, rate_metrics):
214215
aggregator.assert_metric(metric, tags=['device:/dev/sda1', 'device_name:sda1'])
216+
217+
218+
@pytest.mark.usefixtures('psutil_mocks')
219+
def test_timeout_config(aggregator, gauge_metrics, rate_metrics):
220+
"""Test timeout configuration value is used on every timeout on the check."""
221+
222+
# Arbitrary value
223+
TIMEOUT_VALUE = 42
224+
instance = {'timeout': TIMEOUT_VALUE}
225+
c = Disk('disk', {}, [instance])
226+
227+
# Mock timeout version
228+
def no_timeout(fun):
229+
return lambda *args: fun(args)
230+
231+
with mock.patch('psutil.disk_partitions', return_value=[MockPart()]), mock.patch(
232+
'datadog_checks.disk.disk.timeout', return_value=no_timeout
233+
) as mock_timeout:
234+
c.check(instance)
235+
236+
mock_timeout.assert_called_with(TIMEOUT_VALUE)
237+
238+
239+
@pytest.mark.usefixtures('psutil_mocks')
240+
def test_timeout_warning(aggregator, gauge_metrics, rate_metrics):
241+
"""Test a warning is raised when there is a Timeout exception."""
242+
243+
# Raise exception for "/faulty" mountpoint
244+
def faulty_timeout(fun):
245+
def f(mountpoint):
246+
if mountpoint == "/faulty":
247+
raise TimeoutException
248+
else:
249+
return fun(mountpoint)
250+
251+
return f
252+
253+
c = Disk('disk', {}, [{}])
254+
c.log = mock.MagicMock()
255+
m = MockDiskMetrics()
256+
m.total = 0
257+
258+
with mock.patch('psutil.disk_partitions', return_value=[MockPart(), MockPart(mountpoint="/faulty")]), mock.patch(
259+
'psutil.disk_usage', return_value=m, __name__='disk_usage'
260+
), mock.patch('datadog_checks.disk.disk.timeout', return_value=faulty_timeout):
261+
c.check({})
262+
263+
# Check that the warning is called once for the faulty disk
264+
c.log.warning.assert_called_once()
265+
266+
for name in gauge_metrics:
267+
aggregator.assert_metric(name, count=0)
268+
269+
for name in rate_metrics:
270+
aggregator.assert_metric_has_tag(name, 'device:{}'.format(DEFAULT_DEVICE_NAME))
271+
aggregator.assert_metric_has_tag(name, 'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME))
272+
273+
aggregator.assert_all_metrics_covered()

0 commit comments

Comments
 (0)