Skip to content

Commit 8fda5f7

Browse files
authored
Add device_name tag (#6332)
* Add device_name tag This adds a new tag which only contains the base part of the device, for compatibility with iostats check. * Fix linux tests * Handle windows * Refactor helper
1 parent 25ee461 commit 8fda5f7

3 files changed

Lines changed: 53 additions & 10 deletions

File tree

disk/datadog_checks/disk/disk.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,19 @@
1616
from datadog_checks.base.utils.subprocess_output import SubprocessOutputEmptyError, get_subprocess_output
1717
from datadog_checks.base.utils.timeout import TimeoutException, timeout
1818

19-
# See: https://github.com/DataDog/integrations-core/pull/1109#discussion_r167133580
20-
IGNORE_CASE = re.I if platform.system() == 'Windows' else 0
19+
if platform.system() == 'Windows':
20+
# See: https://github.com/DataDog/integrations-core/pull/1109#discussion_r167133580
21+
IGNORE_CASE = re.I
22+
23+
def _base_device_name(device):
24+
return device.strip('\\').lower()
25+
26+
27+
else:
28+
IGNORE_CASE = 0
29+
30+
def _base_device_name(device):
31+
return os.path.basename(device)
2132

2233

2334
class Disk(AgentCheck):
@@ -105,6 +116,7 @@ def check(self, instance):
105116
device_name = device_name.strip('\\').lower()
106117

107118
tags.append('device:{}'.format(device_name))
119+
tags.append('device_name:{}'.format(_base_device_name(part.device)))
108120
for metric_name, metric_value in iteritems(self._collect_part_metrics(part, disk_usage)):
109121
self.gauge(metric_name, metric_value, tags=tags)
110122

@@ -250,6 +262,7 @@ def collect_latency_metrics(self):
250262
write_time_pct = disk.write_time * 100 / 1000
251263
metric_tags = [] if self._custom_tags is None else self._custom_tags[:]
252264
metric_tags.append('device:{}'.format(disk_name))
265+
metric_tags.append('device_name:{}'.format(_base_device_name(disk_name)))
253266
if self.devices_label.get(disk_name):
254267
metric_tags.append(self.devices_label.get(disk_name))
255268
self.rate(self.METRIC_DISK.format('read_time_pct'), read_time_pct, tags=metric_tags)

disk/tests/common.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99

1010
if ON_WINDOWS:
1111
DEFAULT_DEVICE_NAME = 'c:'
12+
DEFAULT_DEVICE_BASE_NAME = 'c:'
1213
DEFAULT_FILE_SYSTEM = 'ntfs'
1314
DEFAULT_MOUNT_POINT = 'c:'
1415
else:
1516
DEFAULT_DEVICE_NAME = '/dev/sda1'
17+
DEFAULT_DEVICE_BASE_NAME = 'sda1'
1618
DEFAULT_FILE_SYSTEM = 'ext4'
1719
DEFAULT_MOUNT_POINT = '/'
1820

disk/tests/test_unit.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from datadog_checks.base.utils.platform import Platform
1212
from datadog_checks.disk import Disk
1313

14-
from .common import DEFAULT_DEVICE_NAME, DEFAULT_FILE_SYSTEM, DEFAULT_MOUNT_POINT
14+
from .common import DEFAULT_DEVICE_BASE_NAME, DEFAULT_DEVICE_NAME, DEFAULT_FILE_SYSTEM, DEFAULT_MOUNT_POINT
1515
from .mocks import MockDiskMetrics, mock_blkid_output
1616

1717

@@ -56,6 +56,7 @@ def test_default(aggregator, gauge_metrics, rate_metrics):
5656
DEFAULT_FILE_SYSTEM,
5757
'filesystem:{}'.format(DEFAULT_FILE_SYSTEM),
5858
'device:{}'.format(DEFAULT_DEVICE_NAME),
59+
'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME),
5960
]
6061
else:
6162
tags = []
@@ -64,7 +65,11 @@ def test_default(aggregator, gauge_metrics, rate_metrics):
6465
aggregator.assert_metric(name, value=value, tags=tags)
6566

6667
for name, value in iteritems(rate_metrics):
67-
aggregator.assert_metric(name, value=value, tags=['device:{}'.format(DEFAULT_DEVICE_NAME)])
68+
aggregator.assert_metric(
69+
name,
70+
value=value,
71+
tags=['device:{}'.format(DEFAULT_DEVICE_NAME), 'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME)],
72+
)
6873

6974
aggregator.assert_all_metrics_covered()
7075

@@ -90,10 +95,18 @@ def test_use_mount(aggregator, instance_basic_mount, gauge_metrics, rate_metrics
9095
c.check(instance_basic_mount)
9196

9297
for name, value in iteritems(gauge_metrics):
93-
aggregator.assert_metric(name, value=value, tags=['device:{}'.format(DEFAULT_MOUNT_POINT)])
98+
aggregator.assert_metric(
99+
name,
100+
value=value,
101+
tags=['device:{}'.format(DEFAULT_MOUNT_POINT), 'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME)],
102+
)
94103

95104
for name, value in iteritems(rate_metrics):
96-
aggregator.assert_metric(name, value=value, tags=['device:{}'.format(DEFAULT_DEVICE_NAME)])
105+
aggregator.assert_metric(
106+
name,
107+
value=value,
108+
tags=['device:{}'.format(DEFAULT_DEVICE_NAME), 'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME)],
109+
)
97110

98111
aggregator.assert_all_metrics_covered()
99112

@@ -115,14 +128,28 @@ def test_device_tagging(aggregator, gauge_metrics, rate_metrics):
115128
c.check(instance)
116129

117130
# Assert metrics
118-
tags = ['type:dev', 'tag:two', 'device:{}'.format(DEFAULT_DEVICE_NAME), 'optional:tags1', 'label:mylab']
131+
tags = [
132+
'type:dev',
133+
'tag:two',
134+
'device:{}'.format(DEFAULT_DEVICE_NAME),
135+
'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME),
136+
'optional:tags1',
137+
'label:mylab',
138+
]
119139

120140
for name, value in iteritems(gauge_metrics):
121141
aggregator.assert_metric(name, value=value, tags=tags)
122142

123143
for name, value in iteritems(rate_metrics):
124144
aggregator.assert_metric(
125-
name, value=value, tags=['device:{}'.format(DEFAULT_DEVICE_NAME), 'optional:tags1', 'label:mylab']
145+
name,
146+
value=value,
147+
tags=[
148+
'device:{}'.format(DEFAULT_DEVICE_NAME),
149+
'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME),
150+
'optional:tags1',
151+
'label:mylab',
152+
],
126153
)
127154

128155
aggregator.assert_all_metrics_covered()
@@ -155,6 +182,7 @@ def test_min_disk_size(aggregator, gauge_metrics, rate_metrics):
155182

156183
for name in rate_metrics:
157184
aggregator.assert_metric_has_tag(name, 'device:{}'.format(DEFAULT_DEVICE_NAME))
185+
aggregator.assert_metric_has_tag(name, 'device_name:{}'.format(DEFAULT_DEVICE_BASE_NAME))
158186

159187
aggregator.assert_all_metrics_covered()
160188

@@ -168,7 +196,7 @@ def test_labels_from_blkid_cache_file(aggregator, instance_blkid_cache_file, gau
168196
c = Disk('disk', {}, [instance_blkid_cache_file])
169197
c.check(instance_blkid_cache_file)
170198
for metric in chain(gauge_metrics, rate_metrics):
171-
aggregator.assert_metric(metric, tags=['device:/dev/sda1', 'label:MYLABEL'])
199+
aggregator.assert_metric(metric, tags=['device:/dev/sda1', 'device_name:sda1', 'label:MYLABEL'])
172200

173201

174202
@pytest.mark.skipif(not Platform.is_linux(), reason='disk labels are only available on Linux')
@@ -182,4 +210,4 @@ def test_blkid_cache_file_contains_no_labels(
182210
c = Disk('disk', {}, [instance_blkid_cache_file_no_label])
183211
c.check(instance_blkid_cache_file_no_label)
184212
for metric in chain(gauge_metrics, rate_metrics):
185-
aggregator.assert_metric(metric, tags=['device:/dev/sda1'])
213+
aggregator.assert_metric(metric, tags=['device:/dev/sda1', 'device_name:sda1'])

0 commit comments

Comments
 (0)