Aktionen

Zabbix:Template Windows Top 5 Prozesse ermitteln

Aus znilwiki

Changelog:

  • 07.11.2020 erste Version

1 Vorwort

Ich hatte gerade privat das Problem das einer meiner Windows-Server zwischendurch ständig eine hohe CPU-Last meldet (bei mir ein "über 90% CPU Auslastung für mehr als 5 Minuten").
Und immer wenn ich nachgesehen habe war natürlich alles in Ordnung ...

Also habe ich mir überlegt ständig die 5 Prozesse mit der höchsten CPU-Auslastung zu ermitteln.
Dann muss ich bei einem Alarm ja nur die Werte mit dieser Liste abgleichen bzw. kann diese ja ggf. im Trigger gleich mit angeben.

Nachfolgend findet Ihr die Schritt für Schritt Anleitung, am Ende gibt es auch ein Download des fertigen Templates.

Warning.png
Warnung: Es wird mindestens PowerShell Version 5.0 benötigt! z.B. bei Server 2012 R2 müsst Ihr ggf. PowerShell 5 nachinstallieren


PowerShell 5.1 für Windows 7, Windows 8(.1), Windows Server 2008 (R2) und Windows Server 2012 (R2):

https://www.microsoft.com/en-us/download/details.aspx?id=54616

2 Das Grund-Item (RAW JSON Item)

Ich arbeite inzwischen gerne mit JSONs in Zabbix. Auf die Art kann ich hier zum Beispiel alle Werte der Top 5 Prozesse in einem Rutsch übergeben und mir trotzdem daraus 15 Werte holen.
Früher hätte ich das mit einem Skript und 15 mal zabbix_sender.exe Aufrufen geholfen - das hier finde ich viel eleganter.
Das JSON zerpflückt der Zabbix-Server dann in die Einzelwerte.

2.1 Variante 1 per Userparameter

Zunächst müssen wir dem ZabbixAgenten einen neuen Befehl beibringen:
Auf eurem Windows-System öffnet Ihr die Konfigurationsdatei eures Zabbix-Agenten ( zabbix_agentd.win.conf )und fügt folgende Zeile ein:

UserParameter=znil.Top5Processes,powershell "Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | where-object { $_.Name -ne \"_Total\" -and $_.Name -ne \"Idle\"} | Sort-Object PercentProcessorTime -Descending | select -First 5 | select Name,IDProcess,PercentProcessorTime | ConvertTo-Json -Compress"


Danach den Dienst des Zabbix-Agenten neu starten.
Lokal testen könnt Ihr das mit folgendem Befehl:

zabbix_agentd.exe -c zabbix_agentd.win.conf -t znil.Top5Processes

Den solltet Ihr im Verzeichnis des Zabbix-Agenten ausführen. Mit -c wird die Konfigurationsdatei angegeben.

ClipCapIt-201107-113922.PNG


Dann erstellen wir in Zabbix ein Item:

ClipCapIt-201107-114435.PNG
Name:                   RAW JSON - Top 5 Processes
Type:                   Zabbix agent (active)
Key:                    znil.Top5Processes
Type of information:    Text
Update interval:        1m
History storage period: 1d
New application:        Top 5 Processes

Das Item erstellt Ihr entweder in einem Template und weißt es einem Host zu (empfohlen) oder Ihr erstellt es direkt auf einem Host.
Nach einer Weile sollte es einen JSON als Wert zurück liefern:

ClipCapIt-201107-115315.PNG


ClipCapIt-201107-115350.PNG


Damit ist das Grund-Item fertig.


3 Variante 2:

Eine andere Variante gibt es - noch - nicht. Der Kniff mit dem UserParameter und dem PowerShell-Aufruf hat den Charme das nur die benötigten Werte in der richtigen Reihenfolge zurück kommen.
Zabbix könnte den WMI-Schlüssel auch direkt abfragen - aber das wäre dann noch nicht nach Auslastung sortiert und es wären auch alle Prozesse statt nur der ersten 5.
Mit einer geschickten WMI Abfrage + JavaScript ließe sich da sicherlich etwas machen, ich hatte aber noch nicht die Muße dazu.


4 Die Einzel-Items für die Top 5 Prozesse

Das Grund-Item liefert uns ein JSON wie in diesem Beispiel:

[
	{
		"Name": "BlueIris",
		"IDProcess": 19000,
		"PercentProcessorTime": 73
	},
	{
		"Name": "rsync#14",
		"IDProcess": 18980,
		"PercentProcessorTime": 11
	},
	{
		"Name": "System",
		"IDProcess": 4,
		"PercentProcessorTime": 5
	},
	{
		"Name": "WmiPrvSE#1",
		"IDProcess": 6400,
		"PercentProcessorTime": 5
	},
	{
		"Name": "svchost#14",
		"IDProcess": 1688,
		"PercentProcessorTime": 0
	}
]

Daraus bauen wir uns nun über die Dependent item Funktion von Zabbix die einzelnen Items:

ClipCapIt-201107-124544.PNG
ClipCapIt-201107-124658.PNG

Also für den Namen des 1. Prozesses die folgenden Werte:

Name:                   #1 Process Name
Type:                   Dependent item
Key:                    znil.Top5Processes.1.Name
Master item:            RAW JSON - Top 5 Processes
Type of information:    Character
History storage period: 14d
Applications:           Top 5 Processes

Unter PreProcessing stellen wir folgendes ein:

JSONPath                $[0].Name


Das Item speichern und noch 2 mal Klonen mit folgenden Einstellungen:
Prozess ID:

Name:                   #1 Process ID
Type:                   Dependent item
Key:                    znil.Top5Processes.1.IDProcess
Master item:            RAW JSON - Top 5 Processes
Type of information:    Numeric (unsigned)
History storage period: 14d
Trend storage period:   Do not keep trends
Applications:           Top 5 Processes

Unter PreProcessing stellen wir folgendes ein:

JSONPath                $[0].IDProcess


CPU Zeitanteil in Prozent:

Name:                   #1 Process Percent Processor Time
Type:                   Dependent item
Key:                    znil.Top5Processes.1.PercentProcessorTime
Master item:            RAW JSON - Top 5 Processes
Type of information:    Numeric (unsigned)
Unit:                   %
History storage period: 14d
Trend storage period:   Do not keep trends
Applications:           Top 5 Processes

Unter PreProcessing stellen wir folgendes ein:

JSONPath                $[0].PercentProcessorTime


Damit haben wir alle Daten des ersten Prozesses (und das ist der mit der höchsten CPU Last):

ClipCapIt-201107-130223.PNG


Jetzt müssen wir das für die Prozesse 2 bis 5 für alle 3 Items wiederholen:

  • Bei Name die Nummer erhöhen (#2, #3, #4 und #5)
  • Bei Key die Nummer auf den gleichen Wert erhöhen (znil.Top5Processes.2 bis znil.Top5Processes.5)
  • Unter Preprocessing die Nummer ebenfalls erhöhen ( $[1]. bis $[4]., immer um 1 kleiner als das Item selbst):

Die Items werden jedesmal neu mit Daten gefüllt wenn ein neuer JSON eintrifft.
Wird der Host von einem Proxy überwacht so muss auch dieser erst die Konfiguration vom Server übernehmen (Standard einmal die Stunde), offensichtlich baut dann der Proxy den JSON auseinander.

ClipCapIt-201107-131516.PNG



5 Trigger

Nun, ich habe mir erst einmal keine Trigger erstellt - und bin auch nicht sicher ob das an diesen Items sinnvoll ist.
Wenn dann etwas wie "Die Prozess-ID von #1 hat sich die letzten 10 Minuten nicht geändert und die CPU Last lag immer über 90%" oder so.
Ihr macht das schon.
Ich nutze andere "Die CPU ist auf 100% seit x Minuten" Trigger und nutze diese Items nur um festzustellen was los war.


6 Fertiges Template

Hier das Template für Zabbix 5.0.x:
Znil_Template_Top_5_Processes_CPU.zip
Bitte beachtet das Ihr trotzdem noch die UserParameter-Einstellungen machen müsst!


7 Kommentare


Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen. Bei einem Kommentar wird deine IP-Adresse zusammen mit dem Text, den angegebenen Namen bzw. der Email-Adresse in der Datenbank für die Kommentare dauerhaft gespeichert. Genaueres kannst du hier nachlesen: Datenschutzerklärung