master
md 504 lines 52.9 KB
Rendered Raw
1 # vSphere Collector V1 Compatibility Manifest
2
3 Status: superseded historical baseline from the vSphere V2 migration in
4 PR #22458 / commit `18991fd4e`.
5
6 The executable V1 golden fixture
7 `src/go/plugin/go.d/collector/vsphere/testdata/v1_compat_manifest.json` and
8 `TestCollector_V1CompatibilityManifest` were removed on 2026-05-22 with the
9 runtime chart bridge cleanup. Current executable coverage is provided by
10 `TestCollector_ChartTemplateYAML`, `TestCollector_V2CompatibilitySurface`,
11 `collecttest.AssertChartCoverage`, feature-specific V2 plan tests, and full
12 vSphere collector tests.
13
14 This file is retained as migration-history evidence. Tables below that describe
15 pre-merge experiments removed by later user decisions are historical, not the
16 current accepted configuration or metric surface.
17
18 This manifest records the pre-migration v1 contract that guides the framework v2 migration.
19 The migration preserves contexts, dimensions, old labels, units, configuration,
20 and metric meaning. Chart IDs are recorded for traceability but intentionally
21 change to normal framework V2 instance chart IDs by user decision on 2026-05-08.
22 The V2 chartengine path adds one new instance label, `id`, set to the vSphere
23 managed-object reference that V1 used as the chart-ID prefix.
24
25 Runtime substitution:
26
27 - `%s` in chart and dimension IDs is the vSphere managed object reference value
28 stored as the Netdata resource ID, for example synthetic `vcsim` IDs such as
29 `vm-62`, `host-21`, `datastore-59`, `domain-c28`, or `resgroup-27`.
30 - Default chart type is `line` when the code does not set `Type`.
31 - Default dimension algorithm is `absolute`; default multiplier and divisor are
32 `1`.
33
34 ## Sources
35
36 - `src/go/plugin/go.d/collector/vsphere/collector.go`
37 - `src/go/plugin/go.d/collector/vsphere/charts.yaml` (current chart source of truth; the transitional Go chart mirror was removed on 2026-05-22)
38 - `src/go/plugin/go.d/collector/vsphere/collect.go`
39 - `src/go/plugin/go.d/collector/vsphere/discover/metric_lists.go`
40 - `src/go/plugin/go.d/collector/vsphere/config_schema.json`
41 - `src/go/plugin/go.d/collector/vsphere/metadata.yaml`
42 - `src/go/plugin/go.d/config/go.d/vsphere.conf`
43 - `src/health/health.d/vsphere.conf`
44 - `src/go/plugin/go.d/collector/vsphere/collector_test.go`
45
46 Removed executable golden scope:
47
48 - the deleted golden fixture recorded V1 chart IDs and pinned contexts, titles,
49 units, families, chart types, priorities, label keys, label sources,
50 dimension names/algorithms/scales/options, and metric sample keys/values from
51 `vcsim`;
52 - it did not pin simulator-specific label values because `vcsim` can assign VM
53 runtime host labels differently between runs;
54 - it is no longer regenerated. Current V2 validation relies on chart-template
55 generation, chartengine materialization, metric-store coverage, and focused
56 feature tests instead of a large V1 runtime-chart golden.
57
58 ## Collector Registration And Defaults
59
60 | Field | Current v1 contract |
61 |---|---|
62 | Module | `vsphere` |
63 | Framework registration baseline | Pre-migration `Create`, returning `collectorapi.CollectorV1`; current implementation registers `CreateV2` while preserving this public chart/metric surface except chart IDs. |
64 | Default `update_every` | `20` seconds |
65 | Default HTTP timeout | `20s` |
66 | Default discovery interval | `5m` |
67 | Default host include | `/*` |
68 | Default VM include | `/*` |
69 | Default datastore include | `/*` |
70 | Default cluster include | `/*` |
71 | Default inventory path label | `false` |
72 | Default VM guest labels | empty allowlist |
73 | Default vSphere tag category labels | empty allowlist |
74 | Default custom attribute labels | empty allowlist |
75 | Default datastore cluster collection | `false` |
76 | Default datastore cluster include | `/*` |
77 | Default host NIC performance collection | `false` |
78 | Default host NIC include | `*` |
79 | Default host disk performance collection | `false` |
80 | Default host disk include | `*` |
81 | Default host storage adapter performance collection | `false` |
82 | Default host storage adapter include | `*` |
83 | Default host storage path performance collection | `false` |
84 | Default host storage path include | `*` |
85 | Default host CPU instance performance collection | `false` |
86 | Default host CPU instance include | `*` |
87 | Default vSAN collection | `false` |
88 | Default network topology collection | `false` |
89 | Collection output baseline | Pre-migration `Collect(context.Context) map[string]int64`; current public collection path writes to the framework V2 metric store. |
90 | Config schema embed | `config_schema.json` |
91
92 ## Historical Configuration Contract
93
94 This table records the migration baseline before later cleanup decisions. It is
95 not the authoritative current accepted surface after the 2026-05-20 and
96 2026-05-22 removals documented in PR #22458 / commit `18991fd4e`.
97
98 | YAML key | JSON key | Required by schema | Notes |
99 |---|---|---:|---|
100 | `vnode` | `vnode` | no | Existing job-level vnode association. |
101 | `update_every` | `update_every` | no | Default `20`. |
102 | `autodetection_retry` | `autodetection_retry` | no | Schema default `60`; metadata lists `0`. Preserve accepted key. |
103 | `url` | `url` | yes | From embedded HTTP config. |
104 | `timeout` | `timeout` | no | From embedded HTTP config. |
105 | `discovery_interval` | `discovery_interval` | no | Minimum `60`, default `300`. |
106 | `not_follow_redirects` | `not_follow_redirects` | no | From embedded HTTP config. |
107 | `host_include` | `host_include` | no | Selector list, default `/*`. |
108 | `vm_include` | `vm_include` | no | Selector list, default `/*`. |
109 | `datastore_include` | `datastore_include` | no | Selector list, default `/*`. |
110 | `cluster_include` | `cluster_include` | no | Selector list, default `/*`. |
111 | `tag_categories` | `tag_categories` | no | Optional vSphere tag category label allowlist. Default empty; each YAML list item is one glob pattern matching a tag category name. Matching categories become labels named `vsphere_tag_<sanitized_category>`; multiple tags in one category are sorted and joined with the pipe character. |
112 | `custom_attributes` | `custom_attributes` | no | Optional vSphere custom attribute label allowlist. Default empty; each YAML list item is one glob pattern matching a custom attribute name. Matching attributes become labels named `vsphere_custom_attribute_<sanitized_name>`. |
113 | `collect_datastore_clusters` | `collect_datastore_clusters` | no | Optional datastore cluster / StoragePod metrics. Default `false`. |
114 | `datastore_cluster_include` | `datastore_cluster_include` | no | Optional simple-pattern allowlist for datastore clusters. Default `/*`; matches `/Datacenter/DatastoreCluster`, datastore-cluster name, or managed object ID. |
115 | `collect_vsan` | `collect_vsan` | no | Optional vSAN metrics. Default `false`; requests vSAN cluster space/health and vSAN cluster, host, and VM performance metrics through the vSAN Management API for vSAN-enabled clusters. |
116 | `vsan_cluster_include` | `vsan_cluster_include` | no | Optional simple-pattern allowlist for vSAN-enabled clusters. Default `/*`; matches `/Datacenter/Cluster`, cluster name, managed object ID, or `vsan_uuid:<uuid>`. |
117 | `vsan_host_include` | `vsan_host_include` | no | Optional simple-pattern allowlist for vSAN host performance entities. Default `/*`; matches `/Datacenter/Cluster/Host`, host name, managed object ID, or `vsan_node_uuid:<uuid>`. |
118 | `vsan_vm_include` | `vsan_vm_include` | no | Optional simple-pattern allowlist for vSAN VM performance entities. Default `/*`; matches `/Datacenter/Cluster/Host/VM`, VM name, managed object ID, or `instance_uuid:<uuid>`. |
119 | `collect_network_topology` | `collect_network_topology` | no | Optional vSphere Network discovery for the cached topology Function. Default `false`; discovers Network/Distributed Virtual Port Group objects for topology only and emits no charts or metrics. |
120 | `username` | `username` | yes | Sensitive. |
121 | `password` | `password` | yes | Sensitive. |
122 | `bearer_token_file` | `bearer_token_file` | no | Hidden in UI schema. |
123 | `force_http2` | `force_http2` | no | Hidden in UI schema. |
124 | `proxy_url` | `proxy_url` | no | From embedded HTTP config. |
125 | `proxy_username` | `proxy_username` | no | Sensitive. |
126 | `proxy_password` | `proxy_password` | no | Sensitive. |
127 | `headers` | `headers` | no | Object or null. |
128 | `tls_skip_verify` | `tls_skip_verify` | no | From embedded HTTP config. |
129 | `tls_ca` | `tls_ca` | no | Absolute path or empty. |
130 | `tls_cert` | `tls_cert` | no | Absolute path or empty. |
131 | `tls_key` | `tls_key` | no | Absolute path or empty. |
132 | `body` | `body` | no | Hidden in UI schema. |
133 | `method` | `method` | no | Hidden in UI schema. |
134
135 Stock config examples:
136
137 - `vcenter1`: `url`, `username`, `password`
138 - `vcenter2`: `url`, `username`, `password`
139 - The stock config also documents selector formats, secret resolver syntax,
140 optional `vnode`, safe discovery defaults, and every valid host/VM power
141 state as commented examples.
142
143 ## Label Contract
144
145 | Resource | Labels and value sources |
146 |---|---|
147 | Inventory | V2 adds `id=inventory`; no old V1 labels |
148 | VM | `datacenter=vm.Hier.DC.Name`, `cluster=getVMClusterName(vm)`, `host=vm.Hier.Host.Name`, `vm=vm.Name`; V2 also adds `id=vm.ID` |
149 | Host | `datacenter=host.Hier.DC.Name`, `cluster=getHostClusterName(host)`, `host=host.Name`; V2 also adds `id=host.ID` |
150 | Datastore | `datacenter=ds.Hier.DC.Name`, `datastore=ds.Name`, `type=ds.Type`; V2 also adds `id=ds.ID` |
151 | Cluster | `datacenter=cl.Hier.DC.Name`, `cluster=cl.Name`; V2 also adds `id=cl.ID` |
152 | Datastore cluster | `id=pod.ID`, `datacenter=pod.Hier.DC.Name`, `datastore_cluster=pod.Name` |
153 | Host physical network interface performance | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=host.Hier.Cluster.Name`, `host=host.Name`, `interface=<vSphere-performance-instance>`, `interface_instance=<vSphere-performance-instance>` |
154 | Host disk/LUN/device performance | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=host.Hier.Cluster.Name`, `host=host.Name`, `disk=<vSphere-performance-instance>`, `disk_instance=<vSphere-performance-instance>` |
155 | Host storage adapter performance | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=host.Hier.Cluster.Name`, `host=host.Name`, `adapter=<vSphere-performance-instance>`, `adapter_instance=<vSphere-performance-instance>` |
156 | Host storage adapter aggregate performance | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=host.Hier.Cluster.Name`, `host=host.Name` |
157 | Host storage path performance | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=host.Hier.Cluster.Name`, `host=host.Name`, `path=<vSphere-performance-instance>`, `path_instance=<vSphere-performance-instance>` |
158 | Host storage path aggregate performance | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=host.Hier.Cluster.Name`, `host=host.Name` |
159 | Host CPU instance performance | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=host.Hier.Cluster.Name`, `host=host.Name`, `cpu=<vSphere-performance-instance>`, `cpu_instance=<vSphere-performance-instance>` |
160 | vSAN cluster | `id=cluster.ID`, `datacenter=cluster.Hier.DC.Name`, `cluster=cluster.Name`, `vsan_uuid=cluster.VSANUUID` |
161 | vSAN host | `id=host.ID`, `datacenter=host.Hier.DC.Name`, `cluster=getHostClusterName(host)`, `host=host.Name`, `vsan_node_uuid=host.VSANNodeUUID` |
162 | vSAN VM | `id=vm.ID`, `datacenter=vm.Hier.DC.Name`, `cluster=getVMClusterName(vm)`, `host=vm.Hier.Host.Name`, `vm=vm.Name`, `vm_instance_uuid=vm.InstanceUUID` |
163 | Resource pool | `datacenter=rp.Hier.DC.Name`, `cluster=rp.Hier.Cluster.Name`, `resource_pool=rp.Name`; V2 also adds `id=rp.ID` |
164
165 Compatibility details:
166
167 - `getVMClusterName()` returns an empty string when the VM cluster name equals
168 the host name.
169 - `getHostClusterName()` returns an empty string when the host cluster name
170 equals the host name.
171 - By default, no per-resource V2 host scopes are created; all metrics follow
172 the current job/global host behavior, with optional job-level `vnode`.
173 - Collector-generated ESXi/VM vnodes are excluded from this PR by user decision
174 on 2026-05-20. Reintroducing them requires a separate design for stable
175 resource identity and host-scope lifecycle.
176 - Empty host or VM real-time performance scrape results do not abort the whole
177 collection cycle. The collector logs a warning and still emits available
178 property/status metrics plus the remaining datastore, cluster, resource-pool,
179 and vSAN surfaces.
180 - Optional `tag_categories` and `custom_attributes` add user-defined
181 vSphere metadata labels to VM, host, datastore, cluster, resource-pool, and
182 datastore-cluster metrics when the matching resource has those values.
183 Labels use sanitized keys prefixed with `vsphere_tag_` or
184 `vsphere_custom_attribute_`. These labels are default-off because they may
185 expose ownership, business, environment, or internal naming data.
186
187 ## Function Contract
188
189 - `vsphere:readiness` is a read-only module Function with the framework job
190 selector parameter. It reports cached collector readiness rows for
191 target/credential presence, client/discovery/performance-counter state,
192 inventory counts, optional metric/label gates, network-topology gate,
193 and cached vSAN counts. It does not expose the configured vCenter URL,
194 username, password, or object inventory names, and it does not issue extra
195 vCenter API calls.
196 - `topology:vsphere` is the public read-only topology Function alias with the
197 framework job selector parameter and response type `topology`. It reports
198 cached inventory actors and links for datacenters, clusters, ESXi hosts, VMs,
199 datastores, datastore clusters, and resource pools. When
200 `collect_network_topology` is enabled, it also includes cached vSphere
201 Network/Distributed Virtual Port Group actors, accessibility/status
202 attributes, and host/VM network links. The canonical framework method also
203 registers as `vsphere:topology:vsphere`, but topology consumers should use
204 `topology:vsphere` to match the existing topology Function convention.
205 - Function surfaces are additive and do not change metric contexts,
206 dimensions, chart templates, default host scopes, or existing configuration
207 behavior.
208
209 ## Chart And Dimension Contract
210
211 | Resource | Lifecycle | Chart ID template | Context | Family | Units | Type | Priority constant | Dimensions |
212 |---|---|---|---|---|---|---|---|---|
213 | Inventory | static job-level chart from collector initialization | `inventory_objects` | `vsphere.inventory_objects` | `inventory` | `objects` | `line` | `prioInventoryObjects` | `inventory_datacenters=>datacenters`; `inventory_folders=>folders`; `inventory_clusters=>clusters`; `inventory_hosts=>hosts`; `inventory_vms=>vms`; `inventory_datastores=>datastores`; `inventory_resource_pools=>resource_pools` |
214 | Datastore cluster | optional charted only when `collect_datastore_clusters` is enabled and the StoragePod matches `datastore_cluster_include` | `datastore_cluster_space_utilization` | `vsphere.datastore_cluster_space_utilization` | `datastore clusters space` | `percentage` | `line` | optional V2 template | `datastore_cluster_space_utilization_used=>used div=100` |
215 | Datastore cluster | optional charted only when `collect_datastore_clusters` is enabled and the StoragePod matches `datastore_cluster_include` | `datastore_cluster_space_usage` | `vsphere.datastore_cluster_space_usage` | `datastore clusters space` | `bytes` | `line` | optional V2 template | `datastore_cluster_space_usage_capacity=>capacity`; `datastore_cluster_space_usage_free=>free`; `datastore_cluster_space_usage_used=>used` |
216 | Datastore cluster | optional charted only when `collect_datastore_clusters` is enabled and the StoragePod matches `datastore_cluster_include` | `datastore_cluster_storage_drs_status` | `vsphere.datastore_cluster_storage_drs_status` | `datastore clusters status` | `status` | `line` | optional V2 template | `datastore_cluster_storage_drs_status_enabled=>enabled`; `datastore_cluster_storage_drs_status_disabled=>disabled` |
217 | vSAN cluster | optional charted only when `collect_vsan` is enabled and vSAN space usage is returned for a vSAN-enabled cluster | `vsan_cluster_space_utilization` | `vsphere.vsan_cluster_space_utilization` | `vSAN clusters space` | `percentage` | `line` | optional V2 template | `vsan_cluster_space_utilization_used=>used div=100` |
218 | vSAN cluster | optional charted only when `collect_vsan` is enabled and vSAN space usage is returned for a vSAN-enabled cluster | `vsan_cluster_space_usage` | `vsphere.vsan_cluster_space_usage` | `vSAN clusters space` | `bytes` | `stacked` | optional V2 template | `vsan_cluster_space_usage_used=>used`; `vsan_cluster_space_usage_free=>free`; `vsan_cluster_space_usage_total=>total hidden` |
219 | vSAN cluster | optional charted only when `collect_vsan` is enabled and vSAN health is returned for a vSAN-enabled cluster | `vsan_cluster_health_status` | `vsphere.vsan_cluster_health_status` | `vSAN clusters space` | `status` | `line` | optional V2 template | `vsan_cluster_health_status_green=>green`; `vsan_cluster_health_status_yellow=>yellow`; `vsan_cluster_health_status_red=>red`; `vsan_cluster_health_status_unknown=>unknown` |
220 | vSAN cluster performance | optional charted only when `collect_vsan` is enabled and vSAN cluster performance is returned | `vsan_cluster_operations`; `vsan_cluster_throughput`; `vsan_cluster_latency`; `vsan_cluster_congestions` | `vsphere.vsan_cluster_operations`; `vsphere.vsan_cluster_throughput`; `vsphere.vsan_cluster_latency`; `vsphere.vsan_cluster_congestions` | `vSAN clusters performance` | `operations/s`; `bytes/s`; `microseconds`; `congestions/s` | `line`/`area` | optional V2 template | read/write operations, read/write throughput, read/write latency, congestions |
221 | vSAN host performance | optional charted only when `collect_vsan` is enabled and vSAN host performance is returned | `vsan_host_operations`; `vsan_host_throughput`; `vsan_host_latency`; `vsan_host_congestions`; `vsan_host_cache_hit_rate` | `vsphere.vsan_host_operations`; `vsphere.vsan_host_throughput`; `vsphere.vsan_host_latency`; `vsphere.vsan_host_congestions`; `vsphere.vsan_host_cache_hit_rate` | `vSAN hosts performance` | `operations/s`; `bytes/s`; `microseconds`; `congestions/s`; `percentage` | `line`/`area` | optional V2 template | read/write operations, read/write throughput, read/write latency, congestions, hit_rate |
222 | vSAN VM performance | optional charted only when `collect_vsan` is enabled and vSAN VM performance is returned | `vsan_vm_operations`; `vsan_vm_throughput`; `vsan_vm_latency` | `vsphere.vsan_vm_operations`; `vsphere.vsan_vm_throughput`; `vsphere.vsan_vm_latency` | `vSAN VMs performance` | `operations/s`; `bytes/s`; `microseconds` | `line`/`area` | optional V2 template | read/write operations, read/write throughput, read/write latency |
223 | VM | property/perf charted when VM is discovered | `%s_cpu_utilization` | `vsphere.vm_cpu_utilization` | `vms cpu` | `percentage` | `line` | `prioVMCPUUtilization` | `%s_cpu.usage.average=>used div=100` |
224 | VM | property/perf charted when VM is discovered | `%s_mem_utilization` | `vsphere.vm_mem_utilization` | `vms mem` | `percentage` | `line` | `prioVmMemoryUtilization` | `%s_mem.usage.average=>used div=100` |
225 | VM | property/perf charted when VM is discovered | `%s_mem_usage` | `vsphere.vm_mem_usage` | `vms mem` | `KiB` | `line` | `prioVmMemoryUsage` | `%s_mem.granted.average=>granted`; `%s_mem.consumed.average=>consumed`; `%s_mem.active.average=>active`; `%s_mem.shared.average=>shared` |
226 | VM | property/perf charted when VM is discovered | `%s_mem_swap_usage` | `vsphere.vm_mem_swap_usage` | `vms mem` | `KiB` | `line` | `prioVmMemorySwapUsage` | `%s_mem.swapped.average=>swapped` |
227 | VM | property/perf charted when VM is discovered | `%s_mem_swap_io_rate` | `vsphere.vm_mem_swap_io` | `vms mem` | `KiB/s` | `area` | `prioVmMemorySwapIO` | `%s_mem.swapinRate.average=>in`; `%s_mem.swapoutRate.average=>out` |
228 | VM | property/perf charted when VM is discovered | `%s_disk_io` | `vsphere.vm_disk_io` | `vms disk` | `KiB/s` | `area` | `prioVmDiskIO` | `%s_disk.read.average=>read`; `%s_disk.write.average=>write mul=-1` |
229 | VM | property/perf charted when VM is discovered | `%s_disk_max_latency` | `vsphere.vm_disk_max_latency` | `vms disk` | `milliseconds` | `line` | `prioVmDiskMaxLatency` | `%s_disk.maxTotalLatency.latest=>latency` |
230 | VM | property/perf charted when VM is discovered | `%s_net_traffic` | `vsphere.vm_net_traffic` | `vms net` | `KiB/s` | `area` | `prioVmNetworkTraffic` | `%s_net.bytesRx.average=>received`; `%s_net.bytesTx.average=>sent mul=-1` |
231 | VM | property/perf charted when VM is discovered | `%s_net_packets` | `vsphere.vm_net_packets` | `vms net` | `packets` | `line` | `prioVmNetworkPackets` | `%s_net.packetsRx.summation=>received`; `%s_net.packetsTx.summation=>sent mul=-1` |
232 | VM | property/perf charted when VM is discovered | `%s_net_drops` | `vsphere.vm_net_drops` | `vms net` | `drops` | `line` | `prioVmNetworkDrops` | `%s_net.droppedRx.summation=>received`; `%s_net.droppedTx.summation=>sent mul=-1` |
233 | VM | property/perf charted when VM is discovered | `%s_overall_status` | `vsphere.vm_overall_status` | `vms status` | `status` | `line` | `prioVmOverallStatus` | `%s_overall.status.green=>green`; `%s_overall.status.red=>red`; `%s_overall.status.yellow=>yellow`; `%s_overall.status.gray=>gray` |
234 | VM | property charted when VM is discovered | `%s_power_state` | `vsphere.vm_power_state` | `vms status` | `status` | `line` | `prioVMPowerState` | `%s_power_state.poweredOn=>powered_on`; `%s_power_state.poweredOff=>powered_off`; `%s_power_state.suspended=>suspended` |
235 | VM | property charted when VM is discovered | `%s_connection_state` | `vsphere.vm_connection_state` | `vms status` | `status` | `line` | `prioVMConnectionState` | `%s_connection_state.connected=>connected`; `%s_connection_state.disconnected=>disconnected`; `%s_connection_state.orphaned=>orphaned`; `%s_connection_state.inaccessible=>inaccessible`; `%s_connection_state.invalid=>invalid` |
236 | VM | property charted when VM is discovered | `%s_tools_running_status` | `vsphere.vm_tools_running_status` | `vms status` | `status` | `line` | `prioVMToolsRunningStatus` | `%s_tools_running_status.running=>running`; `%s_tools_running_status.notRunning=>not_running`; `%s_tools_running_status.executingScripts=>executing_scripts`; `%s_tools_running_status.unknown=>unknown` |
237 | VM | property charted when VM is discovered | `%s_tools_version_status` | `vsphere.vm_tools_version_status` | `vms status` | `status` | `line` | `prioVMToolsVersionStatus` | `%s_tools_version_status.current=>current`; `%s_tools_version_status.needUpgrade=>need_upgrade`; `%s_tools_version_status.notInstalled=>not_installed`; `%s_tools_version_status.unmanaged=>unmanaged`; `%s_tools_version_status.tooOld=>too_old`; `%s_tools_version_status.supportedOld=>supported_old`; `%s_tools_version_status.supportedNew=>supported_new`; `%s_tools_version_status.tooNew=>too_new`; `%s_tools_version_status.blacklisted=>blacklisted`; `%s_tools_version_status.unknown=>unknown` |
238 | VM | property charted when VM is discovered | `%s_consolidation_needed` | `vsphere.vm_consolidation_needed` | `vms status` | `status` | `line` | `prioVMConsolidationNeeded` | `%s_consolidation_needed.needed=>needed`; `%s_consolidation_needed.notNeeded=>not_needed` |
239 | VM | property/perf charted when VM is discovered | `%s_system_uptime` | `vsphere.vm_system_uptime` | `vms uptime` | `seconds` | `line` | `prioVmSystemUptime` | `%s_sys.uptime.latest=>uptime` |
240 | VM | property charted when VM is discovered | `%s_config_cpu` | `vsphere.vm_config_cpu` | `vms config` | `vCPUs` | `line` | `prioVMConfigCPU` | `%s_config_cpu=>vcpus` |
241 | VM | property charted when VM is discovered | `%s_config_memory` | `vsphere.vm_config_memory` | `vms config` | `MiB` | `line` | `prioVMConfigMemory` | `%s_config_memory=>memory` |
242 | VM | property charted when VM is discovered | `%s_config_devices` | `vsphere.vm_config_devices` | `vms config` | `devices` | `line` | `prioVMConfigDevices` | `%s_config_devices.disks=>disks`; `%s_config_devices.nics=>nics` |
243 | VM | property charted when VM is discovered | `%s_storage_usage` | `vsphere.vm_storage_usage` | `vms storage` | `bytes` | `line` | `prioVMStorageUsage` | `%s_storage.committed=>committed`; `%s_storage.uncommitted=>uncommitted`; `%s_storage.unshared=>unshared` |
244 | VM | snapshot property charted when VM is discovered | `%s_snapshot_count` | `vsphere.vm_snapshot_count` | `vms snapshots` | `snapshots` | `line` | `prioVMSnapshotCount` | `%s_snapshot_count=>count` |
245 | VM | snapshot property charted when VM is discovered | `%s_snapshot_max_age` | `vsphere.vm_snapshot_max_age` | `vms snapshots` | `seconds` | `line` | `prioVMSnapshotAge` | `%s_snapshot_max_age=>age` |
246 | VM | snapshot property charted when VM is discovered | `%s_snapshot_max_chain_depth` | `vsphere.vm_snapshot_max_chain_depth` | `vms snapshots` | `snapshots` | `line` | `prioVMSnapshotChainDepth` | `%s_snapshot_max_chain_depth=>depth` |
247 | Host | property/perf charted when host is discovered | `%s_cpu_usage_total` | `vsphere.host_cpu_utilization` | `hosts cpu` | `percentage` | `line` | `prioHostCPUUtilization` | `%s_cpu.usage.average=>used div=100` |
248 | Host | property/perf charted when host is discovered | `%s_mem_utilization` | `vsphere.host_mem_utilization` | `hosts mem` | `percentage` | `line` | `prioHostMemoryUtilization` | `%s_mem.usage.average=>used div=100` |
249 | Host | property/perf charted when host is discovered | `%s_mem_usage` | `vsphere.host_mem_usage` | `hosts mem` | `KiB` | `line` | `prioHostMemoryUsage` | `%s_mem.granted.average=>granted`; `%s_mem.consumed.average=>consumed`; `%s_mem.active.average=>active`; `%s_mem.shared.average=>shared`; `%s_mem.sharedcommon.average=>sharedcommon` |
250 | Host | property/perf charted when host is discovered | `%s_mem_swap_rate` | `vsphere.host_mem_swap_io` | `hosts mem` | `KiB/s` | `area` | `prioHostMemorySwapIO` | `%s_mem.swapinRate.average=>in`; `%s_mem.swapoutRate.average=>out` |
251 | Host | property/perf charted when host is discovered | `%s_disk_io` | `vsphere.host_disk_io` | `hosts disk` | `KiB/s` | `area` | `prioHostDiskIO` | `%s_disk.read.average=>read`; `%s_disk.write.average=>write mul=-1` |
252 | Host | property/perf charted when host is discovered | `%s_disk_max_latency` | `vsphere.host_disk_max_latency` | `hosts disk` | `milliseconds` | `line` | `prioHostDiskMaxLatency` | `%s_disk.maxTotalLatency.latest=>latency` |
253 | Host | property/perf charted when host is discovered | `%s_net_traffic` | `vsphere.host_net_traffic` | `hosts net` | `KiB/s` | `area` | `prioHostNetworkTraffic` | `%s_net.bytesRx.average=>received`; `%s_net.bytesTx.average=>sent mul=-1` |
254 | Host | property/perf charted when host is discovered | `%s_net_packets` | `vsphere.host_net_packets` | `hosts net` | `packets` | `line` | `prioHostNetworkPackets` | `%s_net.packetsRx.summation=>received`; `%s_net.packetsTx.summation=>sent mul=-1` |
255 | Host | property/perf charted when host is discovered | `%s_net_drops_total` | `vsphere.host_net_drops` | `hosts net` | `drops` | `line` | `prioHostNetworkDrops` | `%s_net.droppedRx.summation=>received`; `%s_net.droppedTx.summation=>sent mul=-1` |
256 | Host | property/perf charted when host is discovered | `%s_net_errors` | `vsphere.host_net_errors` | `hosts net` | `errors` | `line` | `prioHostNetworkErrors` | `%s_net.errorsRx.summation=>received`; `%s_net.errorsTx.summation=>sent mul=-1` |
257 | Host | property/perf charted when host is discovered | `%s_overall_status` | `vsphere.host_overall_status` | `hosts status` | `status` | `line` | `prioHostOverallStatus` | `%s_overall.status.green=>green`; `%s_overall.status.red=>red`; `%s_overall.status.yellow=>yellow`; `%s_overall.status.gray=>gray` |
258 | Host | property charted when host is discovered | `%s_power_state` | `vsphere.host_power_state` | `hosts status` | `status` | `line` | `prioHostPowerState` | `%s_power_state.poweredOn=>powered_on`; `%s_power_state.poweredOff=>powered_off`; `%s_power_state.standBy=>standby`; `%s_power_state.unknown=>unknown` |
259 | Host | property charted when host is discovered | `%s_connection_state` | `vsphere.host_connection_state` | `hosts status` | `status` | `line` | `prioHostConnectionState` | `%s_connection_state.connected=>connected`; `%s_connection_state.notResponding=>not_responding`; `%s_connection_state.disconnected=>disconnected` |
260 | Host | property charted when host is discovered | `%s_maintenance_status` | `vsphere.host_maintenance_status` | `hosts status` | `status` | `line` | `prioHostMaintenanceStatus` | `%s_maintenance_status.normal=>normal`; `%s_maintenance_status.inMaintenance=>in_maintenance` |
261 | Host | property/perf charted when host is discovered | `%s_system_uptime` | `vsphere.host_system_uptime` | `hosts uptime` | `seconds` | `line` | `prioHostSystemUptime` | `%s_sys.uptime.latest=>uptime` |
262 | Datastore | property charted when datastore is discovered; perf charts later only after perf data arrives | `%s_space_utilization` | `vsphere.datastore_space_utilization` | `datastores space` | `percentage` | `line` | `prioDatastoreSpaceUtilization` | `%s_used_space_pct=>used div=100` |
263 | Datastore | property charted when datastore is discovered; perf charts later only after perf data arrives | `%s_space_usage` | `vsphere.datastore_space_usage` | `datastores space` | `bytes` | `line` | `prioDatastoreSpaceUsage` | `%s_capacity=>capacity`; `%s_free_space=>free`; `%s_used_space=>used`; `%s_uncommitted=>uncommitted` |
264 | Datastore | property charted when datastore is discovered; perf charts later only after perf data arrives | `%s_overall_status` | `vsphere.datastore_overall_status` | `datastores status` | `status` | `line` | `prioDatastoreOverallStatus` | `%s_overall.status.green=>green`; `%s_overall.status.red=>red`; `%s_overall.status.yellow=>yellow`; `%s_overall.status.gray=>gray` |
265 | Datastore | perf chart created only after datastore perf data arrives | `%s_disk_io` | `vsphere.datastore_disk_io` | `datastores disk` | `KiB/s` | `area` | `prioDatastoreDiskIO` | `%s_datastore.read.average=>read`; `%s_datastore.write.average=>write mul=-1` |
266 | Datastore | perf chart created only after datastore perf data arrives | `%s_disk_iops` | `vsphere.datastore_disk_iops` | `datastores disk` | `operations/s` | `line` | `prioDatastoreDiskIOPS` | `%s_datastore.numberReadAveraged.average=>reads`; `%s_datastore.numberWriteAveraged.average=>writes mul=-1` |
267 | Datastore | perf chart created only after datastore perf data arrives | `%s_disk_latency` | `vsphere.datastore_disk_latency` | `datastores disk` | `milliseconds` | `line` | `prioDatastoreDiskLatency` | `%s_datastore.totalReadLatency.average=>read`; `%s_datastore.totalWriteLatency.average=>write` |
268 | Cluster | property chart created when cluster properties refresh | `%s_hosts` | `vsphere.cluster_hosts` | `clusters hosts` | `hosts` | `line` | `prioClusterHosts` | `%s_num_hosts=>total`; `%s_num_effective_hosts=>effective` |
269 | Cluster | property chart created when cluster properties refresh | `%s_cpu_capacity` | `vsphere.cluster_cpu_capacity` | `clusters cpu` | `MHz` | `line` | `prioClusterCPUCapacity` | `%s_total_cpu=>total`; `%s_effective_cpu=>effective` |
270 | Cluster | property chart created when cluster properties refresh | `%s_mem_capacity` | `vsphere.cluster_mem_capacity` | `clusters mem` | `bytes` | `line` | `prioClusterMemCapacity` | `%s_total_memory=>total`; `%s_effective_memory=>effective` |
271 | Cluster | property chart created when cluster properties refresh | `%s_cpu_topology` | `vsphere.cluster_cpu_topology` | `clusters cpu` | `count` | `line` | `prioClusterCPUTopology` | `%s_num_cpu_cores=>cores`; `%s_num_cpu_threads=>threads` |
272 | Cluster | property chart created when cluster properties refresh | `%s_drs_config` | `vsphere.cluster_drs_config` | `clusters config` | `status` | `line` | `prioClusterDRSConfig` | `%s_drs_enabled=>enabled` |
273 | Cluster | property chart created when cluster properties refresh | `%s_drs_mode` | `vsphere.cluster_drs_mode` | `clusters config` | `status` | `line` | `prioClusterDRSMode` | `%s_drs_mode.manual=>manual`; `%s_drs_mode.partiallyAutomated=>partially_automated`; `%s_drs_mode.fullyAutomated=>fully_automated`; `%s_drs_mode.unknown=>unknown` |
274 | Cluster | property chart created when cluster properties refresh | `%s_drs_vmotion_rate` | `vsphere.cluster_drs_vmotion_rate` | `clusters config` | `level` | `line` | `prioClusterDRSVmotionRate` | `%s_drs_vmotion_rate=>rate` |
275 | Cluster | property chart created when cluster properties refresh | `%s_ha_config` | `vsphere.cluster_ha_config` | `clusters config` | `status` | `line` | `prioClusterHAConfig` | `%s_ha_enabled=>enabled`; `%s_ha_adm_ctrl_enabled=>admission_control` |
276 | Cluster | property chart created when cluster properties refresh | `%s_ha_host_monitoring` | `vsphere.cluster_ha_host_monitoring` | `clusters config` | `status` | `line` | `prioClusterHAHostMonitoring` | `%s_ha_host_monitoring.enabled=>enabled`; `%s_ha_host_monitoring.disabled=>disabled`; `%s_ha_host_monitoring.unknown=>unknown` |
277 | Cluster | property chart created when cluster properties refresh | `%s_ha_vm_monitoring` | `vsphere.cluster_ha_vm_monitoring` | `clusters config` | `status` | `line` | `prioClusterHAVMMonitoring` | `%s_ha_vm_monitoring.vmMonitoringDisabled=>disabled`; `%s_ha_vm_monitoring.vmMonitoringOnly=>vm_monitoring_only`; `%s_ha_vm_monitoring.vmAndAppMonitoring=>vm_and_app_monitoring`; `%s_ha_vm_monitoring.unknown=>unknown` |
278 | Cluster | property chart created when cluster properties refresh | `%s_ha_vm_component_protection` | `vsphere.cluster_ha_vm_component_protection` | `clusters config` | `status` | `line` | `prioClusterHAVMComponentProtection` | `%s_ha_vm_component_protection.enabled=>enabled`; `%s_ha_vm_component_protection.disabled=>disabled`; `%s_ha_vm_component_protection.unknown=>unknown` |
279 | Cluster | property chart created when cluster properties refresh | `%s_overall_status` | `vsphere.cluster_overall_status` | `clusters status` | `status` | `line` | `prioClusterOverallStatus` | `%s_overall.status.green=>green`; `%s_overall.status.red=>red`; `%s_overall.status.yellow=>yellow`; `%s_overall.status.gray=>gray` |
280 | Cluster | property chart created when cluster properties refresh | `%s_vmotions` | `vsphere.cluster_vmotions` | `clusters migrations` | `migrations` | `line` | `prioClusterVMotions` | `%s_num_vmotions=>vmotions algo=incremental` |
281 | Cluster | property chart created when cluster properties refresh | `%s_drs_score` | `vsphere.cluster_drs_score` | `clusters drs` | `percentage` | `line` | `prioClusterDRSScore` | `%s_drs_score=>score` |
282 | Cluster | property chart created when cluster properties refresh | `%s_drs_balance` | `vsphere.cluster_drs_balance` | `clusters drs` | `score` | `line` | `prioClusterDRSBalance` | `%s_current_balance=>current div=1000`; `%s_target_balance=>target div=1000` |
283 | Cluster | property chart created when cluster properties refresh | `%s_vm_count` | `vsphere.cluster_vm_count` | `clusters vms` | `VMs` | `line` | `prioClusterVMCount` | `%s_usage_total_vm_count=>total`; `%s_usage_powered_off_vm_count=>powered_off` |
284 | Cluster | property chart created when cluster properties refresh | `%s_usage_cpu` | `vsphere.cluster_usage_cpu` | `clusters cpu` | `MHz` | `line` | `prioClusterUsageCPU` | `%s_usage_cpu_demand_mhz=>demand`; `%s_usage_cpu_entitled_mhz=>entitled`; `%s_usage_cpu_reservation_mhz=>reserved` |
285 | Cluster | property chart created when cluster properties refresh | `%s_usage_mem` | `vsphere.cluster_usage_mem` | `clusters mem` | `MB` | `line` | `prioClusterUsageMem` | `%s_usage_mem_demand_mb=>demand`; `%s_usage_mem_entitled_mb=>entitled`; `%s_usage_mem_reservation_mb=>reserved` |
286 | Cluster | perf chart created only after cluster perf data arrives | `%s_cpu_utilization` | `vsphere.cluster_cpu_utilization` | `clusters cpu` | `percentage` | `line` | `prioClusterCPUUtilization` | `%s_cpu.usage.average=>used div=100` |
287 | Cluster | perf chart created only after cluster perf data arrives | `%s_cpu_usage_mhz` | `vsphere.cluster_cpu_usage` | `clusters cpu` | `MHz` | `line` | `prioClusterCPUUsage` | `%s_cpu.usagemhz.average=>used`; `%s_cpu.totalmhz.average=>total` |
288 | Cluster | perf chart created only after cluster perf data arrives | `%s_mem_utilization` | `vsphere.cluster_mem_utilization` | `clusters mem` | `percentage` | `line` | `prioClusterMemUtilization` | `%s_mem.usage.average=>used div=100` |
289 | Cluster | perf chart created only after cluster perf data arrives | `%s_mem_usage` | `vsphere.cluster_mem_usage` | `clusters mem` | `KiB` | `line` | `prioClusterMemUsage` | `%s_mem.consumed.average=>consumed`; `%s_mem.active.average=>active`; `%s_mem.granted.average=>granted`; `%s_mem.shared.average=>shared`; `%s_mem.overhead.average=>overhead`; `%s_mem.swapused.average=>swap_used` |
290 | Cluster | perf chart created only after cluster perf data arrives | `%s_services_fairness` | `vsphere.cluster_services_fairness` | `clusters drs` | `score` | `line` | `prioClusterServicesFairness` | `%s_clusterServices.cpufairness.latest=>cpu`; `%s_clusterServices.memfairness.latest=>memory` |
291 | Cluster | perf chart created only after cluster perf data arrives | `%s_services_effective_cpu` | `vsphere.cluster_services_effective_cpu` | `clusters cpu` | `MHz` | `line` | `prioClusterServicesEffectiveCPU` | `%s_clusterServices.effectivecpu.average=>effective_cpu` |
292 | Cluster | perf chart created only after cluster perf data arrives | `%s_services_effective_mem` | `vsphere.cluster_services_effective_mem` | `clusters mem` | `MB` | `line` | `prioClusterServicesEffectiveMem` | `%s_clusterServices.effectivemem.average=>effective_mem` |
293 | Cluster | perf chart created only after cluster perf data arrives | `%s_services_failover` | `vsphere.cluster_services_failover` | `clusters ha` | `failures` | `line` | `prioClusterServicesFailover` | `%s_clusterServices.failover.latest=>failures_tolerable` |
294 | Cluster | perf chart created only after cluster perf data arrives | `%s_vm_migrations` | `vsphere.cluster_vm_migrations` | `clusters vmop` | `operations` | `line` | `prioClusterVMMigrations` | `%s_vmop.numVMotion.latest=>vmotion`; `%s_vmop.numSVMotion.latest=>svmotion`; `%s_vmop.numXVMotion.latest=>xvmotion` |
295 | Cluster | perf chart created only after cluster perf data arrives | `%s_vm_lifecycle` | `vsphere.cluster_vm_lifecycle` | `clusters vmop` | `operations` | `line` | `prioClusterVMLifecycle` | `%s_vmop.numPoweron.latest=>poweron`; `%s_vmop.numPoweroff.latest=>poweroff`; `%s_vmop.numCreate.latest=>create`; `%s_vmop.numDestroy.latest=>destroy`; `%s_vmop.numClone.latest=>clone`; `%s_vmop.numDeploy.latest=>deploy` |
296 | Cluster | perf chart created only after cluster perf data arrives | `%s_vm_management` | `vsphere.cluster_vm_management` | `clusters vmop` | `operations` | `line` | `prioClusterVMManagement` | `%s_vmop.numReconfigure.latest=>reconfigure`; `%s_vmop.numReset.latest=>reset`; `%s_vmop.numSuspend.latest=>suspend`; `%s_vmop.numRegister.latest=>register`; `%s_vmop.numUnregister.latest=>unregister` |
297 | Cluster | perf chart created only after cluster perf data arrives | `%s_vm_guest_ops` | `vsphere.cluster_vm_guest_ops` | `clusters vmop` | `operations` | `line` | `prioClusterVMGuestOps` | `%s_vmop.numRebootGuest.latest=>reboot`; `%s_vmop.numShutdownGuest.latest=>shutdown`; `%s_vmop.numStandbyGuest.latest=>standby` |
298 | Cluster | perf chart created only after cluster perf data arrives | `%s_vm_cold_migrations` | `vsphere.cluster_vm_cold_migrations` | `clusters vmop` | `operations` | `line` | `prioClusterVMColdMigrations` | `%s_vmop.numChangeDS.latest=>change_ds`; `%s_vmop.numChangeHost.latest=>change_host`; `%s_vmop.numChangeHostDS.latest=>change_host_ds` |
299 | Resource pool | property chart created when resource pool properties refresh | `%s_cpu_usage` | `vsphere.resource_pool_cpu_usage` | `resource pools cpu` | `MHz` | `line` | `prioResourcePoolCPUUsage` | `%s_cpu_usage=>usage`; `%s_cpu_demand=>demand` |
300 | Resource pool | property chart created when resource pool properties refresh | `%s_cpu_entitlement` | `vsphere.resource_pool_cpu_entitlement` | `resource pools cpu` | `MHz` | `line` | `prioResourcePoolCPUEntitlement` | `%s_cpu_entitlement_distributed=>distributed` |
301 | Resource pool | property chart created when resource pool properties refresh | `%s_cpu_allocation` | `vsphere.resource_pool_cpu_allocation` | `resource pools cpu` | `MHz` | `line` | `prioResourcePoolCPUAllocation` | `%s_cpu_reservation_used=>reservation_used`; `%s_cpu_unreserved_for_vm=>unreserved_for_vm`; `%s_cpu_max_usage=>max_usage` |
302 | Resource pool | property chart created when resource pool properties refresh | `%s_mem_usage` | `vsphere.resource_pool_mem_usage` | `resource pools mem` | `MB` | `line` | `prioResourcePoolMemUsage` | `%s_mem_usage_host=>host`; `%s_mem_usage_guest=>guest` |
303 | Resource pool | property chart created when resource pool properties refresh | `%s_mem_entitlement` | `vsphere.resource_pool_mem_entitlement` | `resource pools mem` | `MB` | `line` | `prioResourcePoolMemEntitlement` | `%s_mem_entitlement_distributed=>distributed` |
304 | Resource pool | property chart created when resource pool properties refresh | `%s_mem_allocation` | `vsphere.resource_pool_mem_allocation` | `resource pools mem` | `bytes` | `line` | `prioResourcePoolMemAllocation` | `%s_mem_reservation_used=>reservation_used`; `%s_mem_unreserved_for_vm=>unreserved_for_vm`; `%s_mem_max_usage=>max_usage` |
305 | Resource pool | property chart created when resource pool properties refresh | `%s_mem_breakdown` | `vsphere.resource_pool_mem_breakdown` | `resource pools mem` | `MB` | `line` | `prioResourcePoolMemBreakdown` | `%s_mem_private=>private`; `%s_mem_shared=>shared`; `%s_mem_swapped=>swapped`; `%s_mem_ballooned=>ballooned`; `%s_mem_overhead=>overhead`; `%s_mem_consumed_overhead=>consumed_overhead`; `%s_mem_compressed=>compressed div=1024` |
306 | Resource pool | property chart created when resource pool properties refresh | `%s_cpu_config` | `vsphere.resource_pool_cpu_config` | `resource pools cpu` | `MHz` | `line` | `prioResourcePoolCPUConfig` | `%s_cpu_reservation=>reservation`; `%s_cpu_limit=>limit` |
307 | Resource pool | property chart created when resource pool properties refresh | `%s_mem_config` | `vsphere.resource_pool_mem_config` | `resource pools mem` | `MB` | `line` | `prioResourcePoolMemConfig` | `%s_mem_reservation=>reservation`; `%s_mem_limit=>limit` |
308 | Resource pool | property chart created when resource pool properties refresh | `%s_overall_status` | `vsphere.resource_pool_overall_status` | `resource pools status` | `status` | `line` | `prioResourcePoolOverallStatus` | `%s_overall.status.green=>green`; `%s_overall.status.red=>red`; `%s_overall.status.yellow=>yellow`; `%s_overall.status.gray=>gray` |
309
310 ## Metric Source Lists
311
312 Performance counter lists are selected in
313 `src/go/plugin/go.d/collector/vsphere/discover/metric_lists.go`.
314
315 VM performance counters:
316
317 - `cpu.usage.average`
318 - `mem.usage.average`
319 - `mem.granted.average`
320 - `mem.consumed.average`
321 - `mem.active.average`
322 - `mem.shared.average`
323 - `mem.swapinRate.average`
324 - `mem.swapoutRate.average`
325 - `mem.swapped.average`
326 - `net.bytesRx.average`
327 - `net.bytesTx.average`
328 - `net.packetsRx.summation`
329 - `net.packetsTx.summation`
330 - `net.droppedRx.summation`
331 - `net.droppedTx.summation`
332 - `disk.read.average`
333 - `disk.write.average`
334 - `disk.maxTotalLatency.latest`
335 - `sys.uptime.latest`
336
337 Host performance counters:
338
339 - `cpu.usage.average`
340 - `mem.usage.average`
341 - `mem.granted.average`
342 - `mem.consumed.average`
343 - `mem.active.average`
344 - `mem.shared.average`
345 - `mem.sharedcommon.average`
346 - `mem.swapinRate.average`
347 - `mem.swapoutRate.average`
348 - `net.bytesRx.average`
349 - `net.bytesTx.average`
350 - `net.packetsRx.summation`
351 - `net.packetsTx.summation`
352 - `net.droppedRx.summation`
353 - `net.droppedTx.summation`
354 - `net.errorsRx.summation`
355 - `net.errorsTx.summation`
356 - `disk.read.average`
357 - `disk.write.average`
358 - `disk.maxTotalLatency.latest`
359 - `sys.uptime.latest`
360
361 Power counters requested with empty instance when vSphere exposes them:
362
363 - VM: `power.power.average`
364 - VM: `power.energy.summation`
365 - Host: `power.power.average`
366 - Host: `power.powerCap.average`
367 - Host: `power.energy.summation`
368 - Host: `power.capacity.usable.average`
369 - Host: `power.capacity.usage.average`
370 - Host: `power.capacity.usagePct.average`
371 - Host: `power.capacity.usageIdle.average`
372 - Host: `power.capacity.usageSystem.average`
373 - Host: `power.capacity.usageVm.average`
374
375 Datastore performance counters:
376
377 - `datastore.numberReadAveraged.average`
378 - `datastore.numberWriteAveraged.average`
379 - `datastore.totalReadLatency.average`
380 - `datastore.totalWriteLatency.average`
381 - `datastore.read.average`
382 - `datastore.write.average`
383
384 Cluster performance counters:
385
386 - `clusterServices.effectivecpu.average`
387 - `clusterServices.effectivemem.average`
388 - `clusterServices.cpufairness.latest`
389 - `clusterServices.memfairness.latest`
390 - `clusterServices.failover.latest`
391 - `cpu.usage.average`
392 - `cpu.usagemhz.average`
393 - `cpu.totalmhz.average`
394 - `mem.usage.average`
395 - `mem.consumed.average`
396 - `mem.overhead.average`
397 - `mem.active.average`
398 - `mem.granted.average`
399 - `mem.shared.average`
400 - `mem.swapused.average`
401 - `vmop.numVMotion.latest`
402 - `vmop.numSVMotion.latest`
403 - `vmop.numXVMotion.latest`
404 - `vmop.numPoweron.latest`
405 - `vmop.numPoweroff.latest`
406 - `vmop.numCreate.latest`
407 - `vmop.numDestroy.latest`
408 - `vmop.numClone.latest`
409 - `vmop.numDeploy.latest`
410 - `vmop.numReset.latest`
411 - `vmop.numSuspend.latest`
412 - `vmop.numReconfigure.latest`
413 - `vmop.numRegister.latest`
414 - `vmop.numUnregister.latest`
415 - `vmop.numChangeDS.latest`
416 - `vmop.numChangeHost.latest`
417 - `vmop.numChangeHostDS.latest`
418 - `vmop.numRebootGuest.latest`
419 - `vmop.numShutdownGuest.latest`
420 - `vmop.numStandbyGuest.latest`
421 - `clusterServices.clusterDrsScore.latest`
422 - `clusterServices.vmDrsScore.latest`
423
424 ## Property Metric Semantics
425
426 | Resource | Property path requested | Metric behavior |
427 |---|---|---|
428 | VM | discovery requests `name`, `parent`, `runtime.host`, `runtime.connectionState`, `runtime.powerState`, `runtime.consolidationNeeded`, `summary.guest`, `summary.config`, `summary.storage`, `summary.overallStatus`, `snapshot`; also `config.instanceUuid` only when `collect_vsan` is enabled | Emits `overall.status.{green,red,yellow,gray}`, `power_state.*`, `connection_state.*`, VMware Tools running/version state, disk consolidation-needed state, configured CPU/memory/device counts, aggregate storage usage, and snapshot aggregate metrics for all discovered VMs. Emits real-time aggregate performance counters only when the VM is `poweredOn`. If `runtime.host` is absent for a non-running VM, the VM folder parent is used to recover the datacenter label when possible. Guest hostname/IP and guest OS labels are excluded from this PR by user decision. Per-virtual-disk capacity/performance and per-vNIC performance are excluded from this PR by 2026-05-22 user decision. VM power and energy metrics are emitted when vSphere returns aggregate `power.*` counters. VM vSAN performance is emitted only when `collect_vsan` is enabled and vSAN returns a matching VM instance UUID. |
429 | Host | discovery requests `name`, `parent`, `runtime.connectionState`, `runtime.powerState`, `runtime.inMaintenanceMode`, `summary.overallStatus`; also `config.vsanHostConfig.clusterInfo.nodeUuid` only when `collect_vsan` is enabled | Emits `overall.status.{green,red,yellow,gray}`, `power_state.*`, `connection_state.*`, and `maintenance_status.*` for all discovered hosts. Emits real-time aggregate performance counters only when the host is `poweredOn`. Per-host child-instance NIC, disk, storage-adapter, storage-path, and CPU-instance performance metrics are excluded from this PR by 2026-05-22 user decision. Host power, energy, and power-capacity metrics are emitted when vSphere returns aggregate `power.*` counters. Host vSAN performance is emitted only when `collect_vsan` is enabled and vSAN returns a matching host node UUID. |
430 | Datastore | refresh requests `summary`, `overallStatus` | Emits `capacity`, `free_space`, `used_space`, `used_space_pct`, and `overall.status.*`. Capacity/free/used are zeroed when `Accessible=false`. |
431 | Network | discovery requests `name`, `parent`, `summary`, `host`, and `vm` only when `collect_network_topology` is enabled | Emits no metrics. Cached Network and Distributed Virtual Port Group status/relationships are used only by the topology Function. |
432 | Datastore cluster | discovery requests `StoragePod` `name`, `parent`, `summary`, `podStorageDrsEntry`; only when `collect_datastore_clusters` is enabled | Emits optional StoragePod capacity, free, used, utilization, and Storage DRS enabled/disabled status for datastore clusters matching `datastore_cluster_include`. |
433 | Cluster | refresh requests `name`, `summary`, `configurationEx`, `overallStatus`; discovery includes `configurationEx.vsanConfigInfo` only when `collect_vsan` is enabled | Emits capacity/topology/DRS/HA/usage/overall-status property metrics, with conditional fields reset to zero before update. vSAN cluster space, health, and performance metrics are emitted only when `collect_vsan` is enabled, the cluster is vSAN-enabled, and vSAN API calls return data. |
434 | Resource pool | refresh requests `name`, `summary`, `config`, `runtime`, `overallStatus` | Emits quick stats, runtime allocation, config reservation/limit, memory breakdown, and overall-status metrics. |
435
436 ## Lifecycle Contract
437
438 - Hosts, VMs, datastores, clusters, resource pools, and optional datastore
439 clusters are tracked in discovered maps.
440 - Each absent resource increments a failure counter per collection.
441 - `failedUpdatesLimit` is `10`.
442 - When the failure counter reaches `10`, charts whose ID starts with
443 `<resourceID>_` are marked removed and not-created, making them obsolete.
444 - Datastore property charts are created when the datastore is present.
445 - Datastore performance charts are created only after performance data arrives.
446 - Cluster property charts are created when the cluster is present.
447 - Cluster performance charts are created only after performance data arrives.
448 - Non-powered-on hosts and VMs are discovered when vSphere returns them and the
449 include selectors keep them. Their property/status metrics keep the resource
450 alive; real-time host/VM performance query specs are not generated for them.
451 - Optional VM virtual disk capacity/performance and VM network-interface
452 performance metrics are not part of this PR. They were hard-removed before
453 merge by 2026-05-22 user decision. Existing aggregate VM disk and network
454 contexts remain default-on.
455 - Optional datastore cluster metrics are not part of the legacy V1 surface.
456 They are emitted only when `collect_datastore_clusters` is enabled, only for
457 StoragePod objects matching `datastore_cluster_include`.
458 - Optional host disk/LUN/device, storage-adapter, storage-path, and CPU-instance
459 metrics are not part of this PR. They were hard-removed before merge by
460 2026-05-22 user decision. Existing aggregate host disk, network, CPU, memory,
461 and uptime contexts remain default-on.
462 - Host/VM power metrics are not part of the legacy V1 surface. They are
463 requested by adding selected aggregate `power.*` counters with empty instance
464 to powered-on host and VM performance queries when vSphere exposes those
465 counters. They emit one aggregate set per included host or VM and therefore
466 use the existing host/VM include selectors instead of a new child selector.
467 The `collect_power_metrics` option was removed before merge by 2026-05-22
468 user decision.
469 - Optional vSAN metrics are not part of the legacy V1 surface. They are queried
470 only when `collect_vsan` is enabled, only for clusters whose vSAN config is
471 enabled and match the dedicated vSAN selectors, and only through the
472 vSAN Management API. Missing vSAN API support, missing vSAN Performance
473 Service, or unavailable vSAN counters cause one-time warnings and no emitted
474 vSAN series for that query. The first implemented vSAN surface covers cluster
475 space, cluster health, and cluster/host/VM vSAN performance; vSAN events and
476 deeper disk-group, disk, component, or CMMDS entity metrics are not emitted by
477 this option.
478
479 ## Health Alert Contract
480
481 | Template | Context | Lookup/calc | Warning | Critical | Recipient |
482 |---|---|---|---|---|---|
483 | `vsphere_vm_cpu_utilization` | `vsphere.vm_cpu_utilization` | `average -10m unaligned match-names of used` | `$this > (($status >= $WARNING) ? (75) : (85))` | `$this > (($status == $CRITICAL) ? (85) : (95))` | `silent` |
484 | `vsphere_vm_mem_utilization` | `vsphere.vm_mem_utilization` | `$used` | `$this > (($status >= $WARNING) ? (80) : (90))` | `$this > (($status == $CRITICAL) ? (90) : (98))` | `silent` |
485 | `vsphere_vm_snapshot_chain_depth` | `vsphere.vm_snapshot_max_chain_depth` | `$depth` | `$this > 3` | none | `sysadmin` |
486 | `vsphere_vm_snapshot_age` | `vsphere.vm_snapshot_max_age` | `$age` | none | `$this > 86400` | `sysadmin` |
487 | `vsphere_host_cpu_utilization` | `vsphere.host_cpu_utilization` | `average -10m unaligned match-names of used` | `$this > (($status >= $WARNING) ? (75) : (85))` | `$this > (($status == $CRITICAL) ? (85) : (95))` | `sysadmin` |
488 | `vsphere_host_mem_utilization` | `vsphere.host_mem_utilization` | `$used` | `$this > (($status >= $WARNING) ? (80) : (90))` | `$this > (($status == $CRITICAL) ? (90) : (98))` | `sysadmin` |
489
490 ## Current Artifact Drift To Preserve Or Fix Explicitly
491
492 The migration must preserve runtime behavior from code. Existing artifact drift
493 must be fixed only as explicit metadata/docs updates:
494
495 - Code sets `vsphere.host_net_traffic` chart type to `area`; metadata currently
496 says `line`.
497 - Code sets VM and host network drop units to `drops`; metadata currently says
498 `packets`.
499 - Cluster performance counter selection includes
500 `clusterServices.clusterDrsScore.latest` and
501 `clusterServices.vmDrsScore.latest`, but the current chart templates do not
502 expose chart dimensions for those exact counter keys. A v2 migration must not
503 accidentally create public series for them unless an enrichment row explicitly
504 adds new contexts/dimensions.