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-Content anwenden)
  • 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

  1. CRLF: Zabbix Agent 2 auf Windows lädt LF-Configs nicht — kein Fehler, einfach ignoriert. Fix: (Get-Content config.conf) | Set-Content config.conf
  2. Dezimaltrennzeichen: PowerShell auf deutschem Windows gibt 1,1 aus, Zabbix will 1.1. Fix: .ToString([System.Globalization.CultureInfo]::InvariantCulture)
  3. Dienst: Get-Service *zabbix* zeigt ob du den richtigen Dienst erwischst.