Skip to content

Signal Catalog ​

The master list of every signal that drives a health state or collects data in this Management Pack. Each row is a contract: signal name, default state, source, threshold, and dimension.

Platform scope: the populated catalog below is the accepted Azure Local baseline. Hyper-V signals will be added in a separate platform section only after its research program verifies supported sources, SCOM workflows, thresholds, architecture, and lab behavior. See the Hyper-V research plan and catalog policy. Shared names indicate equivalent meaning, not an assumption that every platform exposes the signal.

Default column key:

  • ON — monitor enabled by default; impacts health state
  • OFF — monitor is authored but ships disabled (Enabled=false); operator enables via override pack
  • Rule — data collection rule (perf/event collection only, no health-state change); always active

Status: Drafted in Phase 2. Final values land at Phase 2 sign-off. Thresholds shown are Standard tier defaults — see Customization for Lab/Strict tiers.

Naming convention ​

Every signal has a stable cross-track name. See ADR 0007:

  • Logical name (track-agnostic, used in this catalog): Volume.FreeSpace.WarnPercent
  • SCOM override property: Volume.FreeSpace.WarnPercent
  • Azure Monitor Bicep param: volumeFreeSpaceWarningThresholdPct

Layer 1 — On-prem signals ​

Cluster ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
Cluster.Service.StateONAvailabilityRunning—Stopped/DegradedGet-ClusterResource "Cluster Name"DCMA cluster_status
Cluster.Quorum.StateONAvailabilityNormalNoWitnessFailedGet-ClusterQuorumKQL MicrosoftHCI_Cluster_Quorum
Cluster.Quorum.Witness.ReachableONAvailabilityReachable—UnreachableGet-ClusterQuorum witness type + Test-NetConnection to witness endpointKQL on cluster event log
Cluster.Quorum.WitnessTypeOFFConfigurationCloudWitness or FileShare—None (no witness configured)Get-ClusterQuorum | .WitnessTypeKQL
Cluster.NodeCount.LiveONAvailabilityAlln-1< n-1Get-ClusterNodeDCMA cluster_node_count
Cluster.FunctionalLevel.CurrentOFFConfigurationMatches OS—Below OS version (upgrade pending)(Get-Cluster).ClusterFunctionalLevel vs (Get-Cluster).ClusterUpgradeVersionKQL
Cluster.Validation.WarningsOFFConfiguration0≤ 5> 5Test-Cluster -List InventoryKQL on Event log
Cluster.EnvironmentChecker.PassOFFConfigurationAll pass≥ 1 warning≥ 1 failureInvoke-AzureStackHCIEnvironmentCheckerKQL on Health event log
Cluster.DNS.Suffix.ConfiguredOFFConfigurationPresent—Missing (DNS suffix required for cluster name resolution)Registry HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters → SearchListKQL
Cluster.TimeSync.MaxOffsetSecondsOFFConfiguration< 55–30> 30w32tm /query /status on each node (cookdown max)KQL Event from W32TM
Cluster.CSV.Ownership.BalanceOFFConfigurationEven (±1 node)Imbalanced by 2All on 1 nodeGet-ClusterSharedVolume | .OwnerNode distributionKQL
Cluster.CSV.Paused.CountONAvailability0≥ 1—Get-ClusterSharedVolume | Where State -eq 'Paused'KQL on cluster event
Cluster.ResourceGroup.Failed.CountONAvailability0—≥ 1Get-ClusterGroup | Where State -eq 'Failed'KQL
Cluster.ResourceGroup.Offline.CountOFFAvailability0—≥ 1 unexpectedGet-ClusterGroup | Where State -eq 'Offline'KQL
Cluster.Event.NodeLostONAvailability0—≥ 1Event log System Event ID 1135 (cluster node lost)KQL Event
Cluster.Event.ResourceFailedONAvailability0—≥ 1Event log System Event ID 1069 (resource failed)KQL Event
Cluster.Event.DriveRemovedONAvailability0—≥ 1Event log Microsoft-Windows-Health/Operational (disk removed)KQL Event
LCM.Environment.HealthONAvailabilityHealthy—Failed/ErrorGet-SolutionUpdateEnvironment → .StateKQL
LCM.Update.PendingCriticalONConfiguration0—≥ 1Get-SolutionUpdate | Where State -eq 'Failed'KQL
LCM.Update.LastRunResultONConfigurationSucceeded—FailedGet-SolutionUpdate | Sort InstalledDate -Desc | Select -First 1KQL
LCM.Update.Available.DaysOFFConfiguration< 3030–60> 60Get-SolutionUpdate | Where State -eq 'Ready' ageARM property + KQL
LCM.Update.NodeVersionDriftOFFConfigurationAligned1 node behind> 1 node behindGet-SolutionUpdateEnvironment per-node versionsKQL
LCM.Update.PreCheckFailedONConfigurationPassed—FailedGet-SolutionUpdateEnvironment → pre-check resultKQL

Node ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
Node.Up.StateONAvailabilityUp—Down/PausedGet-ClusterNode | .StateResource Health on HybridCompute/machines
Node.CPU.PercentONPerformance< 7070–85> 85Perf counter \Processor(_Total)\% Processor TimeDCMA node_cpu_usage_percentage
Node.CPU.Queue.LengthOFFPerformance< 44–8> 8Perf counter \System\Processor Queue LengthDCMA
Node.Memory.PercentONPerformance< 7575–90> 90Perf counter \Memory\% Committed Bytes In UseDCMA node_memory_usage_percentage
Node.Memory.Available.GBOFFPerformance> 84–8< 4Perf counter \Memory\Available MBytesDCMA
Node.Memory.NonPagedPool.MBOFFPerformance< 20482048–3072> 3072Perf counter \Memory\Pool Nonpaged BytesKQL
Node.Memory.PageFile.PercentOFFPerformance< 5050–80> 80Perf counter \Paging File(_Total)\% UsageKQL
Node.Memory.HardFaults.SecOFFPerformance0> 0> 10Perf counter \Memory\Page Faults/secKQL
Node.OS.UptimeDaysONConfiguration< 6060–90> 90WMI Win32_OperatingSystem.LastBootUpTimeKQL Heartbeat
Node.PendingRebootOFFConfigurationFalse—TrueRegistry HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPendingKQL Event
Node.Maintenance.ModeONAvailabilityNotInMaintenanceInMaintenance > 4h—Get-ClusterNode | .NodeDrainStatusKQL
Node.TimeSync.OffsetSecondsOFFConfiguration< 55–30> 30w32tm /query /status → Phase OffsetKQL Event from Microsoft-Windows-Time-Service/Operational
Node.TimeSync.Source.ReachableOFFAvailabilityReachable—Unreachable/Unsynchronizedw32tm /query /status → SourceKQL
Node.SecureBoot.StateOFFSecurityEnabled—DisabledConfirm-SecureBootUEFI or Get-SecureBootPolicyKQL
Node.BitLocker.OSDrive.StateOFFSecurityOn—Off or SuspendedGet-BitLockerVolume -MountPoint C → ProtectionStatusKQL
Node.Defender.RealtimeProtectionOFFSecurityEnabled—DisabledGet-MpComputerStatus → RealTimeProtectionEnabledKQL Event
Node.Defender.SignatureAge.DaysOFFSecurity< 33–7> 7Get-MpComputerStatus → AntivirusSignatureAgeKQL
Node.Defender.ThreatDetection.CountOFFSecurity0≥ 1—Get-MpThreatDetection | Measure-ObjectKQL Event
Node.WindowsUpdate.PendingCriticalOFFConfiguration0—≥ 1Get-HotFix + WSUS/WU queryKQL
Node.BIOS.Firmware.VersionOFFConfigurationCurrent (vs. HCL matrix)One version behindMajor version behindWMI Win32_BIOS.SMBIOSBIOSVersion vs. validated matrixKQL
Node.Driver.NIC.VersionOFFConfigurationCurrentOne minor behindMajor behindGet-NetAdapter | .DriverVersion vs. HCI validated driver matrixKQL
Node.Driver.Storage.VersionOFFConfigurationCurrentOne minor behindMajor behindGet-StorageController | .FirmwareVersion vs. validated matrixKQL
Node.Disk.OS.FreeSpace.PercentONPerformance> 2010–20< 10Get-Volume -DriveLetter C → .SizeRemainingKQL
Node.WinRM.StateOFFAvailabilityRunning—StoppedGet-Service WinRMKQL
Node.DNS.Azure.ResolutionOFFAvailabilityResolves—FailsResolve-DnsName management.azure.com from nodeKQL
Node.DNS.Internal.ResolutionOFFAvailabilityResolves—FailsResolve-DnsName <cluster-fqdn> from nodeKQL
Node.CrashDump.ConfiguredOFFConfigurationEnabled—Disabled or no spaceRegistry HKLM:\SYSTEM\CurrentControlSet\Control\CrashControlKQL
Node.EventLog.System.Critical.CountOFFAvailability0—≥ 1 in last hourEvent log System Level=1 (Critical) count in windowKQL Event
Node.EventLog.Application.Critical.CountOFFAvailability0—≥ 1 in last hourEvent log Application Level=1 (Critical)KQL Event
Node.WHEA.Error.CountOFFAvailability0≥ 1≥ 5 in 24hEvent log Microsoft-Windows-WHEA-Logger/OperationalKQL Event
Node.WHEA.MemoryError.CountOFFAvailability0≥ 1—Event log Microsoft-Windows-WHEA-Logger/Operational ID 19 (memory)KQL Event
Node.BMC.AlertsOFFAvailability0≤ 2> 2OEM-specific (Dell iDRAC APEX / HPE iLO / Lenovo XCC)KQL on hardware event channel
Node.Arc.AgentConnectedONAvailabilityConnectedStale (< 1h)DisconnectedRegistry proxy / local check (see Tier A below)Resource Health on HybridCompute/machines
Node.Certificate.Deployment.ExpiryDaysOFFSecurity> 307–30< 7Get-ChildItem Cert:\LocalMachine\My filtered for deployment certsKQL
Node.Handles.CountOFFPerformance< 5000050000–80000> 80000Perf counter \Process(_Total)\Handle CountKQL
Node.LiveMigration.InProgress.CountRulePerformance———Get-VM | Where State -eq 'Migrating'DCMA
Node.SMB.Bandwidth.InboundMBpsRulePerformance———Perf counter \SMB Client Shares(*)\Bytes Received/secDCMA
Node.SMB.Bandwidth.OutboundMBpsRulePerformance———Perf counter \SMB Client Shares(*)\Bytes Sent/secDCMA

Hyper-V Host ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
Node.HyperV.StateONAvailabilityRunning—Stopped/DegradedGet-VMHost + Hyper-V VMMS service stateKQL on Microsoft-Windows-Hyper-V-VMMS/Operational
Node.HyperV.vSwitch.BindingONConfigurationAll NICs bound—vSwitch NIC binding missingGet-VMSwitch | Get-VMSwitchTeam | .NetAdapters vs. Get-NetIntentKQL
Node.HyperV.VM.Running.CountRulePerformance———(Get-VM | Where State -eq 'Running').CountDCMA
Node.HyperV.vCPU.Overcommit.RatioOFFPerformance< 8:18–12:1> 12:1(Get-VM | Measure-Object -Sum ProcessorCount).Sum / (Get-VMHost).LogicalProcessorCountKQL
Node.HyperV.Memory.Demand.PercentOFFPerformance< 8080–95> 95(Get-VM | Where State -eq 'Running' | Measure-Object -Sum MemoryAssigned).Sum / (Get-VMHost).MemoryCapacity * 100DCMA
Node.HyperV.Memory.Pressure.IndexOFFPerformance< 100100–125> 125Perf counter \Hyper-V Dynamic Memory Balancer\Average PressureKQL
Node.HyperV.VM.DynamicMemory.PressureOFFPerformance0 VMs pressured≥ 1—Get-VMMemory | Where DynamicMemoryEnabled -and Pressure -gt 100KQL
Node.HyperV.Checkpoint.CountOFFConfiguration0≥ 1 per VM> 5 totalGet-VMCheckpoint countKQL
Node.HyperV.VM.StorageLatency.msOFFPerformance< 2020–50> 50Perf counter \Hyper-V Virtual Storage Device(*)\Read LatencyDCMA
Node.HyperV.Event.VMFailedONAvailability0—≥ 1Event log Microsoft-Windows-Hyper-V-VMMS/Operational ID 18010 (VM failed)KQL Event
Node.HyperV.LiveMigration.FailedONAvailability0—≥ 1Event log Microsoft-Windows-Hyper-V-VMMS-Operational IDs 20100/20101KQL Event
Node.HyperV.VMQ.AdequacyOFFConfigurationAll VMs have VMQ—VMQ exhaustedGet-VMNetworkAdapter | Where VmqUsage -ne 'Enabled'KQL
Node.HyperV.SRIOVActiveOFFConfigurationEnabled where expected—Not active (if SR-IOV configured in intent)Get-VMNetworkAdapter | Where IovWeight -gt 0 | .IovActiveKQL
Node.HyperV.Replica.StateOFFAvailabilityEnabled/ReplicatingWarningCritical/ErrorGet-VMReplication | .StateKQL on Hyper-V Replica event log

Storage Pool ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
StoragePool.HealthStatusONAvailabilityHealthyWarningUnhealthyGet-StoragePoolDCMA storagepool_health
StoragePool.OperationalStatusONAvailabilityOKDegradedFailedGet-StoragePoolDCMA storagepool_operational_status
StoragePool.Capacity.PercentONPerformance< 7070–85> 85Get-StoragePoolDCMA storagepool_capacity_used_percentage
StoragePool.Size.TiBRuleConfiguration> 0—Unexpected shrink(Get-StoragePool).Size / 1TBDCMA
StoragePool.AllocatedSize.PercentOFFPerformance< 7070–85> 85(Get-StoragePool).AllocatedSize / .Size * 100DCMA
StoragePool.FreeSpace.TiBOFFPerformance> 20% of .Size10–20%< 10%(Get-StoragePool).RemainingCapacity / 1TBDCMA
StoragePool.RetiredCapacity.TiBOFFConfiguration0> 0> 5% of total(Get-PhysicalDisk -Usage Retired | Measure Size -Sum).Sum / 1TBDCMA
StoragePool.Reserve.PolicyONConfigurationConfigured—Missing(Get-StoragePool).RetireMissingPhysicalDisksKQL
StoragePool.ResiliencySettingOFFConfigurationAs expected (3-way/nested)—DowngradedGet-ResiliencySettingKQL
StoragePool.ThinProvision.OverCommit.PercentOFFPerformance< 100100–120> 120 (over-provisioned)(Volumes.AllocatedSize.Sum) / StoragePool.Size * 100KQL
StoragePool.RepairJobs.ActiveONPerformance01–2> 2 active for > 24hGet-StorageJobKQL on Storage event log
StoragePool.RebuildJob.PercentCompleteONPerformancen/a (no job)RunningStalled (< 1% progress in 1h)Get-StorageJob | Where JobState -eq 'Running' | Select PercentComplete, ElapsedTimeKQL
StoragePool.RebuildJob.ETA.HoursOFFPerformancen/a< 8h> 8h (extended exposure)Derived from PercentComplete + ElapsedTimeKQL
StoragePool.ScrubJob.LastRunAge.DaysOFFConfiguration< 1414–30> 30 (scrub not running)Get-StoragePool | .Version + scrub event logKQL Event
StoragePool.ScrubJob.ErrorsFoundOFFAvailability0≥ 1—Event log Microsoft-Windows-StorageSpaces/OperationalKQL Event
StoragePool.PhysicalDisks.FailedONAvailability01 (within fault tolerance)> 1Get-PhysicalDisk | Where HealthStatus -ne HealthyDCMA storagepool_failed_disks
StoragePool.FaultDomain.CountONConfiguration≥ 2—< 2 (pool degraded)Get-StorageFaultDomainKQL
StoragePool.Read.Throughput.MBpsRulePerformance———Perf counter \Storage Spaces Drt(*)\Read Bytes/secDCMA
StoragePool.Write.Throughput.MBpsRulePerformance———Perf counter \Storage Spaces Drt(*)\Write Bytes/secDCMA
StoragePool.Read.IOPSRulePerformance———Perf counter \Storage Spaces Drt(*)\Read I/O Operations/secDCMA
StoragePool.Write.IOPSRulePerformance———Perf counter \Storage Spaces Drt(*)\Write I/O Operations/secDCMA
StoragePool.Read.Latency.msOFFPerformance< 2020–50> 50Perf counter \Storage Spaces Drt(*)\Read LatencyDCMA
StoragePool.Write.Latency.msOFFPerformance< 2020–50> 50Perf counter \Storage Spaces Drt(*)\Write LatencyDCMA

Volume / CSV ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
Volume.HealthStatusONAvailabilityHealthyWarningUnhealthyGet-VolumeDCMA volume_health
Volume.OperationalStatusONAvailabilityOKDegradedUnknown/FailedGet-VolumeDCMA volume_operational_status
Volume.FreeSpace.PercentONPerformance> 2510–25< 10Get-VolumeDCMA volume_free_space_percentage
Volume.Size.TiBRuleConfiguration> 0—Unexpected shrink(Get-Volume).Size / 1TBDCMA
Volume.AllocatedSize.TiBOFFPerformance< 80% of .Size80–90%> 90%(Get-Volume).SizeRemaining / .SizeDCMA
Volume.RedirectedIO.ActiveONPerformanceFalseTrue < 1hTrue > 1hGet-ClusterSharedVolumeKQL on cluster event
Volume.RedirectedIO.PercentOFFPerformance< 55–25> 25Perf counter \Cluster CSV File System(*)\% Redirected ReadsDCMA
Volume.CSV.InMaintenanceOFFConfigurationFalse—True(Get-ClusterSharedVolume).SharedVolumeInfo.MaintenanceModeKQL
Volume.IOPS.Read.SecRulePerformance———Perf counter \Cluster CSV File System(*)\Reads/secDCMA
Volume.IOPS.Write.SecRulePerformance———Perf counter \Cluster CSV File System(*)\Writes/secDCMA
Volume.Throughput.Read.MBpsRulePerformance———Perf counter \Cluster CSV File System(*)\Read Bytes/secDCMA
Volume.Throughput.Write.MBpsRulePerformance———Perf counter \Cluster CSV File System(*)\Write Bytes/secDCMA
Volume.Latency.Read.msONPerformance< 2020–50> 50Perf counter \Cluster CSV File System(*)\Avg sec/ReadDCMA volume_latency_ms
Volume.Latency.Write.msONPerformance< 2020–50> 50Perf counter \Cluster CSV File System(*)\Avg sec/WriteDCMA
Volume.QueueDepthOFFPerformance< 6464–256> 256Perf counter \Cluster CSV File System(*)\Current Queue LengthDCMA
Volume.ReFS.IntegrityStreamOFFConfigurationEnabled (where expected)—DisabledGet-Item -Path <vol> | Get-FileIntegrityKQL
Volume.Dedup.EnabledRuleConfiguration———Get-DedupVolume | .EnabledKQL
Volume.Dedup.SavedPercentOFFConfigurationMatch baseline—Unexpectedly low (dedup configured)Get-DedupVolume → .SavingsRateKQL
Volume.Dedup.LastOptimizationAge.DaysOFFConfiguration< 33–7> 7Get-DedupStatus → .LastOptimizationTimeKQL
Volume.ReFS.Compression.EnabledRuleConfiguration———Get-Volume | .FileSystemLabel + Get-Item flagKQL
Volume.VSS.Writer.StateOFFAvailabilityStable—Failed/waitingvssadmin list writers → writer stateKQL Event from VSS
Volume.Backup.LastSuccessAge.DaysOFFConfiguration< 11–3> 3 (backup missed)Event log from backup solution or VSSKQL
Volume.Snapshot.CountOFFConfiguration0≥ 1> 10 (snapshots accumulating)Get-VMCheckpoint + VSS snapshotKQL

Storage Tier (cache) ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
StorageTier.Cache.HitRatioONPerformance> 8060–80< 60Get-StorageTier perf countersDCMA cache_hit_ratio
StorageTier.Cache.StateONAvailabilityBoundUnbindingFailedGet-StorageTierDCMA
StorageTier.Cache.DirtyPages.PercentONPerformance< 6060–80> 80Perf counter \Cluster Storage Cache Stores(*)\Cache Dirty Pages %DCMA
StorageTier.Cache.MissRateOFFPerformance< 2020–40> 40Perf counter \Cluster Storage Cache Stores(*)\Cache Miss RateDCMA
StorageTier.Cache.Read.Throughput.MBpsRulePerformance———Perf counter \Cluster Storage Cache Stores(*)\Read Bytes From Cache/secDCMA
StorageTier.Cache.Write.Throughput.MBpsRulePerformance———Perf counter \Cluster Storage Cache Stores(*)\Write Bytes to Cache/secDCMA
StorageTier.Cache.FlushRate.MBpsOFFPerformance< 80% capacity—At rated capacity sustainedPerf counter \Cluster Storage Cache Stores(*)\Flush Bytes/secDCMA
StorageTier.Cache.DriveCount.ExpectedONConfigurationMatch—Mismatch(Get-StorageTier -MediaType NVMe | Get-PhysicalDisk).CountKQL
StorageTier.Capacity.DriveCount.ExpectedONConfigurationMatch—Mismatch(Get-StorageTier -MediaType HDD | Get-PhysicalDisk).CountKQL

Physical Disk ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
PhysicalDisk.HealthStatusONAvailabilityHealthyWarningUnhealthyGet-PhysicalDisk | .HealthStatusDCMA storagepool_failed_disks
PhysicalDisk.OperationalStatusONAvailabilityOKDegraded/StaleFailed/Lost CommunicationGet-PhysicalDisk | .OperationalStatusDCMA
PhysicalDisk.Usage.RetiredONConfigurationIn use—RetiredGet-PhysicalDisk | .UsageDCMA
PhysicalDisk.PredictiveFailureONAvailabilityFalse—TrueGet-PhysicalDisk | .OperationalStatus -like '*Predictive*'DCMA
PhysicalDisk.Wear.PercentOFFConfiguration> 2010–20< 10 (< 10% endurance remaining)Get-PhysicalDisk | .VirtualDiskFootprint + SMART attributesKQL
PhysicalDisk.ReadError.CountOFFAvailability0≥ 1≥ 10Get-PhysicalDisk | .ReadErrorCount (Get-StorageReliabilityCounter)KQL
PhysicalDisk.WriteError.CountOFFAvailability0≥ 1≥ 10Get-StorageReliabilityCounter | .WriteErrorsTotalKQL
PhysicalDisk.Temperature.CelsiusOFFPerformance< 6060–70> 70Get-StorageReliabilityCounter | .TemperatureKQL
PhysicalDisk.PowerOnHoursRuleConfiguration———Get-StorageReliabilityCounter | .PowerOnHoursKQL
PhysicalDisk.Firmware.VersionOFFConfigurationCurrent (vs. HCL matrix)One version behindMajor behindGet-PhysicalDisk | .FirmwareVersionKQL
PhysicalDisk.MediaType.MismatchOFFConfigurationConsistent per fault domain—Mixed media types in same tierGet-PhysicalDisk | Group-Object MediaType per fault domainKQL
PhysicalDisk.Rebuild.PercentCompleteOFFPerformancen/a (no rebuild)In progressStalledGet-StorageJob | Where JobState -eq 'Running' scoped to diskKQL
PhysicalDisk.Read.Latency.msOFFPerformance< 1 (NVMe) / < 5 (SSD)Elevated> 20Perf counter \PhysicalDisk(*)\Avg. Disk sec/ReadKQL
PhysicalDisk.Write.Latency.msOFFPerformance< 1 (NVMe) / < 5 (SSD)Elevated> 20Perf counter \PhysicalDisk(*)\Avg. Disk sec/WriteKQL
PhysicalDisk.BusTypeRuleConfiguration———Get-PhysicalDisk | .BusTypeKQL
StoragePool.PhysicalDisk.Failed.CountONAvailability01 (within fault tolerance)> 1Get-PhysicalDisk | Where HealthStatus -ne 'Healthy'DCMA
StoragePool.PhysicalDisk.Warning.CountONAvailability0≥ 1—Get-PhysicalDisk | Where HealthStatus -eq 'Warning'DCMA
StoragePool.PhysicalDisk.Retired.CountONConfiguration0≥ 1—Get-PhysicalDisk | Where Usage -eq 'Retired'DCMA
StoragePool.PhysicalDisk.Lost.CountONAvailability0—≥ 1Get-PhysicalDisk | Where OperationalStatus -eq 'Lost Communication'DCMA
StoragePool.RetiredCapacity.PercentOFFPerformance< 55–15> 15(Get-PhysicalDisk -Usage Retired | Measure-Object Size -Sum).Sum / Pool.SizeDCMA

Network Intent ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
NetIntent.StateONAvailabilitySuccessInProgress > 1hFailedGet-NetIntentStatusKQL on Microsoft-Windows-SDDC-Management/Operational
NetIntent.RDMA.OpStatusONAvailabilityOperationalDegradedNonOperationalGet-NetIntentStatusKQL
NetIntent.vSwitch.HealthONAvailabilityUp—DownGet-VMSwitchKQL
NetIntent.Adapter.LinkSpeedONPerformanceAt expectedBelow expectedDisconnectedGet-NetAdapterDCMA nic_link_speed
NetIntent.MTU.DriftONConfigurationMatchDrift on 1 NICDrift > 1 NICGet-NetAdapterAdvancedPropertyKQL
NetIntent.VLAN.DriftOFFConfigurationMatchDrift on 1 NICDrift > 1 NICGet-NetAdapterAdvancedProperty -RegistryKeyword VlanIDKQL
NetIntent.AdapterCount.ExpectedONConfigurationMatch—Missing adapter in intent(Get-NetIntentStatus).Adapters.Count vs discoveredKQL
NetIntent.Management.Gateway.ReachableOFFAvailabilityReachable—UnreachableTest-NetConnection <default-gateway> -Port 80 on management intentKQL
NetIntent.Management.SCOM.Server.ReachableOFFAvailabilityReachable—UnreachableTest-NetConnection <mgmt-server> from nodeKQL
NetIntent.Storage.Bandwidth.Utilization.PercentOFFPerformance< 7070–90> 90SMB bandwidth / (NIC count × link speed) derivedDCMA
NetIntent.Compute.vSwitch.PacketDropsOFFPerformance0> 0> 100/secPerf counter \Hyper-V Virtual Switch(*)\Packets/sec droppedKQL
NetIntent.Heartbeat.Network.DedicatedOFFConfigurationDedicated—Shared with managementGet-ClusterNetwork | Where Role -like '*Internal*' isolation checkKQL

Physical NIC & RDMA ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
NIC.Physical.StatusONAvailabilityUp—Down / Not PresentGet-NetAdapter | .StatusDCMA nic_status
NIC.RDMA.EnabledONConfigurationTrue (storage-intent NICs)—FalseGet-NetAdapterRdma | .EnabledKQL
NIC.RDMA.OperationalStatusONAvailabilityOperationalDegradedNonOperationalGet-NetAdapterRdmaDCMA rdma_operational_status
NIC.LinkSpeed.GbpsONPerformanceAt expected tier (10/25/100)Below expected0 / DownGet-NetAdapter | .LinkSpeedDCMA nic_link_speed
NIC.Bandwidth.InboundUtilization.PercentOFFPerformance< 7070–90> 90Perf counter \Network Interface(*)\Bytes Received/sec / rated speedDCMA
NIC.Bandwidth.OutboundUtilization.PercentOFFPerformance< 7070–90> 90Perf counter \Network Interface(*)\Bytes Sent/sec / rated speedDCMA
NIC.Receive.BufferDrops.SecOFFPerformance0> 0> 100/secPerf counter \Network Interface(*)\Packets Received DiscardedKQL
NIC.Transmit.QueueDrops.SecOFFPerformance0> 0> 100/secPerf counter \Network Interface(*)\Packets Outbound DiscardedKQL
NIC.Receive.Errors.SecOFFPerformance0> 0> 10/secPerf counter \Network Interface(*)\Packets Received ErrorsKQL
NIC.Transmit.Errors.SecOFFPerformance0> 0> 10/secPerf counter \Network Interface(*)\Packets Outbound ErrorsKQL
NIC.RDMA.Inbound.MBpsRulePerformance———Perf counter \RDMA Activity(*)\RDMA Inbound Bytes/secDCMA
NIC.RDMA.Outbound.MBpsRulePerformance———Perf counter \RDMA Activity(*)\RDMA Outbound Bytes/secDCMA
NIC.RSS.EnabledONConfigurationTrue (storage NICs)—FalseGet-NetAdapterRssKQL
NIC.RSS.QueueCountOFFConfiguration≥ (logical CPU count / NIC count)Below recommended1 (RSS not scaling)(Get-NetAdapterRss).NumberOfReceiveQueuesKQL
NIC.PFC.EnabledONConfigurationTrue (RDMA NICs)—FalseGet-NetAdapterQosKQL
NIC.ETS.EnabledONConfigurationTrue (RDMA NICs)—FalseGet-NetAdapterQosKQL
NIC.QoS.Policy.ConformanceOFFConfigurationConformantPartial (1 NIC drift)Non-conformantGet-NetQosPolicy + Get-NetQosFlowControl + Get-NetQosTrafficClassKQL
NIC.DCBX.WillingOFFConfigurationFalse (host override)—True (switch controls QoS)Get-NetAdapterQos | .DcbxSettingKQL
NIC.JumboFrame.CapableOFFConfigurationEnabled (if required)—Disabled (if RDMA/storage)Get-NetAdapterAdvancedProperty -RegistryKeyword *JumboPacket*KQL
NIC.DriverVersion.CurrentOFFConfigurationCurrentOne minor behindMajor behindGet-NetAdapter | .DriverVersion vs. HCI validated matrixKQL
NIC.SMBMultichannel.PathCountOFFConfiguration≥ 2 (per storage volume)10Get-SmbMultichannelConnection | .NumChannelsKQL
Cluster.Network.StateONAvailabilityUpPartiallyUpDownGet-ClusterNetworkKQL
Cluster.LiveMigration.Network.AvailableONConfiguration≥ 1—0 (no LM network)Get-ClusterNetwork | Where Role -like '*LiveMigration*'KQL
Cluster.Network.CrossNode.Latency.msOFFPerformance< 11–5> 5Test-NetConnection between node pairs on storage networkKQL

Storage Replica ​

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
StorageReplica.StatusONAvailabilityContinuouslyReplicatingWaitingForLogReplayFailed/SuspendedGet-SRPartnershipKQL on SR event log
StorageReplica.LagSecondsONPerformance< 3030–300> 300Get-SRGroupKQL
StorageReplica.LagBytesOFFPerformance< 1GB1–10GB> 10GBGet-SRGroup | .ReplicationLagKQL
StorageReplica.LogVolume.FreeSpace.PercentONPerformance> 2510–25< 10Get-SRGroup | .LogVolume + Get-VolumeKQL
StorageReplica.Bandwidth.MBpsRulePerformance———Perf counter \Storage Replica Statistics(*)\Total Bytes Sent/secKQL
StorageReplica.SyncProgress.PercentOFFPerformance100< 100 (syncing)StalledGet-SRGroup | .SyncPercentageKQL
StorageReplica.LastSyncAge.MinutesOFFConfiguration< 55–60> 60Get-SRGroup | .LastSyncTimeKQL
StorageReplica.Event.ErrorONAvailability0—≥ 1Event log Microsoft-Windows-StorageReplica/Operational ErrorsKQL Event

Layer 2 — Cluster-resident platform signals ​

Arc Resource Bridge / MOC ​

Logical nameDimensionHealthyWarningCriticalSource
ARB.VM.PowerStateAvailabilityRunning—Stopped/FailedGet-VM "Resource Bridge VM" + Resource Health
ARB.MOC.Service.StateAvailabilityRunning—StoppedGet-MocConfig / service state
ARB.ControlPlane.ReachableAvailabilityReachableLatency > 2sUnreachablekubectl --kubeconfig probe
ARB.K8s.PodHealthAvailabilityAll Running1 NotReady> 1 NotReadykubectl get pods
ARB.K8s.NodeHealthAvailabilityAll Ready1 NotReady> 1 NotReadykubectl get nodes

AKS Arc platform ​

Logical nameDimensionHealthyWarningCriticalSource
AKSArc.HostPool.StateAvailabilitySucceededUpdatingFailedARM resource state
AKSArc.ControlPlane.ReachableAvailabilityReachableLatency > 2sUnreachableAPI health probe

Arc agent — locally observable (ADR 0011 Tier A) ​

These signals do not require the SCOM agent to call Azure. All data comes from local services, registry keys, and the Microsoft-AzureArc-HybridAgent/Operational event channel. Target class: AzureLocal.Node. See ADR 0011.

Logical nameDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
ArcAgent.HIMDS.Service.StateAvailabilityRunning—StoppedGet-Service "HIMDS"KQL Event
ArcAgent.GCArcService.StateAvailabilityRunning—StoppedGet-Service "GCArcService"KQL Event
ArcAgent.ConnectionStatus.LocalAvailabilityConnectedStaleDisconnectedRegistry HKLM:\SOFTWARE\Microsoft\Azure Connected Machine Agent\Config → statusKQL
ArcAgent.Heartbeat.EventLog.AgeMinAvailability< 55–15> 15 or no eventEvent log Microsoft-AzureArc-HybridAgent/Operational Event ID 50 / 70KQL Event
ArcAgent.LastHeartbeat.RegistryAgeAvailability< 55–60> 60Registry HKLM:\SOFTWARE\Microsoft\Azure Connected Machine Agent\Config → lastHeartbeatTimeKQL
ArcAgent.ExtensionManager.Service.StateAvailabilityRunning—StoppedGet-Service "ExtensionService"KQL Event
ArcAgent.GuestConfigAgent.StateAvailabilityRunning—StoppedGet-Service "GCService"KQL Event

Arc extensions — installation & health (ADR 0011 Tier A) ​

Locally verified via registry and service state. No ARM call required. Required extensions for a supported Azure Local deployment. Target class: AzureLocal.Node.

Logical nameDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
Extension.AMA.InstalledConfigurationTrue—FalseRegistry HKLM:\SOFTWARE\Microsoft\Azure Connected Machine Agent\Extensions\AzureMonitorWindowsAgent → StatusKQL
Extension.AMA.Service.StateAvailabilityRunning—StoppedGet-Service "AzureMonitorWindowsAgent"KQL Event from Microsoft-AzureMonitorWindowsAgent/Operational
Extension.AMA.Version.CurrentConfigurationCurrentOne minor behindMajor behindRegistry version vs. HCI validated matrixKQL
Extension.DCMA.InstalledConfigurationTrue—FalseRegistry ...\Extensions\AzureEdgeTelemetryAndDiagnostics → StatusKQL
Extension.DCMA.Service.StateAvailabilityRunning—StoppedGet-Service "AzHCSvc"KQL Event
Extension.OsSettings.InstalledConfigurationTrue—FalseRegistry ...\Extensions\WindowsOSSettings → StatusKQL
HCI.Registration.StatusConfigurationConnectedOut-of-policy < 30dOut-of-policy > 30dRegistry HKLM:\SOFTWARE\Microsoft\AzureStackHCI → RegistrationStatusARM connectivityStatus
DCMA.LastUpload.RegistryAgeMinAvailability< 1515–60> 60Registry HKLM:\SOFTWARE\Microsoft\AzureStackHCI → LastConnectedTimeKQL

Cloud Agent / DCMA (service health) ​

Logical nameDimensionHealthyWarningCriticalSource
DCMA.Service.StateAvailabilityRunning—StoppedService state on each node
DCMA.LastHeartbeat.MinutesAvailability< 55–15> 15Telemetry pipeline + KQL Heartbeat
AMA.Service.StateAvailabilityRunning—StoppedAzureMonitorWindowsAgent extension state

HCI registration ​

Logical nameDimensionHealthyWarningCriticalSource
HCI.Registration.StatusConfigurationConnectedOut-of-policy < 30dOut-of-policy > 30dARM property connectivityStatus
HCI.LastConnected.MinutesAvailability< 1515–60> 60ARM lastBillingMeterUpload

Layer 3 — Azure-side signals ​

All L3 signals leverage Resource Health (free) + Activity Log (free) + Resource Graph queries. See Prerequisites.

HCI Cluster resource ​

Logical nameDimensionHealthyWarningCriticalSource
HCICluster.ProvisioningStateConfigurationSucceededUpdatingFailedARM
HCICluster.ConnectionStatusAvailabilityConnectedNotYetRegisteredDisconnectedARM
HCICluster.ResourceHealthAvailabilityAvailableDegradedUnavailableResource Health

Arc-enabled Server (per node) ​

Logical nameDimensionHealthyWarningCriticalSource
ArcServer.StatusAvailabilityConnectedStale (< 1h)DisconnectedARM status
ArcServer.LastStatusChange.MinutesAvailability< 55–60> 60ARM

Custom Location ​

Logical nameDimensionHealthyWarningCriticalSource
CustomLocation.ProvisioningStateConfigurationSucceeded—FailedARM
CustomLocation.NamespacePresentConfigurationTrue—FalseARM

Logical Networks ​

Logical nameDimensionHealthyWarningCriticalSource
LogicalNetwork.ProvisioningStateConfigurationSucceeded—FailedARM
LogicalNetwork.IPPool.UsedPctPerformance< 7070–90> 90ARM ipAllocations

Identities (MI + SPN) ​

Logical nameDimensionHealthyWarningCriticalSource
MI.ExistsConfigurationTrue—FalseMicrosoft Graph + ARM
MI.RoleAssignments.RequiredConfigurationAll present1 missing> 1 missingARM Authorization
SPN.ExistsConfigurationTrue—FalseMicrosoft Graph
SPN.Credential.ExpiryDaysConfiguration> 307–30< 7Microsoft Graph
SPN.RoleAssignments.RequiredConfigurationAll present1 missing> 1 missingARM Authorization

Key Vault ​

Logical nameDimensionHealthyWarningCriticalSource
KeyVault.ResourceHealthAvailabilityAvailableDegradedUnavailableResource Health
KeyVault.ReachableAvailabilityReachableLatency > 2sUnreachableKQL on KeyVaultProperties
KeyVault.Secret.ExpiryDays (per required secret)Configuration> 307–30< 7Key Vault data plane (with permission)
KeyVault.AccessPolicy.DriftSecurityNoneDrift on 1 principalDrift > 1 principalARM

Storage Account ​

Logical nameDimensionHealthyWarningCriticalSource
StorageAccount.ResourceHealthAvailabilityAvailableDegradedUnavailableResource Health
StorageAccount.RedundancyConfigurationAs expected—DriftARM SKU
StorageAccount.NetworkACL.DriftSecurityNoneDriftPublicARM networkAcls

RBAC / role assignments ​

Logical nameDimensionHealthyWarningCriticalSource
RBAC.RequiredAssignmentsConfigurationAll present1 missing> 1 missingARM Authorization
RBAC.UnexpectedAssignmentsSecurity0≤ 2> 2ARM Authorization

Update Manager linkage ​

Logical nameDimensionHealthyWarningCriticalSource
UpdateManager.LinkageConfigurationLinked—MissingARM
UpdateManager.LastAssessment.DaysConfiguration< 77–30> 30ARM

Data Collection Rules ​

Logical nameDimensionHealthyWarningCriticalSource
DCR.ExistsConfigurationTrue—FalseARM
DCR.AssociatedConfigurationAll nodesSomeNoneARM dataCollectionRuleAssociations
DCR.UnexpectedReplacementConfigurationFalse—TrueARM property + Insights doc warning

Log Analytics Workspace linkage ​

Logical nameDimensionHealthyWarningCriticalSource
LAW.ReachableAvailabilityReachable—UnreachableKQL Heartbeat from AMA
LAW.Ingestion.LatencyMinPerformance< 55–30> 30KQL _TimeReceived - TimeGenerated
LAW.RetentionDaysConfigurationAs expected—DriftARM

Free signals — Resource Health & Activity Log ​

For every Azure resource in the model, two signals are available with no extra setup:

SourceUse asNotes
Resource HealthPer-resource AvailabilityAvailable / Degraded / Unavailable / Unknown — auto-mapped to model state
Activity LogPer-resource Configuration adverse eventsFiltered for adverse events; surfaces ARM operation failures

These should be wired up first on every L3 entity before more expensive signals.

Customization tier overlays ​

Default values shown above are Standard tier. Lab and Strict tiers shift thresholds — see Customization for the full tier files. Example for Volume.FreeSpace:

TierWarning atCritical atReasoning
Lab< 5%< 1%Don't page on lab clusters
Standard< 25%< 10%Default — operational headroom
Strict< 30%< 15%High-density / latency-sensitive workloads

References ​

Released under the MIT License.