Table of Contents
Graph-based Service Communications API is now the Route to Service Health Data
In January 2021, I wrote about how to use the Office 365 Service Communications API to programmatically retrieve the service health information that’s available in the Microsoft 365 admin center (Figure 1).
At the time, the API used the manage.office.com endpoint. In December 2021, Microsoft deprecated the manage.office.com endpoint and introduced the Service Communications Graph API as the replacement. In this article, I explain how to use the API with Microsoft Graph PowerShell SDK cmdlets to retrieve service health information.
Retrieving Service Health Data
As shown in Figure 1, the active items Microsoft is working on are those that impact the service in some way, usually by removing the ability of users to do something. To find these items, run the Get-MgServiceAnnouncementIssue cmdlet and filter for items classified as advisory with a status of ‘serviceDegration’:
[array]$ServiceHealthItems = Get-MgServiceAnnouncementIssue -All ` -Filter "classification eq 'Advisory' and status eq 'serviceDegradation'" | ` Sort-Object {$_.LastModifiedDateTime -as [datetime]} -Descending $ServiceHealthItems | Format-Table Id, Title, FeatureGroup, LastModifiedDateTime
If you don’t filter the service health items, the Get-MgServiceAnnouncementIssue cmdlet, including those where Microsoft resolved the issue (as with many SDK cmdlets, the All switch tells the cmdlet to fetch everything). This data reveals the areas where most issues occur. In my tenant, the 346 available issues broke down as follows:
$Data = Get-MgServiceAnnouncementIssue -All $Data | Group-Object FeatureGroup -Noelement | Sort-Object Count -Descending | Format-Table Name, Count -AutoSize Name Count ---- ----- Teams Components 80 Administration 39 E-Mail and calendar access 27 SharePoint Features 25 Portal 23 Management and Provisioning 22 Microsoft Defender for Endpoint 21 Cloud App Security 13 Viva Engage 10
Another interesting grouping is by service:
$Data | Group-Object Service -Noelement | Sort-Object Count -Descending | Format-Table Name, Count -AutoSize Name Count ---- ----- Microsoft Teams 80 Microsoft 365 suite 64 Exchange Online 60 Microsoft Defender XDR 32 SharePoint Online 30 Microsoft Defender for Cloud Apps 25 Microsoft Viva 12 OneDrive for Business 8
The start date for the oldest issue was March 1, 2023. The oldest last modified date for an issue was July 31, 2023. This suggests that Microsoft might keep about six months of service issue data online. Your mileage might vary.
Fetching Overall Service Health Data
Underneath the advisory items, the Microsoft 365 admin center displays an overview showing the health for individual services like Exchange Online, Teams, SharePoint Online, and so on. This information is accessible by running the Get-MgServiceAnnouncementHealthOverview cmdlet. In my tenant, this generates a list of 32 individual services, some of which (like Sway and Microsoft Managed Desktop), I’m not interested in. I therefore amend the output by filtering the services that I consider most important:
[array]$ImportantServices = "Exchange", "Teams", "SharePoint", "OrgLiveID", "Planner", "microsoftteams", "O365Client", "OneDriveForBusiness" [array]$ImportantServiceStatus = Get-MgServiceAnnouncementHealthOverview | Where-Object {$_.Id -in $ImportantServices} $ImportantServiceStatus | Sort-Object Service | Format-Table Service, Status -AutoSize Service Status ------- ------ Exchange Online serviceDegradation Microsoft 365 apps serviceOperational Microsoft Entra serviceOperational Microsoft Teams serviceDegradation Planner serviceOperational SharePoint Online serviceDegradation
Using Service Health Data to Highlight Current Advisories
Many people will be perfectly happy to access service health information via the Microsoft 365 admin center. The advantage of using an API to retrieve the same information is that you can then use it in whatever way you think appropriate. As a working example to demonstrate what’s possible, I wrote a script that can run interactively or as an Azure Automation runbook using a managed identity.
The script retrieves the open service health advisories and creates an email with an HTML-format report containing the service data that is sent to nominated recipients (any mixture of mail-enabled objects, including individual mailboxes, distribution lists, and Microsoft 365 groups). The idea is to keep the recipients updated about progress with open issues that Microsoft is working on. Figure 2 shows an example email generated using the service advisories published in my tenant.
After it’s extracted, the report can be disseminated in other ways. For instance, you could publish it as a Teams channel message.
You can download the script from GitHub.
Disrupted Change
Changing the details of an API is always disruptive. It’s not just the new endpoint. It’s also the way that the API returns data. Everything must be checked and verified. At least now the Service Communications API is part of the Microsoft Graph. As such, the level of change should be minimal in the future and we have the added benefit of PowerShell cmdlets to work with.
Learn how to exploit the data available to Microsoft 365 tenant administrators through the Office 365 for IT Pros eBook. We love figuring out how things work.
I have been doing some of the API programming. There seem to be limitations on the amount of data can be returned for a given query. This led to an investigation of webhooks. It seems like there is a great deal of information that can be pulled from real time queries. Is this a good direction? Or are webhooks not a good long term approach?
What do you want to use webhooks for?
We have noticed that the SendGrid API’s has a maximum limitation of 1000 items per query when we are gathering reporting information. We are tracking volume, bounces, blocks etc. Some of our API keys send more than 1000 emails a day. They also throttle the queries so that our reporting is slower by virtue of explicit delays added to avoid the limits. SendGrid themselves suggested Webhooks as a solution for gathering real time data. IT actually seems like a good solution. I have also noticed that webhooks are available for all kinds of triggering available for Azure, GitHub and other systems for real time triggering and reporting. The coding associated with Webhooks is much more involved than API programing. I am wondering if I have found a solution or if I am going down a rabbit hole. If these hooks and triggers are going to be around and represent a natural next step to reporting and event responses, then they are worthy of time and energy they will take. However, if this is considered an antiquated technology or Microsoft is going to be phasing out support for them, then it’s not worth the effort to develop skills in this area.
You always seem to know the mindset at Microsoft. Any insights in this area are always helpful.
I have no idea because I have never worked with SendGrid. Throttling is always a possibility when working with cloud services and the usual technique is to build in microdelays so that a process doesn’t become a candidate for throttling. I don’t think webhooks will be phased out because they are used in so many places.