Introduction
KQL query reference for Azure Arc-enabled servers. These queries help you monitor agent status, track deployments, troubleshoot issues, and maintain your Arc infrastructure.
Failed Extension Installations
Track Azure Arc extension installation failures across your environment.
Detailed Failed Extension Report
This query identifies all servers with failed Azure Arc extension installations, showing server name, user, resource group, extension name, and IP address.
AzureActivity | where OperationNameValue == "MICROSOFT.HYBRIDCOMPUTE/MACHINES/EXTENSIONS/WRITE" and ActivityStatusValue == "Failure" | extend Properties = (parse_json(Properties)) | extend Server = toupper(split(Properties.resource,"/")[0]) | extend ["Extension Name"] = split(Properties.resource,"/")[1] | extend User = Properties.caller | extend ["Resource Group"] = Properties.resourceGroup | extend ["Susbcription ID"] = Properties.SubscriptionId | extend ["IP Address"] = CallerIpAddress | extend ["Activity Status"] = Properties.activityStatusValue | project TimeGenerated, Server, User, ['Resource Group'], ["Extension Name"], ['Susbcription ID'], ['IP Address'], ["Activity Status"] | sort by TimeGenerated
Failed Extensions Summary by Server
This query summarizes failed extension installations by extension name and server name, showing the count and list of failed extensions per server.
AzureActivity | where OperationNameValue == "MICROSOFT.HYBRIDCOMPUTE/MACHINES/EXTENSIONS/WRITE" and ActivityStatusValue == "Failure" | extend Properties = parse_json(Properties) | extend Server = toupper(split(Properties.resource,"/")[0]) | extend ["Extension Name"] = tostring(split(Properties.resource,"/")[1]) | summarize ['Extensions Count'] = dcount(["Extension Name"]), ['List of Extensions'] = make_set(["Extension Name"]) by Server
Extension Activity Monitoring
Monitor all Azure Arc extension installations and modifications, including user activity, IP addresses, and status.
Extension Provisioning State Verification
List all Azure Arc extensions to verify they appear in inventory. Note: Just because an extension appears here doesn't mean it's functioning correctly.
resources | where type == "microsoft.hybridcompute/machines/extensions"
Failed Extension Provisioning States
Identify extensions assigned to servers but not working properly. This query shows all extensions where ProvisioningState is not "Succeeded", helping you find extensions that require attention.
resources | where type == "microsoft.hybridcompute/machines" | project ServerName = tostring(name) | join kind = inner ( resources | where type == "microsoft.hybridcompute/machines/extensions" | extend ServerName = tostring(split(tostring(id),"/",8)[0]) | extend ["Provisioning State"] = properties.provisioningState | where ["Provisioning State"] != "Succeeded" | extend Extension = name ) on ServerName | project ServerName, Extension,["Provisioning State"]
Get-AzConnectedMachineExtension
cmdlet to list machine extensions, then filter for non-acceptable states. This approach works well when you need to verify extension status during troubleshooting or automation workflows.
All Extension Write Operations
Track all extension installation and modification activities across Arc-enabled servers. Shows user, IP address, extension name, and status for security monitoring and troubleshooting.
AzureActivity | where OperationNameValue == "MICROSOFT.HYBRIDCOMPUTE/MACHINES/EXTENSIONS/WRITE" and ResourceProviderValue == "MICROSOFT.HYBRIDCOMPUTE" | extend Properties = (parse_json(Properties)) | extend Server = split(Properties.resource,"/")[0] | extend ["Extension Name"] = split(Properties.resource,"/")[1] | extend User = Properties.caller | extend ["Resource Group"] = Properties.resourceGroup | extend ["Susbcription ID"] = Properties.SubscriptionId | extend ["IP Address"] = CallerIpAddress | extend ["Activity Status"] = Properties.activityStatusValue | project TimeGenerated, Server, ['Extension Name'], User, ['Resource Group'], ['Susbcription ID'], ['IP Address'], ["Activity Status"] | sort by TimeGenerated
Deleted Server Tracking
Track who deleted Azure Arc-enabled servers from your environment.
Arc Server Deletion Audit
Identify deleted Azure Arc servers, including who deleted them, when, and from which resource group. Critical for security auditing and troubleshooting missing servers.
AzureActivity | where OperationNameValue == "MICROSOFT.HYBRIDCOMPUTE/MACHINES/DELETE" and ActivityStatusValue == "Success" | extend Properties = (parse_json(Properties)) | extend Server = toupper(split(Properties.resource,"/")[0]) | extend User = Properties.caller | extend ["Resource Group"] = Properties.resourceGroup | project TimeGenerated, Server, User, ['Resource Group'] | sort by TimeGenerated desc
Azure Monitoring Agent (AMA) Removal Detection
Detect when Azure Monitoring Agent extensions are removed from Arc-enabled servers. Critical for maintaining security monitoring coverage.
AMA Extension Removal Audit
Track AMA extension deletions across your Arc infrastructure. Shows who removed the extension, when, and from which server. Essential for Microsoft Sentinel monitoring and compliance.
AzureActivity | where OperationNameValue == "MICROSOFT.HYBRIDCOMPUTE/MACHINES/EXTENSIONS/DELETE" and ActivityStatusValue == "Success" | extend Properties = (parse_json(Properties)) | extend Server = toupper(split(Properties.resource,"/")[0]) | extend ["Extension Name"] = split(Properties.resource,"/")[1] | extend User = Properties.caller | extend ["Resource Group"] = Properties.resourceGroup | extend ["Susbcription ID"] = Properties.SubscriptionId | extend ["IP Address"] = CallerIpAddress | extend ["Activity Status"] = Properties.activityStatusValue | where ['Extension Name'] == "amawindows" or ['Extension Name'] == "azuremonitorwindowsagent" | project TimeGenerated, Server, User, ['Resource Group'], ["Extension Name"], ['Susbcription ID'], ['IP Address'], ["Activity Status"] | sort by TimeGenerated
amawindows
and azuremonitorwindowsagent
. Extension naming varies based on your Azure Arc implementation date.
New Server Onboarding Tracking
Identify new Azure Arc-enabled server onboardings to track environment expansion and detect unauthorized server registrations.
New Arc Server Onboardings
Track new Azure Arc server onboardings with server name, user, resource group, and subscription details. Use this query to monitor environment growth and security compliance.
AzureActivity | where OperationNameValue == "MICROSOFT.HYBRIDCOMPUTE/MACHINES/WRITE" and ActivityStatusValue == "Success" | extend Properties = (parse_json(Properties)) | extend Server = toupper(split(Properties.resource,"/")[0]) | extend User = Properties.caller | extend ["Resource Group"] = Properties.resourceGroup | extend ["Subscription ID"] = Properties.SubscriptionId | extend ["Activity Status"] = Properties.activityStatusValue | project TimeGenerated, Server, User, ['Resource Group'], ['Subscription ID'], ["Activity Status"] | sort by TimeGenerated desc
Failed Update Deployments
Track failed Azure Update Manager deployments on Arc-enabled servers to maintain patching compliance and troubleshoot update issues.
Failed Patch Installation Tracking
Identify failed update deployments from Azure Update Manager. Shows which servers failed to install patches, when, and why.
AzureActivity | where OperationNameValue == "MICROSOFT.COMPUTE/VIRTUALMACHINES/INSTALLPATCHES/ACTION" and ActivityStatusValue == "Failed" | extend Properties = (parse_json(Properties)) | extend Server = toupper(split(Properties.resource,"/")[0]) | extend User = Properties.caller | extend ["Resource Group"] = Properties.resourceGroup | extend ["Subscription ID"] = Properties.SubscriptionId | extend ["Activity Status"] = Properties.activityStatusValue | project TimeGenerated, Server, User, ['Resource Group'], ['Subscription ID'], ["Activity Status"] | sort by TimeGenerated desc
Resource Health & Connectivity Tracking
Monitor Azure Arc agent connectivity and track disconnection events to identify connectivity issues and agent failures.
Arc Agent Disconnection Tracking
Track Arc agent disconnection and reconnection events. Shows when servers lost connectivity (ActivityStatusValue = "Active") and when they reconnected (ActivityStatusValue = "Resolved"). Use this to identify connectivity patterns and investigate prolonged disconnections.
AzureActivity | where CategoryValue == "ResourceHealth" | where ResourceProviderValue == "MICROSOFT.HYBRIDCOMPUTE" | extend Properties = (parse_json(Properties)) | extend Server = toupper(split(Properties.resource,"/")[0]) | extend ["Resource Group"] = Properties.resourceGroup | extend ["Health Status"] = ActivityStatusValue | project TimeGenerated, Server, ['Resource Group'], ["Health Status"] | sort by TimeGenerated desc
Resource Graph Inventory Queries
Use these Resource Graph queries to inventory and track your Azure Arc-enabled servers across subscriptions.
List All Azure Arc Machines
Basic query to list all Azure Arc-enabled servers in your environment.
resources | where type == "microsoft.hybridcompute/machines"
Count Machines by Subscription and Resource Group
Aggregate Azure Arc machines by subscription and resource group to understand distribution across your environment.
resources | where type == "microsoft.hybridcompute/machines" | summarize machineCount = count() by subscriptionId, resourceGroup
Enrich with Subscription Names
Join Azure Arc machine data with subscription information to show subscription names alongside machine counts.
resources | where type == "microsoft.hybridcompute/machines" | project serverName = name, subscriptionId, resourceGroup | join kind=inner ( resourcecontainers | where type == "microsoft.resources/subscriptions" | project subscriptionName = name, subscriptionId ) on subscriptionId | summarize machineCount = count() by subscriptionId, subscriptionName, resourceGroup
Count Machines by Status
Track the operational status distribution of your Azure Arc machines (Connected, Disconnected, Error).
resources | where type == "microsoft.hybridcompute/machines" | extend machineStatus = tostring(properties.status) | summarize machineCount = count() by machineStatus
Agent Version Inventory
List all Arc-enabled servers with their agent versions and connection status. Use this to identify servers running outdated agents.
resources | where type == "microsoft.hybridcompute/machines" | extend ["Server Name"] = toupper(name) | extend ["Agent Version"] = properties.agentVersion | extend ["Connection Status"] = properties.status | project ["Server Name"], ["Agent Version"], ["Connection Status"]