mirror of
https://github.com/recklessop/zroc.git
synced 2026-07-02 21:13:15 -04:00
feat: add vcenter_vm_disk_provisioned_gb metric for DR sizing
Extend collector to pull total provisioned virtual disk capacity per VM using VirtualDisk device enumeration, and expose it as a Prometheus gauge. Used by the zroc-ui Planner page for mirror volume storage estimates. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -165,6 +165,18 @@ def _get_vm_labels(vm: vim.VirtualMachine) -> dict:
|
||||
}
|
||||
|
||||
|
||||
def _get_vm_provisioned_gb(vm: vim.VirtualMachine) -> float:
|
||||
"""Return total provisioned virtual disk capacity in GB for a VM."""
|
||||
total_kb = 0
|
||||
try:
|
||||
for device in vm.config.hardware.device:
|
||||
if isinstance(device, vim.vm.device.VirtualDisk):
|
||||
total_kb += device.capacityInKB
|
||||
except Exception as exc:
|
||||
log.debug("Could not read disk capacity for VM %s: %s", vm._moId, exc)
|
||||
return total_kb / (1024 * 1024) # KB -> GB
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Performance counter ID cache
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -236,6 +248,7 @@ def _parse_results(
|
||||
results: list,
|
||||
label_cache: dict[str, dict],
|
||||
label_to_counter_id: dict[str, int],
|
||||
provisioned_gb_cache: Optional[dict[str, float]] = None,
|
||||
) -> None:
|
||||
"""Parse EntityMetric results and update the global MetricStore."""
|
||||
# Build reverse map: counter_id -> label
|
||||
@@ -279,6 +292,9 @@ def _parse_results(
|
||||
else:
|
||||
metrics[lbl] = total
|
||||
|
||||
if provisioned_gb_cache:
|
||||
metrics["disk_provisioned_gb"] = provisioned_gb_cache.get(moref, 0.0)
|
||||
|
||||
store.update(moref, labels, metrics)
|
||||
|
||||
|
||||
@@ -342,6 +358,9 @@ class VCenterCollector:
|
||||
if vm.runtime and vm.runtime.powerState == vim.VirtualMachinePowerState.poweredOn
|
||||
]
|
||||
self._label_cache = {vm._moId: _get_vm_labels(vm) for vm in self._vm_cache}
|
||||
self._provisioned_gb_cache: dict[str, float] = {
|
||||
vm._moId: _get_vm_provisioned_gb(vm) for vm in self._vm_cache
|
||||
}
|
||||
self._vm_cache_ts = now
|
||||
log.info("VM inventory: %d powered-on VMs", len(self._vm_cache))
|
||||
|
||||
@@ -378,7 +397,8 @@ class VCenterCollector:
|
||||
results = _query_batch(
|
||||
self._pm, batch, counter_id_list, config.PERF_INTERVAL_ID
|
||||
)
|
||||
_parse_results(results, self._label_cache, self._counter_ids)
|
||||
_parse_results(results, self._label_cache, self._counter_ids,
|
||||
self._provisioned_gb_cache)
|
||||
collected += len(batch)
|
||||
except Exception as exc:
|
||||
errors += len(batch)
|
||||
|
||||
@@ -37,6 +37,10 @@ _METRIC_HELP = {
|
||||
"gauge",
|
||||
"Virtual disk write latency in milliseconds (totalWriteLatency.average, mean across disk instances)",
|
||||
),
|
||||
"vcenter_vm_disk_provisioned_gb": (
|
||||
"gauge",
|
||||
"Total provisioned virtual disk capacity in GB (sum of all VirtualDisk devices)",
|
||||
),
|
||||
}
|
||||
|
||||
# Maps our collector metric keys to Prometheus metric names
|
||||
@@ -44,6 +48,7 @@ _METRIC_NAME_MAP = {
|
||||
"disk_write_iops": "vcenter_vm_disk_write_iops",
|
||||
"disk_write_throughput": "vcenter_vm_disk_write_throughput_mbps",
|
||||
"disk_write_latency": "vcenter_vm_disk_write_latency_ms",
|
||||
"disk_provisioned_gb": "vcenter_vm_disk_provisioned_gb",
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user