Skip to content

Commit d1a357c

Browse files
committed
Add storage pool used IOPS metric to resource alerts
1 parent 6d0cc21 commit d1a357c

5 files changed

Lines changed: 49 additions & 3 deletions

File tree

‎plugins/resource-alerts/src/main/java/org/apache/cloudstack/resourcealert/ResourceAlertManagerImpl.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,11 @@ private Double getMetricValue(ResourceAlertRule.ResourceType type, ResourceAlert
288288
VmStats s = statsCollector.getVmStats(resourceId, false);
289289
return s != null ? s.getNetworkWriteKBs() : null;
290290
}
291+
case STORAGE_USED_IOPS: {
292+
// only reported by storage drivers that track IOPS
293+
StorageStats pool = statsCollector.getStoragePoolStats(resourceId);
294+
return pool != null && pool.getUsedIops() != null ? pool.getUsedIops().doubleValue() : null;
295+
}
291296
case VOLUME_SIZE_GB: {
292297
VolumeStats s = getVolumeStats(resourceId);
293298
return s != null ? s.getPhysicalSize() / (1024.0 * 1024.0 * 1024.0) : null;

‎plugins/resource-alerts/src/main/java/org/apache/cloudstack/resourcealert/ResourceAlertMetric.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ public enum ResourceAlertMetric {
3232
NETWORK_READ_KBPS(ResourceAlertRule.ResourceType.VirtualMachine, ResourceAlertRule.ResourceType.Host),
3333
NETWORK_WRITE_KBPS(ResourceAlertRule.ResourceType.VirtualMachine, ResourceAlertRule.ResourceType.Host),
3434
LOAD_AVERAGE(ResourceAlertRule.ResourceType.Host),
35-
VOLUME_SIZE_GB(ResourceAlertRule.ResourceType.Volume);
35+
VOLUME_SIZE_GB(ResourceAlertRule.ResourceType.Volume),
36+
STORAGE_USED_IOPS(ResourceAlertRule.ResourceType.StoragePool);
3637

3738
private final Set<ResourceAlertRule.ResourceType> applicableTypes;
3839

‎plugins/resource-alerts/src/test/java/org/apache/cloudstack/resourcealert/ResourceAlertManagerImplTest.java‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,4 +711,35 @@ public void testVolumeSizeRuleUsesChainInfoForOva() {
711711
verify(statsCollector).getVolumeStats("chain-info");
712712
verify(alertDao, never()).persist(any());
713713
}
714+
715+
private ResourceAlertRuleVO poolIopsRule(double threshold) {
716+
return new ResourceAlertRuleVO("pool-iops", ResourceAlertRule.ResourceType.StoragePool,
717+
POOL_ID, 1L, 1L, "STORAGE_USED_IOPS", AlertCondition.GT, threshold,
718+
AlertSeverity.HIGH, null, false, 600);
719+
}
720+
721+
@Test
722+
public void testStoragePoolIopsRuleFires() {
723+
when(ruleDao.listActive()).thenReturn(Collections.singletonList(poolIopsRule(1000.0)));
724+
StorageStats stats = mock(StorageStats.class);
725+
when(stats.getUsedIops()).thenReturn(5000L);
726+
when(statsCollector.getStoragePoolStats(POOL_ID)).thenReturn(stats);
727+
728+
manager.evaluateRules();
729+
730+
verify(alertDao).persist(alertCaptor.capture());
731+
assertEquals(5000.0, alertCaptor.getValue().getMetricValue(), 0.001);
732+
}
733+
734+
@Test
735+
public void testStoragePoolIopsRuleSkippedWhenDriverDoesNotReportIops() {
736+
when(ruleDao.listActive()).thenReturn(Collections.singletonList(poolIopsRule(1000.0)));
737+
StorageStats stats = mock(StorageStats.class);
738+
when(stats.getUsedIops()).thenReturn(null);
739+
when(statsCollector.getStoragePoolStats(POOL_ID)).thenReturn(stats);
740+
741+
manager.evaluateRules();
742+
743+
verify(alertDao, never()).persist(any());
744+
}
714745
}

‎plugins/resource-alerts/src/test/java/org/apache/cloudstack/resourcealert/ResourceAlertMetricTest.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,12 @@ public void testVolumeSizeAppliesToVolumeOnly() {
8686
assertFalse(ResourceAlertMetric.VOLUME_SIZE_GB.appliesTo(ResourceAlertRule.ResourceType.Host));
8787
assertFalse(ResourceAlertMetric.VOLUME_SIZE_GB.appliesTo(ResourceAlertRule.ResourceType.StoragePool));
8888
}
89+
90+
@Test
91+
public void testStorageUsedIopsAppliesToStoragePoolOnly() {
92+
assertTrue(ResourceAlertMetric.STORAGE_USED_IOPS.appliesTo(ResourceAlertRule.ResourceType.StoragePool));
93+
assertFalse(ResourceAlertMetric.STORAGE_USED_IOPS.appliesTo(ResourceAlertRule.ResourceType.Volume));
94+
assertFalse(ResourceAlertMetric.STORAGE_USED_IOPS.appliesTo(ResourceAlertRule.ResourceType.Host));
95+
assertFalse(ResourceAlertMetric.STORAGE_USED_IOPS.appliesTo(ResourceAlertRule.ResourceType.VirtualMachine));
96+
}
8997
}

‎ui/src/views/resourcealert/CreateResourceAlertRule.vue‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ const METRICS_BY_TYPE = {
106106
VirtualMachine: ['CPU_UTILIZATION', 'MEMORY_UTILIZATION', 'DISK_READ_IOPS', 'DISK_WRITE_IOPS', 'DISK_READ_KBPS', 'DISK_WRITE_KBPS', 'NETWORK_READ_KBPS', 'NETWORK_WRITE_KBPS'],
107107
Host: ['CPU_UTILIZATION', 'MEMORY_UTILIZATION', 'LOAD_AVERAGE', 'NETWORK_READ_KBPS', 'NETWORK_WRITE_KBPS'],
108108
Volume: ['DISK_READ_IOPS', 'DISK_WRITE_IOPS', 'DISK_READ_KBPS', 'DISK_WRITE_KBPS', 'VOLUME_SIZE_GB'],
109-
StoragePool: ['STORAGE_UTILIZATION']
109+
StoragePool: ['STORAGE_UTILIZATION', 'STORAGE_USED_IOPS']
110110
}
111111
112112
export default {
@@ -156,7 +156,8 @@ export default {
156156
NETWORK_WRITE_KBPS: 'Network Out KB/s',
157157
STORAGE_UTILIZATION: 'Storage Utilization %',
158158
LOAD_AVERAGE: 'Load Average',
159-
VOLUME_SIZE_GB: 'Volume Size (GB)'
159+
VOLUME_SIZE_GB: 'Volume Size (GB)',
160+
STORAGE_USED_IOPS: 'Storage Used IOPS'
160161
},
161162
conditionLabels: {
162163
GT: 'Is above',

0 commit comments

Comments
 (0)