Files
biztalk-checkmk-pulse/Dokumentation.md
T

20 KiB

Dokumentation: BizTalk Checkmk Pulse

Zielbild

Ziel ist ein wartbares Monitoring fuer BizTalk Server 2020 in den Umgebungen ACC, DEV, TST und PRD. Jede Umgebung besitzt einen BizTalk Server 2020 und einen SQL Server. SQL Server wird mit dem Checkmk-eigenen MSSQL-Plugin ueberwacht; fuer BizTalk liefert dieses Projekt die fehlende fachliche und technische Laufzeitsicht.

Das Monitoring soll:

  • auf jeder BizTalk-Maschine lokal laufen
  • ohne PowerShell-Abhaengigkeit funktionieren
  • keine BizTalk-DLLs im Build erzwingen
  • Checkmk-2.4-kompatible Services und Metriken erzeugen
  • service-discovery-freundlich und dashboard-tauglich sein
  • bei Fehlern gueltige UNKNOWN-Services statt kaputter Agent-Ausgaben liefern

Technische Bewertung

Option A: Checkmk Local Check mit C#/.NET Framework

Bewertung: empfohlen und umgesetzt.

Vorteile:

  • Checkmk 2.4 unterstuetzt Local Checks direkt.
  • Windows Server mit BizTalk 2020 bringt .NET Framework in der Regel passend mit.
  • System.Management kann BizTalk-WMI lesen.
  • Keine PowerShell Execution Policy, keine Script-Signing-Frage.
  • Kein serverseitiges Checkmk-Python-Plugin notwendig.
  • Rollout ist eine einfache Dateiablage unter %ProgramData%\checkmk\agent\local.

Nachteile:

  • Schwellwerte sind in der .exe.config, nicht als Checkmk-Regelsatz in WATO.
  • Eigene Graphing-Definitionen sind nicht enthalten; Checkmk zeigt Local-Check-Metriken trotzdem als Performance-Daten und Graphen.

Option B: Agent Plugin plus serverseitiges Checkmk-Plugin

Bewertung: technisch elegant, aber fuer den ersten produktiven Schritt schwerer.

Vorteile:

  • Checkmk-Regeln, Discovery und Metrikdefinitionen koennen sauber zentral modelliert werden.
  • Bessere langfristige Erweiterbarkeit als MKP.

Nachteile:

  • Checkmk-Check-API-Versionen muessen enger gepflegt werden.
  • Server-seitige Installation in jeder Site erforderlich.
  • Mehr Aufwand fuer Managed-Services-Betrieb und Updates.

Empfehlung: als Version 2 dieses Projekts denkbar, wenn die Local-Check-Variante stabil in PRD laeuft und zentrale Regelsaetze wirklich benoetigt werden.

Option C: PowerShell Local Check

Bewertung: nicht empfohlen fuer diese Umgebung.

Vorteile:

  • Schnell zu schreiben.
  • WMI/CIM-Zugriff ist komfortabel.

Nachteile:

  • PowerShell ist in vielen Serverumgebungen eingeschraenkt oder signaturpflichtig.
  • Ausfuehrungsverhalten im Checkmk-Agent-Kontext ist haeufiger fehleranfaellig.

Option D: BizTalk ExplorerOM/OperationsOM

Bewertung: fachlich stark, deployseitig unnoetig schwer.

Vorteile:

  • Hoehere BizTalk-Abstraktion als rohe WMI-Klassen.

Nachteile:

  • BizTalk-DLL-Versionen muessen beim Build und teilweise zur Laufzeit passen.
  • Build-Agenten brauchen BizTalk-Komponenten oder SDK-Dateien.
  • Fuer die benoetigten Zustandsdaten reicht WMI aus.

Architektur

Checkmk Windows Agent
  |
  | startet lokale Checks aus %ProgramData%\checkmk\agent\local
  v
biztalk_checkmk_pulse.cmd
  |
  | startet
  v
BizTalkCheckmkPulse.exe
  |
  | liest lokal und prueft im gleichen Sicherheitskontext
  +-- WMI root\MicrosoftBizTalkServer
  +-- Windows Application Event Log
  +-- SQL-Verbindung zu BizTalkMgmtDb/BizTalkMsgBoxDb
  |
  v
Checkmk Local Check Zeilen nach STDOUT

Der .cmd-Wrapper liefert auch dann fuer alle sechs stabilen Services gueltige UNKNOWN-Zeilen mit Massnahme, wenn die EXE fehlt oder bereits der Prozessstart mit einem Exitcode fehlschlaegt. Die EXE selbst faengt Laufzeitfehler ab und schreibt ebenfalls fuer alle stabilen Services UNKNOWN, damit unvollstaendige Deployments oder WMI-Probleme in Checkmk sichtbar bleiben.

Datenquellen

BizTalk WMI Namespace

Namespace:

root\MicrosoftBizTalkServer

Genutzte Klassen:

Klasse Zweck
MSBTS_GroupSetting BizTalk-Gruppe, Management-DB und Master-MessageBox (SubscriptionDB*).
MSBTS_HostInstance Host-Instance-Zustand; Ergebnis wird clientseitig auf den ueberwachten Server begrenzt.
MSBTS_ServiceInstance Suspended service instances.
MSBTS_ReceiveLocation Receive-Location-Zustand.
MSBTS_SendPort Send-Port-Zustand.
MSBTS_Orchestration Orchestration-Zustand.
MSBTS_ReceivePort Optionales Best-Effort-Application-Mapping, nur wenn per-Application-Services aktiviert sind.

Die Plattformabfrage verwendet absichtlich keine vermeintliche Klasse MSBTS_MessageBoxSetting: Sie ist nicht Bestandteil des dokumentierten BizTalk-WMI-Schemas. Auch die vorhandene Klasse MSBTS_MsgBoxSetting ist fuer die Zielermittlung nicht erforderlich. MSBTS_GroupSetting liefert mit SubscriptionDBServerName und SubscriptionDBName bereits das Ziel der Master-MessageBox. Dadurch entfallen eine Providerabfrage und eine unnoetige Berechtigungs-/Schemaschnittstelle.

Windows Application Event Log

Der Check liest standardmaessig das lokale Application Log fuer die letzten 60 Minuten und filtert auf Quellen wie:

  • BizTalk Server
  • XLANG/s
  • ENTSSO
  • BizTalk Server Application
  • BizTalk Server EDI

Die Liste ist ueber EventLogSources konfigurierbar.

SQL-Zugriffsprobe

Nach erfolgreicher oder teilweise erfolgreicher Plattformabfrage uebernimmt der SQL-Probe die per MSBTS_GroupSetting ermittelten Management- und Master-MessageBox-Ziele. Fuer jedes eindeutige Ziel wird mit System.Data.SqlClient eine Verbindung mit integrierter Windows-Authentifizierung geoeffnet und SELECT 1 ausgefuehrt. Die Verbindung wird unmittelbar danach geschlossen; es werden keine BizTalk-Tabellen gelesen oder veraendert.

Der Test laeuft unter derselben Identitaet wie der Checkmk Local Check. Damit wird sichtbar, ob LocalSystem beziehungsweise das Maschinenkonto des BizTalk-Servers das SQL-Ziel tatsaechlich erreichen und die Datenbank oeffnen kann. Die Probe ist mit ProbeSqlConnectivity=false deaktivierbar und verwendet SqlConnectionTimeoutSeconds mit dem Default 5 Sekunden je Ziel als Timeout.

Im produktiven Betrieb sollte der komplette Local Check asynchron mit 300 Sekunden Cache ausgefuehrt werden. So fuehren fehlende SQL-Rechte nicht bei jedem Checkmk-Abruf zu weiteren fehlgeschlagenen Login-Ereignissen. Der Trade-off ist eine Zustandsverzoegerung von maximal fuenf Minuten.

Berechtigungsmodell

LocalSystem und lokaler WMI-Zugriff

Der Checkmk Windows Agent und der Agent Controller laufen standardmaessig als LocalSystem (NT AUTHORITY\SYSTEM). Der Wrapper und die EXE erben diesen Kontext. Das Plugin verbindet sich lokal mit \\<eigener-server>\root\MicrosoftBizTalkServer, setzt keine eigenen Anmeldedaten, nutzt kein Remote-WMI und fuehrt keine veraendernden WMI-Methoden aus. Das lokale Windows Application Event Log wird ebenfalls nur gelesen.

Die lokalen Rechte von LocalSystem reichen fuer diese Zugriffe normalerweise aus. Im regulaeren lokalen Betrieb werden deshalb keine zusaetzlichen DCOM-, Firewall- oder pauschalen WMI-Namespace-Freigaben benoetigt.

Netzwerkidentitaet zum SQL Server

BizTalk-WMI-Klassen koennen ihre Daten aus der BizTalk Management- oder MessageBox-Datenbank beziehen. Liegt SQL Server auf einer anderen Maschine, authentifiziert sich LocalSystem dort mit dem Active-Directory-Computerkonto des BizTalk-Servers:

DOMAIN\BIZTALKSERVER$

Dieses Konto besitzt nicht automatisch BizTalk- oder SQL-Berechtigungen. Daraus kann die Situation entstehen, dass die Verbindung zum lokalen WMI-Namespace erfolgreich ist, einzelne SQL-gestuetzte WMI-Klassen aber Access denied, UnauthorizedAccessException oder UNKNOWN liefern.

Der ACC-Test vom 29.07.2026 bestaetigt genau diesen Pfad: Auf AV23AGPWBIO1 ist WMI erreichbar, aber der Provider meldet COMException 0x80131904 mit Login failed for user 'BEW\AV23AGPWBIO1$'. Die UNKNOWN-Services fuer Plattform, Host Instances, Runtime Artifacts und Suspensions sowie die fehlende SQL-Zielermittlung sind Folgefehler. DCOM-, Firewall- oder WMI-ACL-Erweiterungen beheben diesen konkreten SQL-Loginfehler nicht. Der Event-Log-Check arbeitet bereits und seine Fehler/Warnungen sind separat zu bewerten.

Pruefung und Freigabe

Der direkte Programmstart in einer administrativen Shell laeuft unter dem angemeldeten Benutzer und ist deshalb kein ausreichender Berechtigungstest. Verbindlich ist die Ausfuehrung durch den Checkmk Agent Controller als LocalSystem:

& "C:\Program Files (x86)\checkmk\service\cmk-agent-ctl.exe" dump |
    Select-String -Pattern "BizTalk|Access denied|Unauthorized|UNKNOWN" -Context 0,1

Bei Zugriffsfehlern gilt folgendes Least-Privilege-Vorgehen:

  1. Die exakt konfigurierte Operator-Gruppe in der BizTalk Administration Console unter BizTalk Group > Properties > General feststellen.
  2. Das Computerobjekt des BizTalk-Servers durch einen AD-Administrator in genau diese Gruppe aufnehmen. Fuer ACC ist dies AV23AGPWBIO1 beziehungsweise BEW\AV23AGPWBIO1$.
  3. Keine direkten SQL-Logins, BizTalk-Datenbankrollen oder sysadmin-Rechte fuer das Maschinenkonto anlegen.
  4. AD-Replikation abwarten und den Server im Wartungsfenster neu starten; alternativ Maschinen-Tickets mit klist purge -li 0x3e7 und den Checkmk-Dienst erneuern.
  5. Den Agent-Dump wiederholen und operator_group, zwei SQL-Ziele sowie das Verschwinden der Berechtigungs-UNKNOWNs kontrollieren.
  6. Nur fuer weiterhin abgelehnte, konkret identifizierte WMI-Klassen mit BizTalk- und SQL-Administration pruefen, ob Administratorrechte erforderlich sind.

Die Operator-Rolle ist fuer grundlegendes Monitoring und Zustandsabfragen vorgesehen. Direkte manuelle Aenderungen an den Rollen der BizTalk-SQL-Datenbanken sind zu vermeiden; die durch BizTalk konfigurierte Windows-Gruppe ist die vorgesehene Berechtigungsgrenze.

Agent-Dump-Ergebnis Massnahme
Plausible Werte fuer alle BizTalk-Services Keine Berechtigungsaenderung.
WMI-Namespace nicht erreichbar BizTalk-WMI-Provider, WMI-Dienst, Namespace und ACL gezielt pruefen.
Nur SQL-gestuetzte Klassen scheitern Computerkonto in die BizTalk-Operator-Gruppe aufnehmen.
Nur Event-Log-Service ist UNKNOWN Lokalen Application-Log-Zugriff pruefen.
Fehler bleibt mit Operator-Rolle bestehen Betroffene Klasse und konkrete BizTalk-/SQL-Rollenanforderung untersuchen.

Automatische Diagnose im Programm

WMI-Verbindungsaufbau und jede erforderliche WMI-Klasse werden separat bewertet. Erwartbare Exceptions werden in folgende Kategorien eingeordnet:

Diagnose Bedeutung Ausgegebene Massnahme
Wmi/Permission Namespace, BizTalk-WMI-Klasse oder deren eingebetteter SQL-Zugriff verweigert den Zugriff. Namespace-ACL nur bei Verbindungsfehlern; bei Login failed for user das genannte Maschinenkonto der BizTalk-Operator-Gruppe zuordnen.
Wmi/Connectivity WMI-/RPC-Ziel nicht erreichbar. WMI-Dienst, Provider und bei Remote-WMI zusaetzlich DNS/RPC/Firewall pruefen.
Wmi/Timeout WMI-Abfrage ueberschreitet QueryTimeoutSeconds. WMI-, BizTalk- und SQL-Auslastung untersuchen, bevor der Timeout erhoeht wird.
Wmi/Configuration BizTalk-WMI-Namespace fehlt oder Plattformdaten sind unvollstaendig. Provider, Namespace und BizTalk-Konfiguration pruefen.
Wmi/Schema InvalidClass oder InvalidQuery; Klasse beziehungsweise WQL passt nicht zum installierten Provider. Klasse/Properties gegen das BizTalk-WMI-Schema pruefen; keine Rechteerhoehung vornehmen.
Sql/Permission Login oder Datenbankzugriff wird abgelehnt. Maschinenkonto der BizTalk-Operator-Gruppe zuordnen, Kerberos erneuern, keine direkten DB-Rollen vergeben.
Sql/Connectivity SQL-Server oder Instanz nicht erreichbar. Servername, DNS, SQL-Dienst, TCP-Protokoll, Port und Firewall pruefen.
Sql/Timeout SQL-Verbindung oder Testabfrage laeuft in den Timeout. Netzwerk und SQL-Auslastung pruefen; Timeout nur begruendet anheben.
Sql/Configuration WMI-Ziele unvollstaendig oder TLS-, Zertifikats-, SPN-/SSPI-Konfiguration fehlerhaft. Plattformabfragen beziehungsweise Zertifikatskette, Verschluesselung, SPN und Kerberos gezielt pruefen.

Jede Diagnose enthaelt Bereich/Kategorie, betroffene Komponente, eine kurze Ursache, Massnahme: und Technik: mit Exception-Typ, HRESULT oder SQL-Fehlernummer. Bei WMI-Abfragefehlern werden zusaetzlich WQL und Laufzeit bis zum Fehler ausgegeben. Erforderliche Datenquellen besitzen eigene Verfuegbarkeitsflags. Schlaegt beispielsweise MSBTS_ServiceInstance fehl, wird BizTalk Suspended Instances zwingend UNKNOWN; eine leere Ergebnisliste darf nicht als 'keine Suspensions' fehlinterpretiert werden.

Die Operator-Mitgliedschaft des Computerkontos steht allen auf diesem Server als LocalSystem laufenden Diensten fuer Netzwerkzugriffe zur Verfuegung. Falls diese Sicherheitsauswirkung nicht akzeptabel ist, kann ein separater Collector unter einem dedizierten gMSA- oder Dienstkonto mit Operator-Rechten Checkmk-Spooldaten erzeugen. Diese Variante ist noch nicht Bestandteil der aktuellen Implementierung. Der komplette Checkmk-Agent sollte nicht allein fuer dieses Plugin auf eine andere Identitaet umgestellt werden, weil dies alle Agent-Sektionen und Local Checks betrifft.

Quellen:

Resilienz

Das Plugin ist bewusst defensiv gebaut:

  • Der dependency-freie Regressionstest laeuft mit dem gleichen .NET-Framework-/MSBuild-Baseline wie die Anwendung.
  • WMI-Queries haben ein konfigurierbares Timeout.
  • WMI-Namespace und Pflichtklassen werden getrennt auf Berechtigung, Konfiguration, Erreichbarkeit und Timeout geprueft.
  • Management- und Master-MessageBox-Datenbank werden aus einer dokumentierten WMI-Klasse ermittelt und mit der echten Agent-Identitaet getestet.
  • InvalidClass/InvalidQuery werden als Schemafehler statt als Berechtigungsproblem ausgewiesen.
  • Host Instances werden ohne namensabhaengigen WQL-Filter clientseitig auf den ueberwachten Server begrenzt.
  • Bereits fuer Runtime-Zustaende gelesene Artefakte werden fuer das Best-Effort-Application-Mapping wiederverwendet; doppelte WMI-Abfragen entfallen.
  • SQL-Fehlernummern werden in Berechtigung, Erreichbarkeit, Timeout oder Providerfehler klassifiziert.
  • Fehlgeschlagene Pflichtabfragen erzeugen UNKNOWN statt irrefuehrender Nullwerte.
  • Optionale WMI-Klassen erzeugen Diagnosehinweise statt Totalabbruch.
  • Fehlende Properties werden als leer/unknown behandelt.
  • Local-Check-Ausgaben verwenden gueltige Checkmk-Zeilen mit genau vier Feldern.
  • Fatal Errors erzeugen UNKNOWN fuer alle stabilen Services.
  • Event-Log-Auswertung ist isoliert; ein Fehler dort bricht WMI-Monitoring nicht ab.
  • Service-Namen sind stabil, damit Service Discovery nicht bei jedem Lauf neue Services erzeugt.

Statusmodell

BizTalk Platform

  • OK: BizTalk-WMI erreichbar.
  • UNKNOWN: WMI nicht erreichbar oder kompletter Programmfehler.

Dieser Service ist der Integrationsindikator. Wenn er UNKNOWN ist, sind Berechtigungen, BizTalk-Installation oder WMI-Repository zu pruefen.

BizTalk SQL Access

  • OK: Datenbankziele vollstaendig ermittelt und integrierte Anmeldung an allen Zielen erfolgreich.
  • UNKNOWN: Zielermittlung unvollstaendig, Anmeldung verweigert, SQL nicht erreichbar, Timeout oder Providerfehler.
  • Bei ProbeSqlConnectivity=false: OK mit sichtbarem Hinweis, dass die Probe deaktiviert ist.

Metriken: biztalk_sql_targets_total, biztalk_sql_targets_available und biztalk_sql_targets_failed. Die Ausgabe nennt ausserdem execution_identity, network_identity und den Zustand jedes getesteten Datenbankziels.

BizTalk Suspended Instances

  • OK: keine suspendierten Instanzen.
  • WARN: mindestens WarnResumableThreshold resumable suspended instances.
  • CRIT: mindestens CritNonResumableThreshold non-resumable suspended instances.
  • UNKNOWN: Datenquelle nicht lesbar.

BizTalk Host Instances

  • OK: alle Host-Instanzen sind started.
  • WARN: mindestens eine Host-Instanz ist pending.
  • CRIT: mindestens eine Host-Instanz ist stopped oder unknown.
  • UNKNOWN: keine Host-Instanzen gefunden oder Datenquelle nicht lesbar.

BizTalk Runtime Artifacts

  • OK: Artefakte lesbar, keine unbekannten Statuswerte.
  • WARN: nur wenn AlertOnArtifactRuntimeIssues=true und deaktivierte/inaktive Artefakte vorhanden sind.
  • CRIT: unbekannte Send-Port- oder Orchestration-Statuswerte.
  • UNKNOWN: mindestens eine erforderliche WMI-Artefaktklasse nicht lesbar.

Deaktivierte Receive Locations und gestoppte Ports koennen in BizTalk fachlich korrekt sein. Deshalb ist die Alarmierung hier standardmaessig informativ.

BizTalk Event Log

  • OK: keine relevanten Fehler/Warnungen ueber Schwellwert.
  • WARN: Fehler oder Warnungen ab EventLogWarnThreshold.
  • CRIT: Fehler ab EventLogCritThreshold.
  • UNKNOWN: Event Log nicht lesbar.

Dashboard-Empfehlung

Pro Umgebung sollte der BizTalk-Host in einem eigenen Host-Ordner oder Host-Tag fuer ACC, DEV, TST, PRD liegen. Im Dashboard eignen sich:

  • Service State Widgets fuer die sechs stabilen BizTalk-Services
  • Graphen fuer biztalk_sql_targets_failed, biztalk_suspended_total, biztalk_host_instances_stopped, biztalk_eventlog_errors
  • Hostgruppe/Ordner pro Umgebung
  • Optional eine View gefiltert auf Service starts with BizTalk

Empfohlene Reihenfolge im Dashboard:

  1. BizTalk Platform
  2. BizTalk SQL Access
  3. BizTalk Suspended Instances
  4. BizTalk Host Instances
  5. BizTalk Event Log
  6. BizTalk Runtime Artifacts
  7. SQL-Server-Services aus dem Checkmk-MSSQL-Plugin

Rollout-Vorgehen

  1. Build-Paket erzeugen.
  2. In DEV auf dem BizTalk-Server installieren.
  3. --self-test und normalen Lauf ausfuehren.
  4. Agent-Dump pruefen.
  5. Checkmk Discovery durchfuehren.
  6. Eine Woche Messwerte und false positives beobachten.
  7. Nach TST und ACC uebernehmen.
  8. In PRD mit AlertOnArtifactRuntimeIssues=false starten.
  9. Nach Betriebsfreigabe Schwellwerte feinjustieren.

Troubleshooting

Service bleibt UNKNOWN

Pruefen:

"%ProgramData%\checkmk\agent\local\biztalk_checkmk_pulse.cmd"

Wenn WMI nicht erreichbar ist:

wmic /namespace:\\root\MicrosoftBizTalkServer path MSBTS_HostInstance get HostName,RunningServer,ServiceState

Der Checkmk Windows Agent laeuft normalerweise als LocalSystem. Daher immer auch den Agent-Dump verwenden:

"C:\Program Files (x86)\checkmk\service\cmk-agent-ctl.exe" dump

Die Diagnose im Service-Text nach Massnahme: abarbeiten. Wichtige Kategorien:

  • Wmi/Permission: lokale Namespace-ACL oder BizTalk-Operator-Zuordnung pruefen.
  • Wmi/Schema: Klasse/WQL gegen das installierte BizTalk-Schema pruefen; InvalidClass ist nicht durch zusaetzliche Rechte loesbar.
  • Sql/Permission: Maschinenkonto DOMAIN\BIZTALKSERVER$ und BizTalk-Operator-Gruppe pruefen.
  • Sql/Connectivity: SQL-Server-/Instanzname, DNS, SQL-Dienst, TCP und Firewall pruefen.
  • Sql/Timeout: SQL- und Netzwerkauslastung pruefen; Timeout nicht als erste Massnahme erhoehen.

Der direkte Aufruf des Wrappers kann wegen des angemeldeten Administratorkontos ein anderes Ergebnis liefern als der Agent-Dump. Fuer die Freigabe ist immer der Agent-Dump massgeblich.

Keine Services in Discovery

Pruefen:

  • Liegt biztalk_checkmk_pulse.cmd direkt unter %ProgramData%\checkmk\agent\local?
  • Gibt der Wrapper direkt eine Zeile im Format 0 "Service" metric=value Details aus?
  • Wurde der Checkmk-Agent nach Policy-/Bakery-Aenderungen neu ausgerollt?

Runtime Artifacts zeigt deaktivierte Artefakte

Das ist standardmaessig OK, damit gewollt deaktivierte BizTalk-Artefakte nicht alarmieren. Fuer strengere PRD-Standards:

<add key="AlertOnArtifactRuntimeIssues" value="true" />

Weiterentwicklung

Sinnvolle naechste Ausbaustufen:

  • MKP mit Agent-Bakery-Regel fuer zentrale Konfiguration.
  • Optionales serverseitiges Check-Plugin nach Checkmk Check API V2.
  • Custom Dashboard/View als Checkmk GUI Extension.
  • Ergaenzung um MessageBox-Spool/Tracking-Daten, falls operativ benoetigt.