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.
Network ports to open
Section titled “Network ports to open”From the DumbMonit server (or its relay agent) to the device:
| Port | Protocol | Purpose |
|---|---|---|
| 443 | TCP | Microsoft Graph API (HTTPS, graph.microsoft.com) |
| 443 | TCP | Microsoft sign-in, token request (HTTPS, login.microsoftonline.com) |
What it watches
Section titled “What it watches”All metrics are prefixed dumbmonit_m365_.
| Metric | Labels | Meaning |
|---|---|---|
service_ok | service | 1 while the service reports a healthy state (operational, restored, resolved, mitigated), 0 otherwise. |
services, services_degraded | Services listed, and how many are not healthy. | |
incidents_active, advisories_active | Unresolved service issues, by classification. | |
service_issues | service, classification | Unresolved issues per service (incident or advisory). |
license_used_percent | sku | Assigned units over purchased units, in percent. |
license_consumed, license_enabled, license_available | sku | Assigned, purchased and remaining units. |
licenses_exhausted | Number of paid licenses with every unit assigned. | |
risky_users, risky_users_high | Users at risk, and those at high risk. | |
signin_failures_1h | Failed sign-ins of the last hour (at most 100); only when risky users cannot be read. | |
issues_readable, licenses_readable, risky_readable, signins_readable | 1 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 monitor page
Section titled “The monitor page”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”-
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.
-
On the Overview page, copy the Application (client) ID and the Directory (tenant) ID.
-
Open API permissions → Add a permission → Microsoft Graph → Application permissions, add the permissions listed below, then click Grant admin consent.
-
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.
-
In DumbMonit, enter graph.microsoft.com as address, paste the client ID and the secret value, and fill in the Tenant ID option.
Required permissions
Section titled “Required permissions”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.
Credentials
Section titled “Credentials”| Credential | Fields |
|---|---|
| Entra application | Application (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.comby default. Change it only for a sovereign cloud (for examplehttps://login.microsoftonline.us, withgraph.microsoft.usas address). - Timeout per request (seconds) (15 s).
Troubleshooting
Section titled “Troubleshooting”“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.