Files
2026-07-08 15:15:36 +02:00

227 lines
11 KiB
Markdown

# Dokumentation: BizTalk Runtime Checkmk Local Check
## Ziel
Der Check beantwortet fuer den lokalen BizTalk-Server:
- Gibt es suspendierte BizTalk-Service-Instanzen?
- Sind sie resumable oder non-resumable?
- Welche BizTalk-Anwendungen sind betroffen?
- Sind BizTalk Host-Instanzen gestartet?
- Wie ist der aggregierte Laufzeitstatus wichtiger BizTalk-Artefakte?
Er ist fuer Checkmk Windows Agent Local Checks gebaut und benoetigt keine PowerShell.
## Architektur
Komponenten:
- `BizTalkSuspendedInstancesCheck.exe`: C#/.NET-Framework-Konsolenprogramm
- `BizTalkSuspendedInstancesCheck.exe.config`: Konfiguration
- `biztalk_suspended_instances.cmd`: Checkmk-Wrapper fuer `%ProgramData%\checkmk\agent\local`
Laufzeitfluss:
1. Checkmk Windows Agent ruft `biztalk_suspended_instances.cmd` auf.
2. Der Wrapper startet die EXE.
3. Die EXE fragt `root\MicrosoftBizTalkServer` per WMI ab.
4. Die EXE schreibt mehrere Checkmk-konforme Local-Check-Zeilen nach STDOUT.
Die Anwendung gibt selbst bei Fehlern eine syntaktisch gueltige Checkmk-Zeile aus. Dadurch wird der Monitoring-Zustand `UNKNOWN` sichtbar, statt den Agenten still zu stoeren.
## Ausfuehrung durch Checkmk
Der Check wird als Checkmk Local Check betrieben. Das bedeutet: Checkmk fuehrt auf dem BizTalk-Server keine zentrale Abfrage gegen BizTalk aus, sondern der Checkmk Windows Agent startet lokal abgelegte Checks und sammelt deren STDOUT ein.
Der relevante Agent-Pfad auf Windows ist:
```cmd
%ProgramData%\checkmk\agent\local
```
In diesem Verzeichnis liegt unser mitgelieferter Wrapper:
```text
%ProgramData%\checkmk\agent\local\biztalk_suspended_instances.cmd
```
Der Wrapper ruft die eigentliche C#-EXE auf:
```text
%ProgramData%\checkmk\agent\local\BizTalkSuspendedInstancesCheck\BizTalkSuspendedInstancesCheck.exe
```
Die vollstaendige Zielstruktur ist:
```text
%ProgramData%\checkmk\agent\local\biztalk_suspended_instances.cmd
%ProgramData%\checkmk\agent\local\BizTalkSuspendedInstancesCheck\BizTalkSuspendedInstancesCheck.exe
%ProgramData%\checkmk\agent\local\BizTalkSuspendedInstancesCheck\BizTalkSuspendedInstancesCheck.exe.config
```
Das Aufrufskript muss nicht separat neu entwickelt werden. Es ist Bestandteil dieses Repositories:
```text
deployment\checkmk\biztalk_suspended_instances.cmd
```
Beim Paketieren mit `scripts\package-release.cmd` wird dieses Skript in den Deployment-Ordner kopiert. Der Inhalt von `artifacts\BizTalkSuspendedInstancesCheck-deploy` kann komplett nach `%ProgramData%\checkmk\agent\local` kopiert werden.
Der technische Ablauf ist:
1. Checkmk Windows Agent startet `biztalk_suspended_instances.cmd`.
2. Die `.cmd` sucht `BizTalkSuspendedInstancesCheck.exe` zuerst im Unterordner `BizTalkSuspendedInstancesCheck`.
3. Falls die EXE dort nicht liegt, sucht die `.cmd` die EXE direkt neben dem Skript.
4. Falls die EXE nicht gefunden wird, erzeugt die `.cmd` eine gueltige Checkmk-Zeile mit Status `UNKNOWN`.
5. Falls die EXE gefunden wird, fragt sie BizTalk per WMI ab.
6. Die EXE schreibt die Checkmk-Services nach STDOUT.
7. Der Checkmk Agent nimmt diese Zeilen in seine Agentenausgabe auf.
8. Nach Checkmk Service Discovery koennen die Services uebernommen werden.
Manueller Test auf dem BizTalk-Server:
```cmd
"%ProgramData%\checkmk\agent\local\biztalk_suspended_instances.cmd"
```
Agentenausgabe pruefen:
```cmd
"C:\Program Files (x86)\checkmk\service\cmk-agent-ctl.exe" dump
```
## WMI-Abfragen
Primaere Abfrage:
```sql
SELECT * FROM MSBTS_ServiceInstance WHERE ServiceStatus = 4 OR ServiceStatus = 32
```
Statuswerte:
- `4`: Suspended (resumable)
- `32`: Suspended (not resumable)
Weitere Betriebsabfragen:
```sql
SELECT * FROM MSBTS_HostInstance
SELECT * FROM MSBTS_ReceiveLocation
SELECT * FROM MSBTS_SendPort
SELECT * FROM MSBTS_Orchestration
```
Aus Betriebssicht werden damit folgende Risiken sichtbar:
- Gestoppte oder haengende Host-Instanzen.
- Deaktivierte Receive Locations.
- Nicht gestartete Send Ports.
- Nicht gestartete oder nicht gebundene Orchestrations.
- Unbekannte WMI-Statuswerte, die auf Versions-/Schemaabweichungen oder Lesefehler hindeuten koennen.
Zur Zuordnung der Anwendung wird zuerst versucht, eine Anwendungs-Property direkt aus der Service-Instanz zu lesen. Falls BizTalk diese nicht liefert, baut der Check einen lokalen Index ueber bekannte BizTalk-Artefakte:
- `MSBTS_SendPort`
- `MSBTS_ReceivePort`
- `MSBTS_ReceiveLocation`
- `MSBTS_Orchestration`
Wenn keine Zuordnung moeglich ist, erscheint die Instanz unter `(Unknown Application)`. Das ist absichtlich kein Fehler, weil BizTalk nicht fuer jede Instanz eine direkte Anwendungseigenschaft liefern muss.
## Checkmk-Ausgabe
Der Check gibt standardmaessig drei stabile Services aus. Es werden keine dynamischen Services pro Anwendung erzeugt, damit Checkmk Service Discovery stabil bleibt.
Beispiel ohne Befund:
```text
0 "BizTalk Suspended Instances" biztalk_suspended_total=0;;;0|biztalk_suspended_resumable=0;1;;0|biztalk_suspended_nonresumable=0;;1;0 No suspended BizTalk service instances found.
0 "BizTalk Host Instances" biztalk_host_instances_total=4;;;0|biztalk_host_instances_started=4;;;0|biztalk_host_instances_stopped=0;;;0|biztalk_host_instances_pending=0;;;0|biztalk_host_instances_unknown=0;;;0 total=4, started=4, stopped=0, pending=0, unknown=0
0 "BizTalk Runtime Artifacts" biztalk_applications=6;;;0|biztalk_receive_locations=20;;;0|biztalk_receive_locations_disabled=0;;;0|biztalk_send_ports=30;;;0|biztalk_send_ports_started=30;;;0|biztalk_send_ports_stopped=0;;;0|biztalk_send_ports_bound=0;;;0|biztalk_send_ports_unknown=0;;;0|biztalk_orchestrations=12;;;0|biztalk_orchestrations_started=12;;;0|biztalk_orchestrations_stopped=0;;;0|biztalk_orchestrations_bound=0;;;0|biztalk_orchestrations_unbound=0;;;0|biztalk_orchestrations_unknown=0;;;0 applications=6 | ReceiveLocations total=20, disabled=0 | SendPorts total=30, started=30, stopped=0, bound=0, unknown=0 | Orchestrations total=12, started=12, stopped=0, bound=0, unbound=0, unknown=0
```
Beispiel mit non-resumable Instanz:
```text
2 "BizTalk Suspended Instances" biztalk_suspended_total=3;;;0|biztalk_suspended_resumable=2;1;;0|biztalk_suspended_nonresumable=1;;1;0 3 suspended BizTalk service instance(s): resumable=2, nonresumable=1, applications=2. ApplicationA R=2 NR=0; ApplicationB R=0 NR=1
```
Beispiel fuer Host-Instanzen:
```text
2 "BizTalk Host Instances" biztalk_host_instances_total=4;;;0|biztalk_host_instances_started=3;;;0|biztalk_host_instances_stopped=1;;;0|biztalk_host_instances_pending=0;;;0|biztalk_host_instances_unknown=0;;;0 total=4, started=3, stopped=1, pending=0, unknown=0 | Not started: ProcessingHost@BIZTALK01=Stopped
```
Beispiel fuer Artefaktstatus:
```text
0 "BizTalk Runtime Artifacts" biztalk_applications=6;;;0|biztalk_receive_locations=20;;;0|biztalk_receive_locations_disabled=1;;;0|biztalk_send_ports=30;;;0|biztalk_send_ports_started=28;;;0|biztalk_send_ports_stopped=2;;;0|biztalk_send_ports_bound=0;;;0|biztalk_send_ports_unknown=0;;;0|biztalk_orchestrations=12;;;0|biztalk_orchestrations_started=11;;;0|biztalk_orchestrations_stopped=1;;;0|biztalk_orchestrations_bound=0;;;0|biztalk_orchestrations_unbound=0;;;0|biztalk_orchestrations_unknown=0;;;0 applications=6 | ReceiveLocations total=20, disabled=1 | SendPorts total=30, started=28, stopped=2, bound=0, unknown=0 | Orchestrations total=12, started=11, stopped=1, bound=0, unbound=0, unknown=0 | Notable apps: ApplicationA RL disabled=1, SP stopped/bound/unknown=2/0/0, Orch stopped/bound/unbound/unknown=1/0/0/0
```
## Schwellwerte
Default:
- Resumable ab `1`: `WARN`
- Non-resumable ab `1`: `CRIT`
- Host-Instanz `Stopped` oder unbekannt: `CRIT`
- Host-Instanz `StartPending` oder `StopPending`: `WARN`
- Artefakte mit unbekanntem Status: `CRIT`
- Deaktivierte/inaktive Artefakte: nur Anzeige, optional `WARN` mit `AlertOnArtifactRuntimeIssues=true`
Begruendung:
- Resumable Suspensions sind stoerungsrelevant, aber potentiell wiederaufnehmbar.
- Non-resumable Suspensions verlangen normalerweise manuelle Bereinigung oder fachliche Analyse und werden daher kritisch bewertet.
- Gestoppte Host-Instanzen wirken direkt auf die Verarbeitung und werden daher kritisch bewertet.
- Deaktivierte Receive Locations, gestoppte Send Ports und gestoppte Orchestrations koennen gewollt sein; deshalb werden sie zuerst als Betriebsinformation ausgegeben.
## Betrieb
Empfohlener Installationspfad:
```text
%ProgramData%\checkmk\agent\local\biztalk_suspended_instances.cmd
%ProgramData%\checkmk\agent\local\BizTalkSuspendedInstancesCheck\BizTalkSuspendedInstancesCheck.exe
%ProgramData%\checkmk\agent\local\BizTalkSuspendedInstancesCheck\BizTalkSuspendedInstancesCheck.exe.config
```
Der Wrapper sucht die EXE zuerst im Unterordner `BizTalkSuspendedInstancesCheck` und danach direkt neben der `.cmd`. Damit funktioniert sowohl eine saubere Unterordner-Installation als auch ein flaches Deployment.
Nach Aenderungen an den Service-Namen muss in Checkmk eine erneute Service Discovery erfolgen. Reine Schwellwert- oder Anzeigeaenderungen brauchen keine neue Discovery.
## Rechte
Der Check muss unter dem Konto des Checkmk Windows Agent auf dem BizTalk-Server WMI-Leserechte fuer `root\MicrosoftBizTalkServer` haben. In der Praxis ist das meist `LocalSystem` oder ein dediziertes Agent-Servicekonto mit lokalen Rechten.
## Resilienz
- Keine PowerShell-Abhaengigkeit.
- Keine BizTalk-Assembly-Abhaengigkeit im Build.
- UTF-8-Ausgabe wird in der EXE gesetzt.
- WMI-Timeout ist konfigurierbar.
- Fehler erzeugen `UNKNOWN` statt leerer Ausgabe.
- Artefakt-Index ist best effort; fehlende Anwendungszuordnung verhindert den Status nicht.
- Ein stabiler Checkmk-Service vermeidet Service-Discovery-Flapping bei wechselnden Anwendungsnamen.
- Runtime-Artefakte werden aggregiert und begrenzt ausgegeben, damit Checkmk-Summaries lesbar bleiben.
## Konfiguration
Wichtige `appSettings`:
- `ServiceName`: Service fuer suspendierte Instanzen.
- `HostInstancesServiceName`: Service fuer Host-Instanzen.
- `RuntimeArtifactsServiceName`: Service fuer Artefaktstatus.
- `MaxApplicationDetails`: maximale Anzahl Anwendungen in der Suspensions-Summary.
- `MaxRuntimeApplicationDetails`: maximale Anzahl auffaelliger Anwendungen in der Runtime-Summary.
- `AlertOnStoppedHostInstances`: Host-Instanz-Abweichungen alarmieren.
- `AlertOnArtifactRuntimeIssues`: deaktivierte/inaktive Artefakte als `WARN` werten.
- `EmitPerApplicationServices`: zusaetzliche Suspensions-Services pro Anwendung erzeugen. Nur verwenden, wenn dynamische Services in Checkmk gewuenscht sind.
## Gitea
Das Repository enthaelt `.gitea/workflows/build.yml`. Der Workflow erwartet einen Windows Runner mit Visual Studio Build Tools und .NET Framework 4.6.1 Developer Pack.
Wenn euer Gitea Runner anders gelabelt ist, `runs-on` in `.gitea/workflows/build.yml` anpassen.