Microsoft Cloud Monitoring — Dynamics 365 & Business Central
Stand: 7. März 2026 System: Raspberry Pi 5 (raspip5, 192.168.178.199)
Inhaltsverzeichnis
- Übersicht
- Dynamics 365 CRM Exporter
- Azure App Registration
- Blackbox HTTP-Probes
- Grafana Dashboards
- Alert-Regeln
- Gatus Status-Page
- Schwellwerte
- Fehlerbehebung
1. Übersicht
Das Microsoft Cloud Monitoring überwacht die Erreichbarkeit und Performance von:
- Dynamics 365 CRM (
creativekirche.crm4.dynamics.com) — Customer Service Workspace - Business Central (
businesscentral.dynamics.com) — ERP/Finanzen - Microsoft Login (
login.microsoftonline.com) — Entra ID / OAuth - Outlook 365 (
outlook.office365.com) — E-Mail - Microsoft Service Health — offizielle Störungsmeldungen von Microsoft
Monitoring-Schichten
| Schicht | Tool | Was wird gemessen |
|---|---|---|
| HTTP-Erreichbarkeit | Blackbox Exporter | Ist die URL erreichbar? Wie lange dauert der Seitenaufruf? |
| CRM API Performance | Dynamics365 Exporter | Wie schnell antwortet die CRM-API? (WhoAmI, Accounts, Contacts, Cases) |
| Service Health | Dynamics365 Exporter (Graph API) | Meldet Microsoft eine Störung? |
| DNS-Auflösung | Blackbox Exporter (DNS) | Können die Firewalls die MS-Domains auflösen? |
| ICMP Ping | Blackbox Exporter | Netzwerk-Latenz zu Microsoft-Servern |
2. Dynamics 365 CRM Exporter
Container
| Eigenschaft | Wert |
|---|---|
| Container | dynamics365-exporter |
| Port | 9790 |
| Image | Custom Python Build |
| Code | /data/docker/monitoring/exporters/dynamics365/exporter.py |
| Dockerfile | /data/docker/monitoring/exporters/dynamics365/Dockerfile |
| Credentials | /home/ak/.env.dynamics |
| Scrape-Intervall | 60s |
Metriken
| Metrik | Beschreibung | Baseline |
|---|---|---|
dynamics365_auth_duration_seconds |
OAuth Token-Anfrage Dauer | ~125ms |
dynamics365_auth_success |
OAuth erfolgreich (1/0) | 1 |
dynamics365_api_whoami_duration_seconds |
WhoAmI API-Call (einfachster Call) | ~145ms |
dynamics365_api_accounts_duration_seconds |
Accounts-Abfrage (Top 5) | ~150ms |
dynamics365_api_contacts_duration_seconds |
Contacts-Abfrage (Top 5) | ~150ms |
dynamics365_api_incidents_duration_seconds |
Cases/Incidents-Abfrage (Top 5) | ~145ms |
dynamics365_api_total_duration_seconds |
Gesamtdauer aller API-Calls | ~585ms |
dynamics365_service_health_status |
MS Service Health (Enum) | serviceOperational |
dynamics365_active_issues_total |
Aktive MS-Störungen | 0 |
dynamics365_scrape_success |
Gesamter Scrape erfolgreich (1/0) | 1 |
Datenfluss
Exporter → OAuth Token (login.microsoftonline.com)
→ CRM API Calls (creativekirche.crm4.dynamics.com/api/data/v9.2/)
→ Graph API Service Health (graph.microsoft.com)
→ Prometheus Metriken (:9790/metrics)
→ Prometheus scrapet alle 60s
→ Grafana Dashboard + Alertmanager
3. Azure App Registration
| Eigenschaft | Wert |
|---|---|
| Name | CRM-Monitoring-Exporter |
| Tenant ID | 6745ed26-c599-4098-a610-c8825a6e077f |
| Client ID | 0d78a2cc-0f18-40fb-aec1-15a208cc3fe4 |
| Client Secret | in /home/ak/.env.dynamics |
API-Berechtigungen
| API | Berechtigung | Typ |
|---|---|---|
| Microsoft Graph | ServiceHealth.Read.All |
Anwendung (nicht delegiert!) |
| Dynamics CRM | user_impersonation |
Delegiert (nicht relevant für Client Credentials) |
Power Platform App User
- Umgebung: "Creative Kirche" (
creativekirche.crm4.dynamics.com) - Sicherheitsrolle: Serviceleser
- Wichtig: Die Default-Umgebung "Stiftung Creative Kirche" (
org4b8c5d9d.crm4.dynamics.com) ist LEER — nicht verwenden!
4. Blackbox HTTP-Probes
Alle Microsoft-Dienste werden von zwei Standorten per HTTP geprobt:
| Standort | Blackbox Exporter | Probe-Herkunft |
|---|---|---|
| Hauptstandort | Salto-Server (172.17.0.1:9117) |
10.128.40.x |
| Referenz | Lokal auf Pi (blackbox-exporter:9115) |
192.168.178.x |
Überwachte URLs
| URL | Dienst | Bemerkung |
|---|---|---|
https://creativekirche.crm4.dynamics.com |
Dynamics 365 CRM | Produktiv-Umgebung |
https://businesscentral.dynamics.com |
Business Central | Allgemein |
https://businesscentral.dynamics.com/creativekirche.onmicrosoft.com |
BC Tenant-spezifisch | |
https://login.microsoftonline.com |
Microsoft Login / Entra ID | |
https://outlook.office365.com |
Outlook 365 | Antwortet mit HTTP 417 (normal!) |
Wichtig: Outlook antwortet mit HTTP 417 (Expectation Failed). Dieser Statuscode muss in valid_status_codes der Blackbox-Config stehen:
- Lokal: /data/docker/monitoring/blackbox/blackbox.yml
- Salto: C:\blackbox_exporter\blackbox_exporter-0.25.0.windows-amd64\blackbox.yml
5. Grafana Dashboards
Microsoft Cloud Services (UID: microsoft-cloud-2026)
- Ordner: System
- Tags: CreativeKirche, dynamics365, businesscentral, m365
- Variable:
$standort(Hauptstandort / Referenz / Alle)
Panels: - Status-Übersicht: CRM, BC, Login, Outlook Erreichbarkeit + Auth + MS-Störungen - CRM API Performance: 6 Gauges (WhoAmI, Auth, Accounts, Contacts, Cases, Gesamt) - CRM API Verlauf: Timeseries mit Schwellwert-Linien - HTTP-Latenz: 3 Panels (CRM / BC / M365) + Gesamtvergleich - DNS-Auflösung pro Standort - ICMP Ping-Latenz - Schwellwerte-Referenz (eingeklappt)
CK Netze KLV (UID: ck-netze-klv-2026)
- "Microsoft Cloud" Stat-Panel prüft CRM + BC + Login Erreichbarkeit
- Verlaufschart "Antwortzeit Microsoft Cloud" zeigt CRM + BC + Login Linien
- Erklärungstabelle mit Schwellwerten für alle MS-Dienste
6. Alert-Regeln
Konfiguration: /data/docker/monitoring/prometheus/alerts.yml
Dynamics 365 CRM (Gruppe: dynamics365_crm)
| Alert | Schwelle | For | Severity |
|---|---|---|---|
Dynamics365APIDown |
WhoAmI fehlschlägt | 2min | critical |
CRMHTTPDown |
HTTP-Probe fehlschlägt (Hauptstandort) | 2min | critical |
Dynamics365APISlow |
WhoAmI > 3s | 2min | warning |
Dynamics365APICritical |
WhoAmI > 10s | 1min | critical |
CRMHTTPSlow |
HTTP > 1.5s (Hauptstandort) | 3min | warning |
Dynamics365ServiceDegradation |
MS meldet Störung | 1min | warning |
Dynamics365ActiveIssues |
Aktive MS-Probleme > 0 | 1min | warning |
Business Central (Gruppe: business_central)
| Alert | Schwelle | For | Severity |
|---|---|---|---|
BusinessCentralDown |
HTTP-Probe fehlschlägt (Hauptstandort) | 2min | critical |
BusinessCentralSlow |
HTTP > 2s (Hauptstandort) | 3min | warning |
Alertmanager-Routing
Alertmanager → alertmanager-ntfy-bridge (:8095) → ntfy (:80/monitoring) → iOS App
→ GMX E-Mail
Die Bridge formatiert Alerts als lesbare deutsche Nachrichten mit Standort-Mapping und Severity→Priorität-Zuordnung.
7. Gatus Status-Page
URL: http://192.168.178.199:8091
Config: /data/docker/gatus/config.yaml
Gruppe "Microsoft Cloud"
| Endpoint | URL | Schwelle |
|---|---|---|
| Dynamics 365 CRM | https://creativekirche.crm4.dynamics.com |
< 1500ms |
| Business Central | https://businesscentral.dynamics.com |
< 2000ms |
| Outlook 365 | https://outlook.office365.com |
< 2000ms |
| Microsoft Login | https://login.microsoftonline.com |
< 2000ms |
8. Schwellwerte
Baselines gemessen am 07.03.2026. Gelb ≈ 2× Baseline, Rot ≈ 5× Baseline.
| Dienst | Baseline | Gelb (Warning) | Rot (Critical) |
|---|---|---|---|
| CRM API WhoAmI | ~145ms | > 500ms | > 2.000ms |
| CRM API Gesamt | ~585ms | > 2.000ms | > 5.000ms |
| CRM OAuth Auth | ~125ms | > 500ms | > 2.000ms |
| CRM HTTP (Blackbox) | ~330ms | > 500ms | > 1.500ms |
| BC HTTP (Blackbox) | ~550ms | > 800ms | > 2.000ms |
| MS Login HTTP | ~400ms | > 600ms | > 2.000ms |
| Outlook HTTP | ~100ms | > 600ms | > 2.000ms |
| DNS-Auflösung | ~10-50ms | > 200ms | > 500ms |
9. Fehlerbehebung
Exporter zeigt "The user is not a member of the organization"
→ App User fehlt in der richtigen Power Platform Umgebung. Muss in "Creative Kirche" (nicht "Stiftung Creative Kirche") angelegt sein.
Lösung: Power Platform Admin Center → Umgebungen → "Creative Kirche" → Einstellungen → Benutzer + Berechtigungen → Anwendungsbenutzer → Client ID eingeben → Rolle "Serviceleser"
Graph API 403 (Service Health)
→ ServiceHealth.Read.All ist als delegierte statt Anwendungs-Berechtigung konfiguriert.
Lösung: Azure Portal → App-Registrierungen → CRM-Monitoring-Exporter → API-Berechtigungen → Delegierte entfernen → als Anwendung hinzufügen → Admin-Zustimmung erteilen
Outlook Probe zeigt "probe_success 0"
→ HTTP 417 fehlt in valid_status_codes der Blackbox-Config. Muss auf BEIDEN Blackbox-Exportern (lokal + Salto) angepasst werden.
Container neustarten
cd /data/docker && docker compose restart dynamics365-exporter
docker logs dynamics365-exporter --tail 20