Aktionen

Zabbix: VMware vSphere Leistungsdaten Performance Counter abfragen

Aus znilwiki

Changelog:

  • 05.06.2018: Erste Version



1 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.



2 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.


2.1 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



2.2 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.


2.2.1 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.

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:

ClipCapIt-180605-155635.PNG

Die kommt in der Regel ab vSphere 6.0. Abhilfe ist das MOB Plugin wieder zu aktivieren:

ClipCapIt-180605-160029.PNG

oder per Browser im Host Client:

ClipCapIt-180605-160529.PNG

Unmittelbar danach funktioniert es, er wird Benutzername (root) und Passwort abfragen und euch dann die Info anzeigen:

ClipCapIt-180605-160756.PNG

Mein Testsystem hat halt nur Nullen, auf euren Profi-Systemen sollte da etwas eindeutiges stehen.


2.2.2 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:

ClipCapIt-180605-162236.PNG

Danach habt die UUID der VMs in einer eigene Spalte aus der Ihr den Wert auch heraus kopieren könnt:

ClipCapIt-180605-162426.PNG
Warning.png
Warnung: Wenn Ihr die Abfragen gegen ein vCenter und nicht direkt gegen einen ESXi-Hosts stellt ist dieser Wert der Falsche. Nutzt die PowerShell-Abfrage oder die LLD-Abfrage von Zabbix



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.


3 Abfragen von VM Daten

Ihr legt die VM als Host an. Auf diesen sollten dann folgende Makros gelten:

ClipCapIt-180605-165210.PNG


3.1 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:

ClipCapIt-180605-165915.PNG

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:

ClipCapIt-180605-170258.PNG

Auf den Unterseiten, z.B. CPU sind dann die einzelnen Counter beschrieben:

ClipCapIt-180605-170431.PNG

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



3.2 Fertige Abfragen

CPU usage %

vmware.vm.perfcounter[{$URL},{$UUID_VM},"cpu/usage[average]"]
ClipCapIt-180606-085208.PNG



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
ClipCapIt-180606-090232.PNG



Guest Operating System Uptime

vmware.vm.perfcounter[{$URL},{$UUID_VM},"sys/osUptime[latest]"]
ClipCapIt-180606-101136.PNG

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}]
ClipCapIt-180606-085645.PNG

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}]


4 Abfragen von ESXi-Host Daten

Ihr legt den ESXi als Host an. Auf diesen sollten dann folgende Makros gelten:

ClipCapIt-180606-090712.PNG

Eure UUID besteht bestimmt nicht nur aus Nullen, siehe Erklärung weiter oben.

4.1 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.


4.2 Fertige Abfragen

CPU usage %

vmware.hv.perfcounter[{$URL},{$UUID},"cpu/usage[average]"]

auch hier wieder einen Multiplikator von

0.01

verwenden.


5 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



6 Links



7 Kommentare


Danny

6 Monaten zuvor
Punktzahl 0++

Hi, vielen Dank für die Anleitung, sie hat mir wirklich weitergeholfen. Ich habe allerdings nicht mit der Variable {$UUID} gearbeitet, sondern einfach das Template "VM VMware Guest" um z.B. das Item "CPU usage %" erweitert. Dort sieht der Key dann wie folgt aus: vmware.vm.perfcounter[{$URL},{HOST.HOST},"cpu/usage[average]"] Dadurch entfällt die Suche nach den UUIDs. Ich verwende das Ganze in Verbindung mit einem vCenter Server. Gruß

Dannny

BLinz

6 Monaten zuvor
Punktzahl 0++

Moin, bei mir im Unternehmen werden die Server "manuell" (per Skript) hinzugefügt und nicht über das LLD für VMware.

Grund ist z.B. das nach einem Restore einer VM aus dem Backup man die neue VM nicht einfach auf die alte zeigen lassen kann wenn diese per LLD erstellt wurde. Wir wollen aber durchgängig die Leistungsdaten haben bzw. müssen diese dem Kunden nachweisen.
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.