Zabbix: VMware vSphere Leistungsdaten Performance Counter abfragen
Aus znilwiki
Changelog:
- 05.06.2018: Erste Version
Vorwort
Es gibt Momente im Leben eines Administrators (Techniker, IT-Consultant usw.) die fühlen sich an wie eine Offenbarung, als ob sich eine große Tür vor einem öffnet und man viele neue Dinge sieht.
So einen Moment hatte ich gerade und teile nun mein Wissen mit euch.
Ich könnte es auch als "Jetzt wo ich weiß wie es geht, weiß ich auch wonach ich hätte suchen müssen".
Bei einem Kunden soll ich diverse Leistungsdaten von virtuellen Maschinen mit Zabbix überwachen.
Aber - für mich Premiere - ich darf den Zabbix Agenten nicht nutzen sondern die VMs nur von außen überwachen.
Es gibt dazu ja schon fertige Templates in Zabbix und diverse eingebaute Item-Keys, z.B.
vmware.vm.cpu.num[<url>,<uuid>] vmware.vm.cpu.usage[<url>,<uuid>]
welche einem die Anzahl der konfigurierten CPU-Kerne und deren Auslastung in Hz zurückgeben.
Und da war auch schon eines meiner Probleme. CPU-Last in Hz. Ok, das hatte ich bei den ESX-Hosts schon, dort hatte ich aber auch die Maximale-Hz Zahl so das man sich den Rest per Calculated Item selbst ausrechnen konnte.
Direkt auf der VM habe ich diesen Wert nicht. Und da nicht alle Hosts in meinen Szenario gleich schnelle CPUs haben konnte ich auch keinen festen Wert nehmen.
Besser wäre wenn man die CPU Last gleich in Prozent bekäme, das vCenter und der ESXi-Host zeigen mir schließlich diesen Wert in den Leistungsdiagrammen auch an.
Und überhaupt, es sind ja nun nicht besonders viele Werte die Zabbix da sammelt, ist ein wenig dünn.
Tja, das war heute mein Glücksmoment: Zabbix kann! CPU gleich in Prozent! Und noch mehr Leistungsdaten von Hypervisor, VM und CLuster liefern. Mit Bordmittel.
Voraussetzungen
Nachfolgend wird das alles von Hand eingerichtet. Man könnte das auch in den entsprechenden Vorlagen mit Autodiscover von ESXi-Hosts und VMs machen.
Zabbix Server
In der Konfigurationsdatei des Zabbix-Servers müssen VMwareCollectors gestartet werden:
nano /etc/zabbix/zabbix_server.conf
und im Abschnitt
### Option: StartVMwareCollectors # Number of pre-forked vmware collector instances. # # Mandatory: no # Range: 0-250 # Default: StartVMwareCollectors=5
und mindestens einen 'VMwareCollector starten (hier sind es 5)
Falls Ihr da etwas geändert habt muss der VMware-Server Dienst neu gestartet werden:
systemctl restart zabbix-server.service
Makros / Macros
Alle Templates und Items benötigen die folgenden Makros um Daten abzufragen:
{$URL} : Pfad zum SDK des ESXi-Hosts oder des vCenters https://vcenter.meinedom.local/sdk https://12.34.56.78/sdk {$USERNAME} : Benutzername der sich am ESXi-Hosts bzw. vCenter anmelden darf. Sollte zumindest alles lesen können root administrator@vsphere.local Spezieller Zabbix Benutzer {$PASSWORD} : Das Passwort des vorstehenden Benutzers
Zusätzlich müsst Ihr bei allen Hypervisior / ESXi-Host die Ihr überwachen wollt folgende Makro hinterlegen:
{$UUID} : Die UUID des ESXi-Hosts der abgefragt werden soll 00000000-0000-0000-0000-000000000000 12334567-1234-1234-1234-123456789012
Und bei allen VMs:
{$UUID_VM} : Die UUID der VM die abgefragt werden soll 12334567-1234-1234-1234-123456789012
Nachfolgend beschreibe ich woher Ihr die UUIDs bekommt.
UUID ESXi-Server
Variante 1: per SSH Zugriff auf den Hosts
Wir melden uns per puTTY am ESXi an und nehmen einen oder alle der folgenden Befehle:
vim-cmd hostsvc/hosthardware | grep uuid grep uuid /etc/vmware/esx.conf esxcfg-info -y | grep "System UUID"
Die Ausgabe sieht wie folgt aus:
[root@ns3050687:~] vim-cmd hostsvc/hosthardware | grep uuid uuid = "00000000-0000-0000-0000-000000000000", [root@ns3050687:~] grep uuid /etc/vmware/esx.conf /system/uuid = "59f0eb9a-b44f-32bc-4b9f-0cc47acb91a0" [root@ns3050687:~] esxcfg-info -y | grep "System UUID" |----System UUID.................................................59f0eb9a-b44f-32bc-4b9f-0cc47acb91a0
Ja, die UUID kann auch schon mal nur aus Nullen bestehen. Meist wenn es keine richtige Server-Hardware ist. Im Zweifel ausprobieren.
Wenn die Werte unterschiedlich sind - probiert es mit dem aus dem ersten Befehl zu erst - der ist es in der Regel (wenn die Hardware eine UUID bereit stellt)
Variante 2: per Webzugriff Zugriff auf den Hosts
Dazu rufen wir im Browser
https://<host>/mob/?moid=ha%2dhost&doPath=hardware%2esystemInfo
auf. Sehr wahrscheinlich bekommt Ihr da eine Fehlermeldung wie diese:
Die kommt in der Regel ab vSphere 6.0. Abhilfe ist das MOB Plugin wieder zu aktivieren:
oder per Browser im Host Client:
Unmittelbar danach funktioniert es, er wird Benutzername (root) und Passwort abfragen und euch dann die Info anzeigen:
Mein Testsystem hat halt nur Nullen, auf euren Profi-Systemen sollte da etwas eindeutiges stehen.
UUID VM Virtuelle Maschine
Die UUID einer VM bekommen wir am einfachsten im Client heraus:
vSphere Client (bis 6.0)
Geht auf den Host auf den Reiter "Virtuelle Maschinen", rechte Maustaste auf die Zeile mit den Überschriften und den Haken bei UUID setzen:
Danach habt die UUID der VMs in einer eigene Spalte aus der Ihr den Wert auch heraus kopieren könnt:
VMware PowerCLI PowerShell
Mit vCenter verbinden:
Connect-VIServer IP_oder_Name_vCenter
Und die
Get-VM NameDerVM | Get-View | Select-Object -ExpandProperty Config | ForEach-Object { $_.InstanceUuid }
Der benötigte Wert ist die InstanceUuid (gibt der Einzeiler direkt aus), über diese könnt Ihr das vCenter nach der VM fragen.
Falls Ihr die PowerShell gegen den ESXi nutzt (ohne vCenter so wollt Ihr die UUID:
Get-VM NameDerVM | Get-View | Select-Object -ExpandProperty Config | ForEach-Object { $_.Uuid }
per Browser: (ab 6.5)
habe ich noch keine Möglichkeit gefunden.
Abfragen von VM Daten
Ihr legt die VM als Host an. Auf diesen sollten dann folgende Makros gelten:
Grundlagen
Das Item was wir nutzen ist dieses:
vmware.vm.perfcounter[{$URL},{$UUID_VM},<path>,<instance>] {$URL} : Die URL zu /sdk des vCenters oder des ESXi-Hosts {$UUID_VM} : Die eindeutige ID der VM <path> : Pfad zum gewünschten Messwert, genaueres folgt in diesem Text <instance> : Manche Messwerte benötigen genauere Angaben, zum Beispiel bei Festplatten welche
Siehe auch https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/simple_checks/vmware_keys
Für unsere Zwecke rufen wir dieses wie folgt auf: (zum kopieren)
vmware.vm.perfcounter[{$URL},{$UUID_VM},"Pfad/Counter[Parameter]"]
Um zum Beispiel die CPU-Auslastung der VM in Prozent zu erhalten verwenden wir folgenden Key:
vmware.vm.perfcounter[{$URL},{$UUID_VM},"cpu/usage[average]"]
Als fertiges Item sieht es so aus:
Wenn Ihr eines fertig und funktionierend habt könnt Ihr ja klonen.
Beachtet das die CPU-Last durch 100 geteilt wird - das ist nur hier so weil der Wert angepasst werden muss.
Der Aufbau ist also immer gleich - entscheidend ist der Pfad/Counter[Parameter].
Die findet Ihr alle hier:
https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/vim.PerformanceManager.html
gleich im oberen Abschnitt gibt es Links zu den einzelnen Bereichen:
Auf den Unterseiten, z.B. CPU sind dann die einzelnen Counter beschrieben:
Nutzen könnt Ihr alle Counter bei denen in der Spalte ENTITY auch VirtualMachine aufgeführt ist.
Wenn Ihr diese Einträge nutzt müsst Ihr diese wie folgt im Item-Key eintragen:
cpu/usage[average] cpu : Pfad, cpu weil die Daten von der Seite CPU stammen usage : Ist der Wert aus der ersten Spalte COUNTER [average] : Ist einer der möglichen Wert aus der Spalte ROLLUPTYPE welxhe für diesen Counter angegeben wurde
Leider musste ich etwas probieren um die richtigen Namen für die Pfade zu Ermitteln, hier meine bisherigen Ergebnisse:
CPU Counters = cpu Memory Counters = mem Virtual Disk Counters = virtualDisk Disk I/O Counters = disk System = sys
Fertige Abfragen
CPU usage %
vmware.vm.perfcounter[{$URL},{$UUID_VM},"cpu/usage[average]"]
Guest memory usage
wird über einen Zabbix-Simple Key zur Verfügung gestellt, den Wert den wir im vCenter sehen müssen wir errechnen aus usage und shared:
last("vmware.vm.memory.size.usage.guest[{$URL},{$UUID_VM}]")+last("vmware.vm.memory.size.shared[{$URL},{$UUID_VM}]")
Das ist dann wieder ein Zahlenwert.
Um das ganze als Prozentwert zu bekommen:
(last("vmware.vm.memory.size.usage.guest[{$URL},{$UUID_VM}]")+last("vmware.vm.memory.size.shared[{$URL},{$UUID_VM}]"))/last("vmware.vm.memory.size[{$URL},{$UUID_VM}]")*100
Guest Operating System Uptime
vmware.vm.perfcounter[{$URL},{$UUID_VM},"sys/osUptime[latest]"]
Die liefert mir bei einem ESXi-Solo-System Werte die nahezu Identisch mit dem Wertes eines Zabbix-Agenten sind (Item system.uptime
).
In einem Cluster via vCenter kommen manchmal komische Werte ... da ist die VM dann schon länger gebootet als Eingeschaltet (vmware.vm.uptime
).
Scheinbar kommt dieser Wert durcheinander wenn die VMs zwischen Clustern verschoben werden, ich habe eine Stichproben überprüft und der Rückgabe ist glaubwürdig.
Disk Hard Disk 1 outstanding read requests
vmware.vm.perfcounter[{$URL},{$UUID_VM},"virtualDisk/readOIO[latest]",scsi0:0]
oder bei Nutzung von Discovery per vmware.vm.vfs.dev.discovery[{$URL},{$UUID_VM}]
:
vmware.vm.perfcounter[{$URL},{$UUID_VM},"virtualDisk/readOIO[latest]",{#DISKNAME}]
Disk Hard Disk 1 outstanding write requests
vmware.vm.perfcounter[{$URL},{$UUID_VM},"virtualDisk/writeOIO[latest]",scsi0:0]
oder bei Nutzung von Discovery per vmware.vm.vfs.dev.discovery[{$URL},{$UUID_VM}]
:
vmware.vm.perfcounter[{$URL},{$UUID_VM},"virtualDisk/writeOIO[latest]",{#DISKNAME}]
Abfragen von ESXi-Host Daten
Ihr legt den ESXi als Host an. Auf diesen sollten dann folgende Makros gelten:
Eure UUID besteht bestimmt nicht nur aus Nullen, siehe Erklärung weiter oben.
Grundlagen
Das Item was wir nutzen ist dieses:
vmware.hv.perfcounter[{$URL},{$UUID},<path>,<instance>] {$URL} : Die URL zu /sdk des vCenters oder des ESXi-Hosts {$UUID} : Die eindeutige ID des ESXi-Hosts <path> : Pfad zum gewünschten Messwert, genaueres folgt in diesem Text <instance> : Manche Messwerte benötigen genauere Angaben, zum Beispiel bei Festplatten welche
Siehe auch https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/simple_checks/vmware_keys
Der Rest funktioniert 1:1 wie bei den VMs.
Nutzen könnt Ihr in diesem Falle alle Counter bei denen in der Spalte ENTITY der Typ
HostSystem
aufgeführt ist.
Fertige Abfragen
CPU usage %
vmware.hv.perfcounter[{$URL},{$UUID},"cpu/usage[average]"]
auch hier wieder einen Multiplikator von
0.01
verwenden.
Verfügbare Counter
Hier noch mal die "Übersetzungstabelle":
CPU Counters = cpu : https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/cpu_counters.html Memory Counters = mem : https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/memory_counters.html Virtual Disk Counters = virtualDisk : https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/virtual_disk_counters.html Disk I/O Counters = disk : https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/disk_counters.html System = sys : https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/system_counters.html
Die Liste ist noch unvollständug, das Inhaltsverzeichnis findet Ihr hier:
https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/vim.PerformanceManager.html
Links
- Hat mich erst auf die richtige Spur gebracht: https://www.zabbix.com/forum/zabbix-help/42965-create-an-item-for-total-cpu-usage-on-vmware-guest-template
- Die Anleitung für 3.0: https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/simple_checks/vmware_keys
- Die Die Referenz für vSphere 6.0: https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/vim.PerformanceManager.html
- CPU: https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/cpu_counters.html
- Memory: https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/memory_counters.html
- Virtual Disk: https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/virtual_disk_counters.html