Azure resource management

How to check service health in Azure

Check Azure service issues and maintenance with Azure PowerShell and Resource Graph, open Service Health in the Azure portal, or run Altivane's Azure Service Health report.

By the Published

To check service health in Azure, read the Service Health events for your subscriptions: service issues, planned maintenance, health advisories and security advisories. Service Health shows only what affects the subscriptions and regions you use, and the sensitive parts of a security advisory need more than the Reader role.

Choose the method that fits the job
MethodBest fit
PowerShellA CSV of every Service Health event across your enabled subscriptions, active ones first.
Admin centreFollowing an incident as it happens, with its updates and the resources it affects.
AltivaneRecommended for regular reviews, with each notice's services and regions in a workbook.

Before you start

Use an account with the Reader role, or higher, on each subscription: that is enough to see Service Health events. The sensitive fields of a security advisory, such as the resources it affects, need Owner, Contributor or a custom role with the Security Advisory permissions, and billing updates need Owner or Contributor.

Know what is left out. Emerging issues aren't tied to a subscription, so Azure Resource Graph doesn't have them, and Microsoft says query results update within about 5 minutes. The examples read and export; they don't create alerts or change anything. The script's finally block disconnects the account and clears its saved Azure contexts.

Option 1

Check service health with PowerShell

Install the modules once. The script queries the ServiceHealthResources table in Resource Graph across the enabled subscriptions, follows every page of results, and saves 1 row for each event in each subscription.

PowerShell
Install-Module -Name Az.Accounts, Az.ResourceGraph -Repository PSGallery -Scope CurrentUser
PowerShell
$ErrorActionPreference = 'Stop'
Connect-AzAccount -ErrorAction Stop
try {
    $subscriptionIds = @(
        Get-AzSubscription | Where-Object State -eq 'Enabled' | Select-Object -ExpandProperty Id
    )
    if ($subscriptionIds.Count -eq 0) {
        Write-Output 'No enabled subscriptions are available to this account.'
        return
    }
    $query = @(
        'ServiceHealthResources'
        '| where type =~ "Microsoft.ResourceHealth/events"'
        '| project id, subscriptionId,'
        'eventType = tostring(properties.EventType), status = tostring(properties.Status),'
        'level = tostring(properties.EventLevel), title = tostring(properties.Title),'
        'trackingId = tostring(properties.TrackingId),'
        'impactStart = todatetime(tolong(properties.ImpactStartTime)),'
        'impactMitigation = todatetime(tolong(properties.ImpactMitigationTime)),'
        'lastUpdate = coalesce(todatetime(tolong(properties.LastUpdateTime)),'
        'todatetime(properties.LastUpdateTime))'
        '| order by id asc'
    ) -join ' '
    $rows = [System.Collections.Generic.List[object]]::new()
    $skipToken = $null
    do {
        $arguments = @{ Query = $query; Subscription = $subscriptionIds; First = 1000 }
        if ($skipToken) { $arguments.SkipToken = $skipToken }
        $page = Search-AzGraph @arguments
        foreach ($record in $page.Data) { $rows.Add($record) }
        $skipToken = $page.SkipToken
    } while ($skipToken)
    if ($rows.Count -eq 0) {
        Write-Output 'No Service Health events were found for the enabled subscriptions.'
    } else {
        $active = @($rows | Where-Object status -eq 'Active')
        $rows | Sort-Object @{ Expression = { $_.status -eq 'Active' }; Descending = $true },
            @{ Expression = 'lastUpdate'; Descending = $true } |
            Select-Object eventType, status, level, title, trackingId, impactStart,
                impactMitigation, lastUpdate, subscriptionId |
            Export-Csv -Path './service-health.csv' -NoTypeInformation -Encoding utf8
        Write-Output "$($rows.Count) events saved, $($active.Count) active."
    }
} finally {
    Disconnect-AzAccount | Out-Null
}

The CSV holds each event's type, status, level, title, tracking ID, impact times and last update, for each subscription it touches. The query converts the times with todatetime(tolong()), as Microsoft's sample queries do. eventType is ServiceIssue, PlannedMaintenance, HealthAdvisory or SecurityAdvisory, among others. The same samples count planned maintenance and advisories as current until their mitigation time passes, so read impactMitigation as well as status for those.

Option 2

Check Service Health in the Azure portal

  1. Sign in to the Azure portal with an account that can read the subscriptions.
  2. Search for Service Health and open it.
  3. Select Service issues, Planned maintenance, Health advisories and Security advisories in turn to see what is current for your subscriptions.
  4. Select an event for its summary and updates, and open Impacted Resources for the resources it affects.
  5. Select Health history for events that ended in the last 90 days.

Service Health suits following an incident while it is open. Leave alerts alone unless you mean to add one: a Service Health alert is a new rule in the subscription. For a record of every notice across subscriptions, use PowerShell or Altivane.

Common questions

How is Service Health different from the Azure status page?

The Azure status page is a global view of outages with a wide effect. Service Health is tailored to your subscriptions and regions, and also includes planned maintenance and advisories.

Why does a security advisory say access is required?

Its sensitive fields, such as the resources it affects, need Owner, Contributor or a custom role with the Security Advisory permissions. With Reader or Monitoring Reader you see the title, summary and updates only.

Are Service Health events in the activity log too?

Yes, in the activity log's Service Health category, which Azure keeps for 90 days: filter the activity log by event category to see them. An export of administrative operations alone, such as the one in how to export the activity log in Azure, leaves them out.

Microsoft references

Technical references checked on 7 November 2026. The example scripts have been reviewed and syntax checked; they have not been run against a live tenant.

Talk to us about Altivane

Questions, or pricing? Get in touch.

Contact us