# TSM Backup Monitoring fΓΌr CheckMK Ein vollstΓ€ndiges CheckMK-Plugin zur Überwachung von IBM Spectrum Protect (TSM) Backups mit intelligenter Backup-Typ-Erkennung, umfassenden Labels und flexiblen Schwellwerten. ## πŸ“‹ Inhaltsverzeichnis - [Features](#features) - [Anforderungen](#anforderungen) - [Installation](#installation) - [Konfiguration](#konfiguration) - [Verwendung](#verwendung) - [Architektur](#architektur) - [Troubleshooting](#troubleshooting) - [Changelog](#changelog) --- ## ✨ Features ### Kernfunktionen - **Umfassende Backup-Typ-Erkennung**: UnterstΓΌtzung fΓΌr 18+ Backup-Typen - **Flexible Labels**: Umfassende Service-Labels fΓΌr erweiterte Filterung und Reporting - **Typ-spezifische Schwellwerte**: Individuelle Warn- und Kritisch-Schwellen fΓΌr verschiedene Backup-Typen - **Redundanz-Support**: Normalisierung von RRZ*/NFRZ* Node-Namen - **Aggregierte Überwachung**: Pro-Node-Aggregierung mehrerer Backup-Jobs - **Intelligentes Error-Handling**: Tolerantes vs. striktes Verhalten je nach Backup-Typ ### UnterstΓΌtzte Backup-Typen #### Datenbanken (strikte Überwachung) - MSSQL (26h/48h) - SAP HANA (26h/48h) - Oracle (26h/48h) - DB2 (26h/48h) - MySQL/MariaDB (26h/48h) - PostgreSQL (26h/48h) - Sybase (26h/48h) - MongoDB (26h/48h) #### Dateisysteme (tolerante Überwachung) - FILE (36h/72h) - SCALE (36h/72h) - DM (36h/72h) - Datacenter (36h/72h) #### Virtualisierung (tolerante Überwachung) - Virtual/VMware (36h/72h) - Hyper-V (36h/72h) #### Applikationen - Mail/Exchange (26h/48h) - Transaction Logs (4h/8h) --- ## πŸ”§ Anforderungen ### CheckMK Server - CheckMK Version: **2.3.0p40** oder hΓΆher - Python 3.8+ - Zugriff auf `/omd/sites//local/lib/python3/cmk_addons/` ### Überwachte Hosts - Python 3.6+ - Lesezugriff auf TSM CSV-Export-Verzeichnis - CheckMK Agent installiert ### TSM Server - CSV-Export der Backup-Statistiken - Export-Format: `YYYY-MM-DD HH:MM:SS,,NODE_NAME,SCHEDULE,STATUS` --- ## πŸ“¦ Installation ### Schritt 1: Agent-Plugin installieren Das Agent-Plugin muss auf **jedem Host** installiert werden, der TSM-Backups ΓΌberwachen soll. ```bash # Als root auf dem ΓΌberwachten Host cd /usr/lib/check_mk_agent/plugins # Plugin herunterladen oder kopieren wget https://your-repo/tsm_backups_agent.py -O tsm_backups # ODER scp user@server:tsm_backups_agent.py /usr/lib/check_mk_agent/plugins/tsm_backups # AusfΓΌhrbar machen chmod +x /usr/lib/check_mk_agent/plugins/tsm_backups # Test ./tsm_backups ``` **Erwartete Ausgabe:** ``` <<>> {"SERVER_MSSQL": {"statuses": ["Completed"], "schedules": ["DAILY_FULL"], "last": 1736693420, "count": 1}, ...} ``` ### Schritt 2: CSV-Verzeichnis vorbereiten ```bash # CSV-Verzeichnis erstellen mkdir -p /mnt/CMK_TSM chmod 755 /mnt/CMK_TSM # TSM-CSV-Dateien bereitstellen # Option A: NFS-Mount vom TSM Server mount -t nfs tsm-server:/exports/backup-stats /mnt/CMK_TSM # Option B: RegelmÀßiger SCP/Rsync # Crontab-Eintrag: */15 * * * * rsync -az tsm-server:/path/to/*.CSV /mnt/CMK_TSM/ ``` **Erwartete CSV-Struktur:** ``` /mnt/CMK_TSM/ β”œβ”€β”€ TSM_BACKUP_SCHED_24H.CSV β”œβ”€β”€ TSM_DB_SCHED_24H.CSV └── TSM_FILE_SCHED_24H.CSV ``` ### Schritt 3: Check-Plugin installieren Das Check-Plugin wird auf dem **CheckMK Server** installiert. ```bash # Als Site-User OM=/omd/sites/monitoring cd $OM # Plugin-Verzeichnis erstellen mkdir -p local/lib/python3/cmk_addons/plugins/tsm/agent_based # Plugin kopieren cp tsm_backups.py local/lib/python3/cmk_addons/plugins/tsm/agent_based/ # Rechte setzen chmod 644 local/lib/python3/cmk_addons/plugins/tsm/agent_based/tsm_backups.py # CheckMK Cache leeren cmk -R ``` ### Schritt 4: Service Discovery ```bash # Service Discovery fΓΌr einen Host cmk -II hostname # Bulk Discovery fΓΌr alle Hosts cmk -II --all # WebUI: Setup > Hosts > > Service Discovery > Full Scan ``` --- ## βš™οΈ Konfiguration ### Schwellwerte anpassen Die Schwellwerte kΓΆnnen direkt im Check-Plugin angepasst werden: **Datei:** `local/lib/python3/cmk_addons/plugins/tsm/agent_based/tsm_backups.py` ```python THRESHOLDS = { "log": {"warn": 4 * 3600, "crit": 8 * 3600}, # 4h/8h "mssql": {"warn": 26 * 3600, "crit": 48 * 3600}, # 26h/48h # ... weitere Typen ... "default": {"warn": 26 * 3600, "crit": 48 * 3600}, } ``` ### Neue Backup-Typen hinzufΓΌgen **Szenario:** Ein neuer Typ "SAPASE" soll unterstΓΌtzt werden. **Schritt 1: Typ zur known_types Liste hinzufΓΌgen** ```python # In extract_backup_type() Funktion known_types = [ 'MSSQL', 'HANA', 'FILE', 'ORACLE', 'DB2', 'SCALE', 'DM', 'DATACENTER', 'VIRTUAL', 'MAIL', 'MYSQL', 'POSTGRES', 'MARIADB', 'EXCHANGE', 'VMWARE', 'HYPERV', 'SYBASE', 'MONGODB', 'SAPASE', # NEU ] ``` **Schritt 2: Schwellwerte definieren (optional)** ```python THRESHOLDS = { # ... bestehende ... "sapase": {"warn": 26 * 3600, "crit": 48 * 3600}, } ``` **Schritt 3: Kategorie zuweisen (optional)** ```python DATABASE_TYPES = { 'mssql', 'hana', 'db2', 'oracle', 'mysql', 'postgres', 'mariadb', 'sybase', 'mongodb', 'sapase', # NEU } ``` **Nach Γ„nderungen:** ```bash cmk -R cmk -II --all ``` ### Tolerantes Error-Handling konfigurieren Backup-Typen mit tolerantem Verhalten (Failed β†’ WARNING statt CRITICAL): ```python TOLERANT_TYPES = { 'file', 'virtual', 'scale', 'dm', 'datacenter', 'vmware', 'hyperv', 'mail', 'exchange', 'custom_tolerant_type' # NEU } ``` ### CSV-Verzeichnis Γ€ndern Im Agent-Plugin (`/usr/lib/check_mk_agent/plugins/tsm_backups`): ```python CSV_DIR = Path("/mnt/CMK_TSM") # Hier anpassen ``` --- ## πŸš€ Verwendung ### Service-Labels nutzen Jeder TSM-Backup-Service erhΓ€lt automatisch folgende Labels: | Label | Werte | Beschreibung | |-------|-------|--------------| | `backup_type` | `mssql`, `hana`, `file`, ... | Erkannter Backup-Typ | | `backup_category` | `database`, `virtualization`, `filesystem`, `application`, `other` | Kategorie | | `backup_system` | `tsm` | Backup-System | | `frequency` | `hourly`, `daily`, `weekly`, `monthly` | Backup-Frequenz | | `backup_level` | `log`, `full`, `incremental`, `differential` | Backup-Level | | `error_handling` | `tolerant`, `strict` | Fehlerbehandlung | | `node_name` | Original Node-Name | TSM-Node | ### Beispiele: Label-basierte Filterung #### Views erstellen **CheckMK GUI:** `Setup > General > Custom views > Create new view` **Filter-Beispiele:** - **Alle Datenbank-Backups:** `Service labels: backup_category = database` - **Alle fehlgeschlagenen strikten Backups:** `State: CRIT` + `Service labels: error_handling = strict` - **Alle MSSQL-Backups mit tΓ€glicher Frequenz:** `Service labels: backup_type = mssql AND frequency = daily` #### Business Intelligence (BI) ```python # BI-Aggregation: Alle DB-Backups OK? { "type": "bi_aggregation", "title": "Database Backups", "filter": { "service_labels": { "backup_category": "database" } } } ``` ### Status-Bewertungslogik | Bedingung | Error Handling | Ergebnis | |-----------|---------------|----------| | β‰₯ 1x Completed | - | OK βœ… | | Only Pending/Started (<2h) | - | OK βœ… | | Only Pending/Started (>2h) | - | WARN ⚠️ | | Failed/Missed | Tolerant | WARN ⚠️ | | Failed/Missed | Strict | CRIT πŸ”΄ | | Age > Threshold | - | WARN/CRIT βš οΈπŸ”΄ | --- ## πŸ—οΈ Architektur ### Komponenten-Übersicht ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ TSM Server β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Backup Jobs β†’ CSV Export β”‚ β”‚ β”‚ β”‚ (via TSM Queries oder Export-Scripts) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ CSV-Dateien β”‚ (z.B. via NFS, SCP, Rsync) β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Überwachter Host β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ /mnt/CMK_TSM/*.CSV β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Agent Plugin: tsm_backups β”‚ β”‚ β”‚ β”‚ - Liest CSV-Dateien β”‚ β”‚ β”‚ β”‚ - Normalisiert Node-Namen β”‚ β”‚ β”‚ β”‚ - Aggregiert pro Node β”‚ β”‚ β”‚ β”‚ - Gibt JSON aus β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ JSON via CheckMK Agent β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CheckMK Server β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Check Plugin: tsm_backups β”‚ β”‚ β”‚ β”‚ - Parsed JSON β”‚ β”‚ β”‚ β”‚ - Erstellt Services mit Labels β”‚ β”‚ β”‚ β”‚ - Bewertet Status β”‚ β”‚ β”‚ β”‚ - PrΓΌft Schwellwerte β”‚ β”‚ β”‚ β”‚ - Erzeugt Metriken β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ CheckMK Services β”‚ β”‚ β”‚ β”‚ - TSM Backup SERVER_MSSQL β”‚ β”‚ β”‚ β”‚ - TSM Backup VM_HYPERV_01 β”‚ β”‚ β”‚ β”‚ - ... β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Datenfluss 1. **TSM Server**: Exportiert Backup-Statistiken als CSV 2. **Host**: Agent-Plugin liest CSV, aggregiert und normalisiert Daten 3. **CheckMK**: Check-Plugin empfΓ€ngt JSON, erstellt Services, bewertet Status 4. **Output**: Services mit Labels, Metriken, Status ### Node-Normalisierung **Problem:** Redundante TSM-Server-Nodes **Beispiel:** - `RRZ01_MYSERVER_MSSQL` - `RRZ02_MYSERVER_MSSQL` - `NFRZ01_MYSERVER_MSSQL` **LΓΆsung:** Normalisierung entfernt `RRZ*/NFRZ*`-PrΓ€fixe **Ergebnis:** Ein Service `MYSERVER_MSSQL` aggregiert alle Nodes --- ## πŸ” Troubleshooting ### Problem: Keine Services gefunden **Diagnose:** ```bash # Agent-Ausgabe prΓΌfen check_mk_agent | grep -A 20 "<<>> {"NODE1": {...}, "NODE2": {...}} ``` **LΓΆsungen:** - CSV-Verzeichnis `/mnt/CMK_TSM` existiert? - CSV-Dateien vorhanden? (`ls -lh /mnt/CMK_TSM/*.CSV`) - Agent-Plugin ausfΓΌhrbar? (`ls -l /usr/lib/check_mk_agent/plugins/tsm_backups`) - Manuell testen: `/usr/lib/check_mk_agent/plugins/tsm_backups` ### Problem: Services bleiben UNKNOWN **Diagnose:** ```bash # Check-Plugin testen cmk -nv --debug hostname | grep "TSM Backup" ``` **LΓΆsungen:** - Check-Plugin korrekt installiert? - Plugin-Cache lΓΆschen: `cmk -R` - Discovery erneut: `cmk -II hostname` ### Problem: Falsche Backup-Typen erkannt **Node-Namen-Konvention ΓΌberprΓΌfen:** ``` βœ… KORREKT: - SERVER_MSSQL - DATABASE_HANA_01 - FILESERVER_FILE - VM_HYPERV_123 ❌ FALSCH: - MSSQL (zu kurz) - SERVER (kein Typ) - SERVER_12345 (Typ unklar) ``` **LΓΆsung:** Node-Namen-Schema anpassen oder `extract_backup_type()` erweitern ### Problem: CSV-Dateien werden nicht gelesen **CSV-Format prΓΌfen:** ```bash head -n 5 /mnt/CMK_TSM/TSM_BACKUP_SCHED_24H.CSV ``` **Erwartetes Format:** ``` 2026-01-12 08:00:00,FIELD,SERVER_MSSQL,DAILY_FULL,Completed 2026-01-12 09:15:00,FIELD,DATABASE_HANA,HOURLY_LOG,Completed ``` **Spalten:** 1. Timestamp (`YYYY-MM-DD HH:MM:SS`) 2. Beliebiges Feld 3. **Node-Name** 4. **Schedule-Name** 5. **Status** ### Problem: Logs analysieren ```bash # CheckMK-Log tail -f /omd/sites/monitoring/var/log/cmc.log | grep tsm # Agent-Plugin debuggen /usr/lib/check_mk_agent/plugins/tsm_backups 2>&1 | tee /tmp/tsm_debug.log ``` --- ## πŸ“Š Metriken ### Erzeugte Metriken | Metrik | Beschreibung | Einheit | Schwellwerte | |--------|--------------|---------|--------------| | `backup_age` | Zeit seit letztem Backup | Sekunden | Typ-spezifisch | | `backup_jobs` | Anzahl Backup-Jobs | Count | - | ### Grafana-Integration **Beispiel-Query (InfluxDB):** ```sql SELECT mean("backup_age") FROM "tsm_backups" WHERE "backup_type" = 'mssql' AND time > now() - 7d GROUP BY time(1h), "node_name" ``` --- ## πŸ”„ Changelog ### Version 5.0 (2026-01-12) - ✨ **Dynamische Backup-Typ-Erkennung**: Keine feste Liste mehr nΓΆtig - ✨ **Backup-Kategorien**: ZusΓ€tzliches Label `backup_category` - ✨ **Erweiterte Kommentierung**: VollstΓ€ndige Docstrings - ✨ **Neue Typen**: PostgreSQL, MariaDB, MongoDB - πŸ› **Bugfix**: ServiceLabel API fΓΌr CheckMK 2.3.0p40 ### Version 4.0 (2026-01-10) - ✨ ServiceLabel API-KompatibilitΓ€t mit CheckMK 2.3.0p40 - πŸ“ Erweiterte Dokumentation ### Version 3.0 (2025-12-15) - ✨ Node-Normalisierung fΓΌr Redundanz - ✨ Aggregation pro logischem Node - πŸ”§ Typ-spezifische Schwellwerte ### Version 2.0 (2025-11-20) - ✨ Tolerantes Error-Handling - ✨ Service-Labels ### Version 1.0 (2025-11-01) - πŸŽ‰ Initiales Release --- ## πŸ“ Lizenz MIT License - Siehe LICENSE Datei ## πŸ‘€ Autor **Marius Gielnik** IT Product Owner - CheckMK Monitoring GC-Gruppe (Cordes und GrΓ€fe KG) ## 🀝 Support - **Issues:** GitHub Issues - **Fragen:** CheckMK Community Forum - **Email:** [deine-email]@example.com --- ## πŸ“š WeiterfΓΌhrende Links - [CheckMK Plugin Development](https://docs.checkmk.com/latest/de/devel_check_plugins.html) - [IBM Spectrum Protect Documentation](https://www.ibm.com/docs/en/spectrum-protect) - [CheckMK Labels](https://docs.checkmk.com/latest/de/labels.html) --- **Letzte Aktualisierung:** 2026-01-12 **Version:** 4.1