Das Problem
“Help me, Obi-Wan Kenobi. My UserParameter is not supported. You’re my only hope.”
Du hast ein PowerShell-Script geschrieben, das Metriken für Zabbix liefert. Die Config liegt in zabbix_agentd.d\, der Agent ist neugestartet. In Zabbix: ZBX_NOTSUPPORTED. Kein Fehler im Agent-Log, keine Erklärung.
Und dann, Stunden später, wenn die Items endlich auftauchen: Value "1,1" not suitable for Numeric float.
Zwei separate Probleme, beide on Windows, beide nicht offensichtlich.
Pitfall 1: Zabbix Agent 2 ignoriert LF-Konfigdateien stillschweigend
Symptom
ZBX_NOTSUPPORTED: Unknown metric ga4.azcopy.upload_success
Du hast die Config in C:\Program Files\Zabbix Agent 2\zabbix_agentd.d\ deployt. Der Agent läuft. Andere UserParameter in demselben Verzeichnis funktionieren. Deiner nicht.
Diagnose
Der Agent-Log zeigt nichts Verdächtiges:
zabbix_agent2.log: started
zabbix_agent2.log: accepting connections
Vergleich mit einer funktionierenden Config:
# Zeilenenden der eigenen Config prüfen
$bytes = [System.IO.File]::ReadAllBytes("C:\Program Files\Zabbix Agent 2\zabbix_agentd.d\meine_config.conf")
# Suche nach CR (0x0D) vor LF (0x0A)
$hasCRLF = $false
for ($i = 0; $i -lt $bytes.Length - 1; $i++) {
if ($bytes[$i] -eq 0x0D -and $bytes[$i+1] -eq 0x0A) { $hasCRLF = $true; break }
}
Write-Host "Hat CRLF: $hasCRLF"
Ergebnis: Hat CRLF: False — die Config hat Unix-Zeilenenden (LF), keine Windows-Zeilenenden (CRLF).
Ursache
Zabbix Agent 2 auf Windows parst Config-Dateien mit LF-Zeilenenden nicht. Das ist kein Bug der dokumentiert ist, es gibt keine Fehlermeldung, der Agent startet normal — er lädt die Datei einfach nicht.
Warum hat die Config LF? Weil sie auf Linux erstellt oder bearbeitet wurde, per scp übertragen, oder aus einem Git-Repository ohne .gitattributes stammt.
Fix
# In PowerShell auf dem Zielhost
$confPath = "C:\Program Files\Zabbix Agent 2\zabbix_agentd.d\meine_config.conf"
(Get-Content $confPath) | Set-Content $confPath
Set-Content schreibt immer mit CRLF. Dann Agent neustarten:
Restart-Service "Zabbix Agent 2"
Oder von Linux beim Deployen konvertieren:
# Vor dem scp konvertieren
sed -i 's/\r//' config.conf # Sicherstellen: keine alten CRs
sed -i 's/$/\r/' config.conf # LF → CRLF
scp config.conf user@windows-host:"C:/Program Files/Zabbix Agent 2/zabbix_agentd.d/"
Verifikation
# Agent direkt testen (als Administrator)
& "C:\Program Files\Zabbix Agent 2\zabbix_agent2.exe" -t "mein.custom.key"
Erwartete Ausgabe nach Fix:
mein.custom.key [s|1]
Pitfall 2: Deutsches Windows, PowerShell und das Komma-Problem
Symptom
Drei von vier Items liefern Daten. Das vierte:
Value of type "string" is not suitable for value type "Numeric (float)". Value "1,1"
Dein Script liefert 1,1 statt 1.1.
Ursache
PowerShell respektiert die Windows-Systemsprache. Auf einem deutschen Windows ist das Dezimaltrennzeichen ein Komma, nicht ein Punkt. Zabbix erwartet einen Punkt — immer, unabhängig von der Systemsprache des Agenten.
Das passiert bei allen Operationen die Dezimalzahlen ausgeben:
# Deutsches Windows — gibt "1,5" aus
$hours = [math]::Round(1.5, 1)
Write-Output $hours # → "1,5"
# Auch explizites ToString hilft nicht immer
Write-Output $hours.ToString() # → "1,5"
Fix
# InvariantCulture erzwingt Punkt als Dezimaltrenner
$hours = [math]::Round(((Get-Date) - $logFile.LastWriteTime).TotalHours, 1)
Write-Output ($hours.ToString([System.Globalization.CultureInfo]::InvariantCulture))
Das gilt für alle numerischen Ausgaben in Zabbix UserParameter-Scripts auf deutschen Windows-Systemen die Dezimalwerte liefern sollen.
Bonusfalle: Zwei Zabbix-Agent-Dienste
Falls du den Dienst neustartest und sich trotzdem nichts ändert: Prüf ob du den richtigen Dienst erwischst.
Get-Service *zabbix*
Status Name DisplayName
------ ---- -----------
Stopped ZabbixAgent Zabbix Agent
Running ZabbixAgent2 Zabbix Agent 2
Auf Windows-Hosts die schon länger laufen findet man manchmal beide Versionen. Der alte “Zabbix Agent” ist gestoppt, läuft aber nicht — Restarts auf den falschen Dienst verpuffen lautlos.
Der aktive Dienst heißt "Zabbix Agent 2" (mit Leerzeichen), nicht "ZabbixAgent2":
Restart-Service "Zabbix Agent 2"
Checkliste: UserParameter auf Windows debuggen
Wenn ein UserParameter ZBX_NOTSUPPORTED zurückgibt:
- Config-Datei hat CRLF-Zeilenenden? (
Set-Contentanwenden) - Den richtigen Dienst neugestartet? (
Get-Service *zabbix*prüfen) - Agent-Test direkt auf dem Host:
zabbix_agent2.exe -t "mein.key" - Script manuell ausführen:
powershell -File "C:\Skripte\mein_script.ps1" -Metric test
Wenn das Item Daten liefert aber als Fehler markiert ist:
- Dezimalwerte:
ToString([System.Globalization.CultureInfo]::InvariantCulture) - Ganzzahlen:
[int]oder[math]::Round(..., 0)sind unproblematisch - Item-Typ korrekt?
Numeric (float)für Dezimalwerte,Numeric (unsigned)für Integer
TL;DR
- CRLF: Zabbix Agent 2 auf Windows lädt LF-Configs nicht — kein Fehler, einfach ignoriert. Fix:
(Get-Content config.conf) | Set-Content config.conf - Dezimaltrennzeichen: PowerShell auf deutschem Windows gibt
1,1aus, Zabbix will1.1. Fix:.ToString([System.Globalization.CultureInfo]::InvariantCulture) - Dienst:
Get-Service *zabbix*zeigt ob du den richtigen Dienst erwischst.