Skip to content

Microsoft 365

Microsoft 365 through Microsoft Graph: services that are degraded or interrupted, active incidents and advisories, licenses about to run out, and users flagged at risk.

DumbMonit signs in as an Entra application (client credentials flow): it exchanges the application’s client ID and secret for a one-hour token at login.microsoftonline.com, keeps it until it expires, and reads graph.microsoft.com once a minute. Every call is a read; the application only holds read permissions.

This is an Internet API: the address of the device is the API’s (graph.microsoft.com), not a machine’s, and nothing in your network is contacted.

From the DumbMonit server (or its relay agent) to the device:

PortProtocolPurpose
443TCPMicrosoft Graph API (HTTPS, graph.microsoft.com)
443TCPMicrosoft sign-in, token request (HTTPS, login.microsoftonline.com)

All metrics are prefixed dumbmonit_m365_.

MetricLabelsMeaning
service_okservice1 while the service reports a healthy state (operational, restored, resolved, mitigated), 0 otherwise.
services, services_degradedServices listed, and how many are not healthy.
incidents_active, advisories_activeUnresolved service issues, by classification.
service_issuesservice, classificationUnresolved issues per service (incident or advisory).
license_used_percentskuAssigned units over purchased units, in percent.
license_consumed, license_enabled, license_availableskuAssigned, purchased and remaining units.
licenses_exhaustedNumber of paid licenses with every unit assigned.
risky_users, risky_users_highUsers at risk, and those at high risk.
signin_failures_1hFailed sign-ins of the last hour (at most 100); only when risky users cannot be read.
issues_readable, licenses_readable, risky_readable, signins_readable1 when that read was allowed, 0 when Microsoft refused it.

Free and trial licenses (Power BI free, Power Automate free, Windows Store…) and licenses with no purchased unit are ignored: their gauge means nothing.

Only the service health is mandatory. If your tenant has no Entra ID P2 license, the risky users read is refused: risky_readable is 0, DumbMonit counts the failed sign-ins of the last hour instead (Entra ID P1 and AuditLog.Read.All), and if that is refused too the probe still succeeds without any risk data.

The built-in rules that apply:

  • Microsoft 365 service degraded: a service is degraded, interrupted or under investigation for 10 minutes (Advisory, reminded every 6 hours).
  • Microsoft 365 licenses exhausted: every unit of a paid license is assigned (Advisory, reminded daily).
  • Microsoft 365 licenses nearly full: more than 95 % of a paid license is assigned (Info, reminded weekly).
  • Microsoft 365 users at risk: at least one user is flagged at risk (Advisory, reminded daily).

The Microsoft 365 panel says what is wrong in a sentence, shows the degraded services, the active incidents, the exhausted licenses and the users at risk, then lists the services with their state, the active incidents and the licenses with their usage.

Create a read-only Entra application for DumbMonit

Section titled “Create a read-only Entra application for DumbMonit”
  1. In the Microsoft Entra admin center (entra.microsoft.com), open Entra ID → App registrations → New registration, name it DumbMonit, keep a single tenant and register it.

  2. On the Overview page, copy the Application (client) ID and the Directory (tenant) ID.

  3. Open API permissions → Add a permission → Microsoft Graph → Application permissions, add the permissions listed below, then click Grant admin consent.

  4. Open Certificates & secrets → New client secret and copy its Value (not the Secret ID): it is shown once and it expires, so note the date.

  5. In DumbMonit, enter graph.microsoft.com as address, paste the client ID and the secret value, and fill in the Tenant ID option.

Add them as application permissions (not delegated), then grant admin consent.

  • ServiceHealth.Read.All — Reads the health of each service and its active incidents (required).
  • LicenseAssignment.Read.All — Reads purchased and assigned license counts per SKU (optional).
  • IdentityRiskyUser.Read.All — Reads users flagged at risk; needs Entra ID P2 (optional).
  • AuditLog.Read.All — Counts failed sign-ins when risk data is unavailable; needs Entra ID P1 (optional).

Vendor documentation: https://learn.microsoft.com/en-us/graph/api/serviceannouncement-list-healthoverviews

The client secret expires (24 months at most). When it does, DumbMonit shows “Microsoft refused the application”: create a new secret and paste its value. Add the Microsoft Entra ID integration to be warned before that happens.

CredentialFields
Entra applicationApplication (client) ID and the client secret Value.

Address: graph.microsoft.com. Options:

  • Tenant ID (required): the Directory (tenant) ID, a GUID, or a verified domain name.
  • Sign-in URL: https://login.microsoftonline.com by default. Change it only for a sovereign cloud (for example https://login.microsoftonline.us, with graph.microsoft.us as address).
  • Timeout per request (seconds) (15 s).

“Microsoft refused the application”: the client ID or the secret is wrong, or the secret expired. Copy the secret Value, not its ID.

“Microsoft knows no tenant”: the Tenant ID is wrong; copy the Directory (tenant) ID of the app registration.

“Microsoft Graph refused … (403): grant the application the ServiceHealth.Read.All application permission”: add it and click Grant admin consent; it can take a few minutes to apply.

risky_readable stays 0: the tenant has no Entra ID P2 license, or IdentityRiskyUser.Read.All was not granted. Nothing is broken.

No licenses listed: LicenseAssignment.Read.All is missing (licenses_readable is 0), or every license of the tenant is free.