Skip to content

Commit

Permalink
Add space metrics for storage center.
Browse files Browse the repository at this point in the history
  • Loading branch information
jiuka committed Jul 4, 2024
1 parent ab825ba commit 63994fd
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 12 deletions.
28 changes: 28 additions & 0 deletions agent_based/dell_storage_center.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
from typing import NamedTuple
from cmk.agent_based.v2 import (
AgentSection,
check_levels,
CheckPlugin,
Metric,
render,
Result,
Service,
State,
Expand All @@ -49,6 +51,9 @@ class StorageCenter(NamedTuple):
numberOfReplications: int
numberOfServers: int
numberOfVolumes: int
spaceAvailable: int
spaceAllocated: int
spaceUsed: int


def parse_dell_storage_center(string_table):
Expand Down Expand Up @@ -77,6 +82,29 @@ def check_dell_storage_center(item, section):
yield Result(state=State.OK, summary=f'ST: {sc.serviceTag}')
yield Result(state=State.OK, summary=f'SN: {sc.serialNumber}')

yield from check_levels(
value=float(sc.spaceAvailable),
metric_name='space_available',
label='Available',
render_func=render.disksize
)

yield from check_levels(
value=float(sc.spaceUsed),
metric_name='space_used',
boundaries=(0, float(sc.spaceAllocated)),
label='Used',
render_func=render.disksize
)

yield from check_levels(
value=float(sc.spaceAllocated),
metric_name='space_allocated',
boundaries=(0, float(sc.spaceAvailable)),
label='Allocated',
render_func=render.disksize
)

yield Metric('controller', float(sc.numberOfControllers))
yield Metric('device', float(sc.numberOfDevicesInUse))
yield Metric('disk', float(sc.numberOfDisks))
Expand Down
50 changes: 40 additions & 10 deletions graphing/dell_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,27 @@
color=metrics.Color.GREEN,
)

metric_dell_storage_center_space_available = metrics.Metric(
name='space_available',
title=Title('Space Available'),
unit=metrics.Unit(metrics.SINotation("bytes")),
color=metrics.Color.LIGHT_BLUE,
)

metric_dell_storage_center_space_allocated = metrics.Metric(
name='space_allocated',
title=Title('Space Allocated'),
unit=metrics.Unit(metrics.SINotation("bytes")),
color=metrics.Color.LIGHT_GREEN,
)

metric_dell_storage_center_space_used = metrics.Metric(
name='space_used',
title=Title('Space Used'),
unit=metrics.Unit(metrics.SINotation("bytes")),
color=metrics.Color.GREEN,
)

metric_dell_storage_center_live_volume = metrics.Metric(
name='dell_storage_center_live_volume',
title=Title('Live Volumes'),
Expand Down Expand Up @@ -92,6 +113,18 @@
],
)

graph_dell_storage_center_space = graphs.Graph(
name='dell_storage_center_space',
title=Title('Storage Center Space'),
compound_lines=[
'space_used',
],
simple_lines=[
'space_available',
'space_allocated',
],
)

graph_dell_storage_disk_usage = graphs.Graph(
name='dell_storage_disk_usage',
title=Title('Disk usage'),
Expand All @@ -106,16 +139,13 @@
compound_lines=['dell_storage_volume_usage'],
)

perfometer_dell_storage_center = perfometers.Stacked(
perfometer_dell_storage_center = perfometers.Perfometer(
name='dell_storage_center',
upper=perfometers.Perfometer(
name='dell_storage_center_disk',
focus_range=perfometers.FocusRange(perfometers.Closed(0), perfometers.Open(10)),
segments=['dell_storage_center_disk'],
),
lower=perfometers.Perfometer(
name='dell_storage_center_volume',
focus_range=perfometers.FocusRange(perfometers.Closed(0), perfometers.Open(10)),
segments=['dell_storage_center_volume'],
focus_range=perfometers.FocusRange(
perfometers.Closed(0),
perfometers.Closed('space_available')
),
segments=[
'space_used',
],
)
18 changes: 18 additions & 0 deletions lib/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@
LOGGING = logging.getLogger('agent_dell_storage')


class BytesString:
def __init__(self, value):
self.value = value.split(' ')[0]

def __str__(self):
return self.value


class DellStorageApiParser:
@staticmethod
def temperature(value):
Expand Down Expand Up @@ -182,6 +190,7 @@ class StorageCenter(ApiObject):
'objectCount.numberOfDisks', 'objectCount.numberOfLiveVolumes',
'objectCount.numberOfReplays', 'objectCount.numberOfReplications',
'objectCount.numberOfServers', 'objectCount.numberOfVolumes',
'storageUsage.availableSpace', 'storageUsage.allocatedSpace', 'storageUsage.usedSpace'
]

instanceId: str
Expand All @@ -202,6 +211,10 @@ def chassi(self):
def objectCount(self):
return self._get_association(f'/StorageCenter/StorageCenter/{self.instanceId}/ObjectCount')

@cached_property
def storageUsage(self):
return self._get_association(f'/StorageCenter/StorageCenter/{self.instanceId}/StorageUsage')

@cached_property
def controllers(self):
return self._get_associations(f'/StorageCenter/StorageCenter/{self.instanceId}/ControllerList')
Expand Down Expand Up @@ -248,6 +261,11 @@ class ScObjectCount(ApiObject):
numberOfServers: int
numberOfVolumes: int

class StorageCenterStorageUsage(ApiObject):
availableSpace: BytesString
allocatedSpace: BytesString
usedSpace: BytesString

class ScController(ApiObject):
AGENT_FIELDS = [
'lastBootTime', 'leader',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"time": "1970-01-01T01:00:00+01:00",
"configuredSpace": "200000000000000 Bytes",
"spareSpace": "7500000000000 Bytes",
"usedSpace": "77000000000000 Bytes",
"allocatedSpace": "95000000000000 Bytes",
"storageAlertThreshold": 10,
"availableSpace": "130000000000000 Bytes",
"systemSpace": "800000000 Bytes",
"badSpace": "0 Bytes",
"savingVsRaidTen": "40000000000000 Bytes",
"storageTypeAllocatedSpace": "95000000000000 Bytes",
"systemRAIDOverheadRatio": 0.0,
"estimatedUsableSpace": "0 Bytes",
"systemDataEfficiencyRatio": 8.96068,
"storageTypeFreeSpace": "17500000000000 Bytes",
"systemDataReductionRatio": 1.41763,
"storageTypeUsedSpace": "77500000000000 Bytes",
"oversubscribedSpace": "40000000000000 Bytes",
"alertThresholdSpace": "120000000000000 Bytes",
"freeSpace": "37500000000000 Bytes",
"scSerialNumber": 123456,
"scName": "SAN",
"instanceId": "123456",
"instanceName": "Storage Center 123456",
"objectType": "StorageCenterStorageUsage"
}
2 changes: 1 addition & 1 deletion tests/integration/lib/test_agent_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def test_AgentDellStorage_main(capsys, api):
assert captured.out.splitlines()[:-1] == '''\
<<<<SAN>>>>
<<<dell_storage_center:sep(59)>>>
SAN;Up;;Sc5000Series;7.3.20.19;ABCD123;123456;0;2;44;0;38;0;8;19
SAN;Up;;Sc5000Series;7.3.20.19;ABCD123;123456;0;2;44;0;38;0;8;19;130000000000000;95000000000000;77000000000000
<<<dell_storage_controller:sep(59)>>>
Bottom Controller;Up;;1970-01-01T01:00:00+01:00;False;Sc5020;7.3.20.19;ABCD123;123-456-789-00;123457
Top Controller;Up;;1970-01-01T01:00:00+01:00;True;Sc5020;7.3.20.19;ABCD123;123-456-789-00;123456
Expand Down
26 changes: 25 additions & 1 deletion tests/unit/agent_based/test_dell_storage_center.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

@pytest.mark.parametrize('string_table, result', [
(
[['SAN', 'Up', '', 'Sc5000Series', '7.3.20.19', 'ABCD123', '987654', '0', '2', '4', '0', '19', '0', '8', '19']],
[['SAN', 'Up', '', 'Sc5000Series', '7.3.20.19', 'ABCD123', '987654', '0', '2', '4', '0', '19', '0', '8', '19', '130000000000000', '100000000000000', '30000000000000']],
[dell_storage_center.StorageCenter(
name='SAN',
status='Up',
Expand All @@ -48,6 +48,9 @@
numberOfReplications='0',
numberOfServers='8',
numberOfVolumes='19',
spaceAvailable='130000000000000',
spaceAllocated='100000000000000',
spaceUsed='30000000000000',
)]
),
])
Expand Down Expand Up @@ -75,6 +78,9 @@ def test_parse_dell_storage_center(string_table, result):
numberOfReplications='0',
numberOfServers='8',
numberOfVolumes='19',
spaceAvailable='130000000000000',
spaceAllocated='100000000000000',
spaceUsed='30000000000000',
)
],
[Service(item='SAN')]
Expand All @@ -97,6 +103,9 @@ def test_parse_dell_storage_center(string_table, result):
numberOfReplications='0',
numberOfServers='8',
numberOfVolumes='19',
spaceAvailable='130000000000000',
spaceAllocated='100000000000000',
spaceUsed='30000000000000',
),
dell_storage_center.StorageCenter(
name='SAN2',
Expand All @@ -114,6 +123,9 @@ def test_parse_dell_storage_center(string_table, result):
numberOfReplications='0',
numberOfServers='8',
numberOfVolumes='19',
spaceAvailable='130000000000000',
spaceAllocated='100000000000000',
spaceUsed='30000000000000',
)
],
[
Expand Down Expand Up @@ -147,6 +159,9 @@ def test_discovery_dell_storage_center(section, result):
numberOfReplications='0',
numberOfServers='8',
numberOfVolumes='19',
spaceAvailable='130000000000000',
spaceAllocated='100000000000000',
spaceUsed='30000000000000',
)
],
[]
Expand All @@ -170,13 +185,22 @@ def test_discovery_dell_storage_center(section, result):
numberOfReplications='10',
numberOfServers='12',
numberOfVolumes='14',
spaceAvailable='130000000000000',
spaceAllocated='100000000000000',
spaceUsed='30000000000000',
)
],
[
Result(state=State.OK, summary='Up'),
Result(state=State.OK, summary='Model: Sc5000Series v7.3.20.19'),
Result(state=State.OK, summary='ST: ABCD123'),
Result(state=State.OK, summary='SN: 987654'),
Result(state=State.OK, summary='Available: 130 TB'),
Metric('space_available', 130000000000000.0),
Result(state=State.OK, summary='Used: 30.0 TB'),
Metric('space_used', 30000000000000.0, boundaries=(0.0, 100000000000000.0)),
Result(state=State.OK, summary='Allocated: 100 TB'),
Metric('space_allocated', 100000000000000.0, boundaries=(0.0, 130000000000000.0)),
Metric('controller', 0),
Metric('device', 2),
Metric('disk', 4),
Expand Down

0 comments on commit 63994fd

Please sign in to comment.