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.StateONAvailabilityRunningStopped/DegradedGet-ClusterResource "Cluster Name"DCMA cluster_status
Cluster.Quorum.StateONAvailabilityNormalNoWitnessFailedGet-ClusterQuorumKQL MicrosoftHCI_Cluster_Quorum
Cluster.Quorum.Witness.ReachableONAvailabilityReachableUnreachableGet-ClusterQuorum witness type + Test-NetConnection to witness endpointKQL on cluster event log
Cluster.Quorum.WitnessTypeOFFConfigurationCloudWitness or FileShareNone (no witness configured)Get-ClusterQuorum | .WitnessTypeKQL
Cluster.NodeCount.LiveONAvailabilityAlln-1< n-1Get-ClusterNodeDCMA cluster_node_count
Cluster.FunctionalLevel.CurrentOFFConfigurationMatches OSBelow 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.ConfiguredOFFConfigurationPresentMissing (DNS suffix required for cluster name resolution)Registry HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\ParametersSearchListKQL
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≥ 1Get-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.HealthONAvailabilityHealthyFailed/ErrorGet-SolutionUpdateEnvironment.StateKQL
LCM.Update.PendingCriticalONConfiguration0≥ 1Get-SolutionUpdate | Where State -eq 'Failed'KQL
LCM.Update.LastRunResultONConfigurationSucceededFailedGet-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.PreCheckFailedONConfigurationPassedFailedGet-SolutionUpdateEnvironment → pre-check resultKQL

Node

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
Node.Up.StateONAvailabilityUpDown/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.PendingRebootOFFConfigurationFalseTrueRegistry HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPendingKQL Event
Node.Maintenance.ModeONAvailabilityNotInMaintenanceInMaintenance > 4hGet-ClusterNode | .NodeDrainStatusKQL
Node.TimeSync.OffsetSecondsOFFConfiguration< 55–30> 30w32tm /query /statusPhase OffsetKQL Event from Microsoft-Windows-Time-Service/Operational
Node.TimeSync.Source.ReachableOFFAvailabilityReachableUnreachable/Unsynchronizedw32tm /query /statusSourceKQL
Node.SecureBoot.StateOFFSecurityEnabledDisabledConfirm-SecureBootUEFI or Get-SecureBootPolicyKQL
Node.BitLocker.OSDrive.StateOFFSecurityOnOff or SuspendedGet-BitLockerVolume -MountPoint CProtectionStatusKQL
Node.Defender.RealtimeProtectionOFFSecurityEnabledDisabledGet-MpComputerStatusRealTimeProtectionEnabledKQL Event
Node.Defender.SignatureAge.DaysOFFSecurity< 33–7> 7Get-MpComputerStatusAntivirusSignatureAgeKQL
Node.Defender.ThreatDetection.CountOFFSecurity0≥ 1Get-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.StateOFFAvailabilityRunningStoppedGet-Service WinRMKQL
Node.DNS.Azure.ResolutionOFFAvailabilityResolvesFailsResolve-DnsName management.azure.com from nodeKQL
Node.DNS.Internal.ResolutionOFFAvailabilityResolvesFailsResolve-DnsName <cluster-fqdn> from nodeKQL
Node.CrashDump.ConfiguredOFFConfigurationEnabledDisabled 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≥ 1Event 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.CountRulePerformanceGet-VM | Where State -eq 'Migrating'DCMA
Node.SMB.Bandwidth.InboundMBpsRulePerformancePerf counter \SMB Client Shares(*)\Bytes Received/secDCMA
Node.SMB.Bandwidth.OutboundMBpsRulePerformancePerf counter \SMB Client Shares(*)\Bytes Sent/secDCMA

Hyper-V Host

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
Node.HyperV.StateONAvailabilityRunningStopped/DegradedGet-VMHost + Hyper-V VMMS service stateKQL on Microsoft-Windows-Hyper-V-VMMS/Operational
Node.HyperV.vSwitch.BindingONConfigurationAll NICs boundvSwitch 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≥ 1Get-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 VMQVMQ exhaustedGet-VMNetworkAdapter | Where VmqUsage -ne 'Enabled'KQL
Node.HyperV.SRIOVActiveOFFConfigurationEnabled where expectedNot 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> 0Unexpected 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.PolicyONConfigurationConfiguredMissing(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≥ 1Event 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.MBpsRulePerformancePerf counter \Storage Spaces Drt(*)\Read Bytes/secDCMA
StoragePool.Write.Throughput.MBpsRulePerformancePerf counter \Storage Spaces Drt(*)\Write Bytes/secDCMA
StoragePool.Read.IOPSRulePerformancePerf counter \Storage Spaces Drt(*)\Read I/O Operations/secDCMA
StoragePool.Write.IOPSRulePerformancePerf 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> 0Unexpected 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.InMaintenanceOFFConfigurationFalseTrue(Get-ClusterSharedVolume).SharedVolumeInfo.MaintenanceModeKQL
Volume.IOPS.Read.SecRulePerformancePerf counter \Cluster CSV File System(*)\Reads/secDCMA
Volume.IOPS.Write.SecRulePerformancePerf counter \Cluster CSV File System(*)\Writes/secDCMA
Volume.Throughput.Read.MBpsRulePerformancePerf counter \Cluster CSV File System(*)\Read Bytes/secDCMA
Volume.Throughput.Write.MBpsRulePerformancePerf 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.EnabledRuleConfigurationGet-DedupVolume | .EnabledKQL
Volume.Dedup.SavedPercentOFFConfigurationMatch baselineUnexpectedly low (dedup configured)Get-DedupVolume.SavingsRateKQL
Volume.Dedup.LastOptimizationAge.DaysOFFConfiguration< 33–7> 7Get-DedupStatus.LastOptimizationTimeKQL
Volume.ReFS.Compression.EnabledRuleConfigurationGet-Volume | .FileSystemLabel + Get-Item flagKQL
Volume.VSS.Writer.StateOFFAvailabilityStableFailed/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.MBpsRulePerformancePerf counter \Cluster Storage Cache Stores(*)\Read Bytes From Cache/secDCMA
StorageTier.Cache.Write.Throughput.MBpsRulePerformancePerf counter \Cluster Storage Cache Stores(*)\Write Bytes to Cache/secDCMA
StorageTier.Cache.FlushRate.MBpsOFFPerformance< 80% capacityAt rated capacity sustainedPerf counter \Cluster Storage Cache Stores(*)\Flush Bytes/secDCMA
StorageTier.Cache.DriveCount.ExpectedONConfigurationMatchMismatch(Get-StorageTier -MediaType NVMe | Get-PhysicalDisk).CountKQL
StorageTier.Capacity.DriveCount.ExpectedONConfigurationMatchMismatch(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 useRetiredGet-PhysicalDisk | .UsageDCMA
PhysicalDisk.PredictiveFailureONAvailabilityFalseTrueGet-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.PowerOnHoursRuleConfigurationGet-StorageReliabilityCounter | .PowerOnHoursKQL
PhysicalDisk.Firmware.VersionOFFConfigurationCurrent (vs. HCL matrix)One version behindMajor behindGet-PhysicalDisk | .FirmwareVersionKQL
PhysicalDisk.MediaType.MismatchOFFConfigurationConsistent per fault domainMixed 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.BusTypeRuleConfigurationGet-PhysicalDisk | .BusTypeKQL
StoragePool.PhysicalDisk.Failed.CountONAvailability01 (within fault tolerance)> 1Get-PhysicalDisk | Where HealthStatus -ne 'Healthy'DCMA
StoragePool.PhysicalDisk.Warning.CountONAvailability0≥ 1Get-PhysicalDisk | Where HealthStatus -eq 'Warning'DCMA
StoragePool.PhysicalDisk.Retired.CountONConfiguration0≥ 1Get-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.HealthONAvailabilityUpDownGet-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.ExpectedONConfigurationMatchMissing adapter in intent(Get-NetIntentStatus).Adapters.Count vs discoveredKQL
NetIntent.Management.Gateway.ReachableOFFAvailabilityReachableUnreachableTest-NetConnection <default-gateway> -Port 80 on management intentKQL
NetIntent.Management.SCOM.Server.ReachableOFFAvailabilityReachableUnreachableTest-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.DedicatedOFFConfigurationDedicatedShared with managementGet-ClusterNetwork | Where Role -like '*Internal*' isolation checkKQL

Physical NIC & RDMA

Logical nameDefaultDimensionHealthyWarningCriticalSCOM sourceAzure Monitor source
NIC.Physical.StatusONAvailabilityUpDown / 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.MBpsRulePerformancePerf counter \RDMA Activity(*)\RDMA Inbound Bytes/secDCMA
NIC.RDMA.Outbound.MBpsRulePerformancePerf 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≥ 10 (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.MBpsRulePerformancePerf 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.PowerStateAvailabilityRunningStopped/FailedGet-VM "Resource Bridge VM" + Resource Health
ARB.MOC.Service.StateAvailabilityRunningStoppedGet-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.StateAvailabilityRunningStoppedGet-Service "HIMDS"KQL Event
ArcAgent.GCArcService.StateAvailabilityRunningStoppedGet-Service "GCArcService"KQL Event
ArcAgent.ConnectionStatus.LocalAvailabilityConnectedStaleDisconnectedRegistry HKLM:\SOFTWARE\Microsoft\Azure Connected Machine Agent\ConfigstatusKQL
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\ConfiglastHeartbeatTimeKQL
ArcAgent.ExtensionManager.Service.StateAvailabilityRunningStoppedGet-Service "ExtensionService"KQL Event
ArcAgent.GuestConfigAgent.StateAvailabilityRunningStoppedGet-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.InstalledConfigurationTrueFalseRegistry HKLM:\SOFTWARE\Microsoft\Azure Connected Machine Agent\Extensions\AzureMonitorWindowsAgentStatusKQL
Extension.AMA.Service.StateAvailabilityRunningStoppedGet-Service "AzureMonitorWindowsAgent"KQL Event from Microsoft-AzureMonitorWindowsAgent/Operational
Extension.AMA.Version.CurrentConfigurationCurrentOne minor behindMajor behindRegistry version vs. HCI validated matrixKQL
Extension.DCMA.InstalledConfigurationTrueFalseRegistry ...\Extensions\AzureEdgeTelemetryAndDiagnosticsStatusKQL
Extension.DCMA.Service.StateAvailabilityRunningStoppedGet-Service "AzHCSvc"KQL Event
Extension.OsSettings.InstalledConfigurationTrueFalseRegistry ...\Extensions\WindowsOSSettingsStatusKQL
HCI.Registration.StatusConfigurationConnectedOut-of-policy < 30dOut-of-policy > 30dRegistry HKLM:\SOFTWARE\Microsoft\AzureStackHCIRegistrationStatusARM connectivityStatus
DCMA.LastUpload.RegistryAgeMinAvailability< 1515–60> 60Registry HKLM:\SOFTWARE\Microsoft\AzureStackHCILastConnectedTimeKQL

Cloud Agent / DCMA (service health)

Logical nameDimensionHealthyWarningCriticalSource
DCMA.Service.StateAvailabilityRunningStoppedService state on each node
DCMA.LastHeartbeat.MinutesAvailability< 55–15> 15Telemetry pipeline + KQL Heartbeat
AMA.Service.StateAvailabilityRunningStoppedAzureMonitorWindowsAgent 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.ProvisioningStateConfigurationSucceededFailedARM
CustomLocation.NamespacePresentConfigurationTrueFalseARM

Logical Networks

Logical nameDimensionHealthyWarningCriticalSource
LogicalNetwork.ProvisioningStateConfigurationSucceededFailedARM
LogicalNetwork.IPPool.UsedPctPerformance< 7070–90> 90ARM ipAllocations

Identities (MI + SPN)

Logical nameDimensionHealthyWarningCriticalSource
MI.ExistsConfigurationTrueFalseMicrosoft Graph + ARM
MI.RoleAssignments.RequiredConfigurationAll present1 missing> 1 missingARM Authorization
SPN.ExistsConfigurationTrueFalseMicrosoft 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 expectedDriftARM 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.LinkageConfigurationLinkedMissingARM
UpdateManager.LastAssessment.DaysConfiguration< 77–30> 30ARM

Data Collection Rules

Logical nameDimensionHealthyWarningCriticalSource
DCR.ExistsConfigurationTrueFalseARM
DCR.AssociatedConfigurationAll nodesSomeNoneARM dataCollectionRuleAssociations
DCR.UnexpectedReplacementConfigurationFalseTrueARM property + Insights doc warning

Log Analytics Workspace linkage

Logical nameDimensionHealthyWarningCriticalSource
LAW.ReachableAvailabilityReachableUnreachableKQL Heartbeat from AMA
LAW.Ingestion.LatencyMinPerformance< 55–30> 30KQL _TimeReceived - TimeGenerated
LAW.RetentionDaysConfigurationAs expectedDriftARM

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.