Alle reden über das Wetter
Reden über das Wetter gehört zu allgemeinen menschlichen Kommunikationsritualen. Doch was ist, wenn man an in einem fensterlosen Raum an der Konsole gekettet, sein Dasein als Administrator fristet und überhaupt nicht mehr weiß, wie das Wetter draussen ist? Auch in dieser misslichen Lage kann vC Ops einem helfen.
vC Ops ist in erster Linie für die Visualierung der Performance-Daten des vCenters und die Kapazitätsplanung zuständig, ist aber auch offen für andere metrische Daten (diese müssen allerdings als Zeitreihe vorliegen. Das besondere an vC Ops ist die patentierte mathematische Analyse der Daten und das Konzept der Anomalien. Ob die Metrik selbst die E/A-Last oder den Blutdruck wiedergibt spielt für die Analyse erst mal gar keine Rolle. Wenn die Werte an drei Perioden (Stunden, Tagen, Wochentagen, Monatstagen) ähnliche Werte vorweisen, werden diese als normal bezeichnet. Abweichungen von dem Normalitätstunnel sind Anomalien. Ein beliebtes Beispiel bei der Darstellung von vC Ops ist der Puls des Menschen. 120 Herzschläge pro Minute sind “gut” und “normal” beim Sport, aber vielleicht nicht bei Buch lesen im Bett.
vC Ops Adapter
Was muss und kann ich also tun, um Daten aus anderen Quellen an vC Ops anzubinden? Dafür sind die “Adapter” gedacht. Durch vC Ops Adapter kann ich mehr oder minder ausgefeilt und komplex nahezu jegliche Datenquellen an vC Ops anbinden. Dies können SNMP daten, Text-Files, SQL Datenbanken oder sonstiges sein.
Bevor ich allerdings anfange Hinz und Kunz Daten in vC Ops einfliessen zu lassen, sollte man über die Ziele und die Sinnhaftigkeit der Daten im Klaren sein. Die Diskussion über das “warum” und “was” sollte auf jeden Fall geführt werden, bevor man die Kaffeemaschine und Tonerstand im Drucker in sein Anforderungskatalog aufnimmt.
Um die grundsätzlichen Möglichkeiten kennenzulernen, sollte man die allgemeine Dokumentation der verschiedenen Adapter lesen. Die Adapter sind in der Kürze in “vC Ops Enterprise Adapter Guide” vorgestellt: http://www.vmware.com/pdf/vcops-enterprise10-adapter-guide.pdf
Diese Mindmap stellt die Anbindungsmöglichkeiten und die verschiedenen Adapter dar (kein Anspruch auf Vollständigkeit, da immer neue Herstelleradapter erstellt und freigegeben werden).
Der einfachste Adapter ist der HTTP POST Adapter. Dieser ist schon vorinstalliert und kann ganz einfach mit einem REST Client getestet werden.
Anbindung der Wetterdaten an vC Ops
Voraussetzungen
Um dem beschriebenen Vorgehen folgen zu können brauchen wir folgende Zutaten
- vC Ops in der Advanced oder Enterprise Version
- Zugang zu einem Linux System (z.B. vC Ops UI VM)
- Browser mit REST AddOn (Firefox oder Chrome)
- Zugang zum Internet um Wetterdaten zu holen.
Wetterdaten holen
Sollte man im Besitz einer Internetfähigen Wetterstation sein, könnte man diese auf dem Dach installieren und die Daten ablesen. Da wir aber grundsätzlich das Gebäude nicht ohne Grund verlassen wollen, holen wir die Wetterdaten aus dem Internet (oder im Neudeutsch der Tageszeitungen: “die Daten kommen aus der Cloud” 🙂 In diesem Fall von http://openweathermap.org – auf dieser Seite können Daten für viele Lokationen werbefrei und in verschiedenen Formaten abgefragt werden. Für Bonn wäre es z.B. die folgende URL:
http://api.openweathermap.org/data/2.5/weather?q=Bonn,de
Erstaunlicherweise funktioniert es sogar für Bielefeld.
In meinem Fall steht die Cluster und der vCenter in Zürich. Ausserdem möchte ich die Daten metrisch und nicht in Kelvin geliefert bekommen und nicht in json sondern im XML-Format:
http://api.openweathermap.org/data/2.5/weather?q=Zuerich&units=metric&mode=xml
HTTP POST Adapter testen
Aus dem gelieferten XML-File können wir mit awk die gewünschten Metriken herauswählen. Zum Posten der Daten über HTTP POST benötigen wir nur noch die Beschreibung des Objekts (neu oder vorhanden) und den Zeitstempel. Die Dokumentation unter der folgenden URL (lokal, vcops mit dem Namen oder IP des vC Ops-Servers ersetzen):
Der Vorgang, der in diesem Fall benutzt wird, ist unter dem Stichpunkt “AddGeneralMetricObservations” beschrieben.
Das Erbenis-Post-File sollte in etwa so aussehen:
Zuerich,HttpPost,Stadt,,SchoeneStadt,5, MeteoData|Temperature|Temperature in Celsius,3,NoValue,1369644692071,9.83, MeteoData|Humidity|Humidity in percent,3,NoValue,1369644692071,71, MeteoData|Air Pressure|Pressure in hPA,3,NoValue,1369644692071,1013,
Erklärung der ersten Zeile:
Objekt,Adapter,Objektart,,Objektbeschreibung,Minuten,
Dieses kann man über einen Browser mit einem REST AddOn testen (Authentifizierung nicht vergessen):
Bash-Skript zur Automatisierung
Um den Vorgang zu automatisieren, benutze ich curl um die Wetterdaten abzuholen, awk um die gewünschten Metriken auszulesen und wieder curl um das erzeugte Post-File über die REST API an vC Ops zu übergeben. Das komplette bash-Skript könnte zum Beispiel so aussehen:
#Script to integrate local weather metrics in vC Ops # Author: tbaublys@vmware.com /usr/bin/curl -s http://api.openweathermap.org/data/2.5/weatherq=Zuerich&units=metric&mode=xml">http://api.openweathermap.org/data/2.5/weather?q=Zuerich&units=metric&mode=xml" > wetter.xml TIMESTAMP=$( date +%s%N | cut -b1-13)TEMP=$(awk -v RS='"' '/temperature value=$/{getline;print} ' wetter.xml) HUMID=$(awk -v RS='"' '/humidity value=$/{getline;print} ' wetter.xml) PRESS=$(awk -v RS='"' '/pressure value=$/{getline;print} ' wetter.xml) echo "Zuerich,HttpPost,Stadt,,SchoeneStadt,5," > postfile; echo "MeteoData|Temperature|Temperature in Celsius,3,NoValue,$TIMESTAMP,$TEMP," >> postfile; echo "MeteoData|Humidity|Humidity in percent,3,NoValue,$TIMESTAMP,$HUMID," >> postfile; echo "MeteoData|Air Pressure|Pressure in hPA,3,NoValue,$TIMESTAMP,$PRESS," >> postfile; # Upload the postfile content using HTTP Post API /usr/bin/curl -k -v -H -X POST --data-binary "@postfile" -u admin:password https://vcops:443/HttpPostAdapter/OpenAPIServlet
Die Wetterdaten sollen alle 5 Minuten abgefragt und gepostet werden. Hierzu kann man auf der Konsole folgendes Kommando aufrufen:
while :; do sh /root/wetter/wetter; sleep 300; done
Der entsprechender Eintrag in der crontab:
*/5 * * * * root /root/wetter/wetter >/dev/null 2>&1
Das Ergebnis in der Custom-UI
In der Custom-UI des vC Ops taucht ein neues Objekt auf: Zuerich. Man kann dem Objekt (eigentlich dem Object-Kind) auch ein geeignetes Icon zuweisen. Hier ist das Ergebnis:
Mit wenigen Klicks kann ich nun in der Custom-UI ein “custom dashboard” für die Wetterdaten erstellen. Somit kann der arme Admin trotz seiner Fensterlosigkeit bei dem Wetter-Smalltalk mithalten:
Wetterdaten an ein existierendes Objekt dranhängen
Nun ist es zwar spannend sich das Wetter in verschiedenen selbsterstellten Dashboards der Custom UI anzeigen zu lassen, doch möchte man vielleicht diese Daten in der “Standard” vSphere-UI sehen und eventuell bei bestimmten Objekten anzeigen zu lassen (vCenter, Datacenter, Cluster oder ESX Hosts). Auch dies ist mit einem einfachen Griff möglich: man muss lediglich die ID des Objekts herausfinden und die POST Kopfzeile anpassen.
Um die korrekte Ressourcen Bezeichnung herauszufinden, müssen wir im REST-Client folgendes Kommando (nach erfolgter Authentifizierung) per POST eingeben:
action=lookupResource&resourceName=PCPt_MGMT
Die Antwort sieht in meinem Fall wie folgt aus:
resourceName=PCPt_MGMT&adapterKindKey=VMWARE&resourceKindKey=Datacenter&identifiers=VMEntityName::PCPt_MGMT::false$$VMEntityObjectID::datacenter-2$$VMEntityVCID::CFB22C5F-32AF-45D6-A670-5A456C8214E6
Die daraus resultierende Kopfzeile beim Posten der Daten sieht dann wie folgt aus:
PCPt_MGMT,VMWARE,Datacenter,VMEntityName::PCPt_MGMT::true$$VMEntityObjectID::datacenter-2$$VMEntityVCID::CFB22C5F-32AF-45D6-A670-5A456C8214E6,,5,,
Entscheidend ist es, die Ressourcenbezeichnungen “resourceName=” zu entfernen und ein “false” durch “true” zu ersetzen. Mit “true” wird kein neues Objekt erzeugt, sondern die Metriken auf das existierende drangehängt.
Dar Ergebnis ist dann in der vSphere-UI in dem Bereich “All Metrics” zusammen mit allen anderen Metriken des Objekts zu sehen:
Damit sind die Wetterdaten plötzlich Bestandteil der Metriken des Datacenters und können im Zusammenhang betrachtet werden.
Das vollständige Skript sieht in diesem Fall so aus:
#!/bin/bash#Script to integrate local weather metrics in vC Ops # Author: tbaublys@vmware.com /usr/bin/curl -s http://api.openweathermap.org/data/2.5/weather?q=Zuerich&units=metric&mode=xml > wetter.xml TIMESTAMP=$( date +%s%N | cut -b1-13) TEMP=$(awk -v RS='"' '/temperature value=$/{getline;print} ' wetter.xml) HUMID=$(awk -v RS='"' '/humidity value=$/{getline;print} ' wetter.xml) PRESS=$(awk -v RS='"' '/pressure value=$/{getline;print} ' wetter.xml) echo PCPt_MGMT,VMWARE,Datacenter,VMEntityName::PCPt_MGMT::true\$\$VMEntityObjectID::datacenter-2\$\$VMEntityVCID::CFB22C5F-32AF-45D6-A670-5A456C8214E6,,5,,"> postfile1; echo "MeteoData|Temperature|Temperature in Celsius,3,NoValue,$TIMESTAMP,$TEMP," >> postfile1; echo "MeteoData|Humidity|Humidity in percent,3,NoValue,$TIMESTAMP,$HUMID," >> postfile1; echo "MeteoData|Air Pressure|Pressure in hPA,3,NoValue,$TIMESTAMP,$PRESS," >> postfile1; /usr/bin/curl -k -v -H -X POST --data-binary "@postfile1" -u admin:password https://vcops:443/HttpPostAdapter/OpenAPIServlet
Ich hoffe dieses kleine Beispiel hilft, zu verstehen, wie externe Daten im einfachsten Fall an vC Ops angebunden werden können. Wenn es mit Wetter klappt, könnte man auch an Blutdruck, den Kaffeestand oder Mouse-Meter des Administrators denken…
P.S. So sieht unser Wetter-Dashboard in dem Münchner-Lab aus:
Super Artikel über die Einbindung externer Datenquellen – toll aufbereitet! 🙂
Pingback: Nag iOS, Nagios oder das Wetter ist mir nicht genug (Teil 1) | Wie geht das mit dem Cloud?
Und ich hielt das Ganze zuerst für eine lustige Überschrift. Genial! 😀
Pingback: Ich habe das Wetter geloggt! | Wie geht das mit dem Cloud?
Verbessertes Skript (vielen Dank an Frank Bess):
#!/usr/bin/env bash
#Script to integrate local weather metrics in vC Ops
# Author: tbaublys@vmware.com
#
# Fetch weather metrics and save it to wetter.xml
# Replace Zuerich with nearest city you prefer,
# test the url in a browser first!
#
# different city can be controlled by modifying the file name
# e.g. vcops-wetter-Muenchen -> Muenchen
# vcops-wetter-Frankfurt -> Frankfurt
#
# Change here for your environment
VCOPS=172.16.96.90
UID_PWD=admin:vmware1!
# No modifications beyond required
# ———————————–
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TMP=/tmp
CITY=${0##*etter-}
XML_F=${TMP}/${CITY// /}.xml
POST_F=${TMP}/${CITY// /}.post
/usr/bin/curl -s “http://api.openweathermap.org/data/2.5/weather?q=${CITY}&units=metric&mode=xml” > ${XML_F}
# Variables used to fill the postfile
TIMESTAMP=$(date +%s%N | cut -b1-13)
TEMP=$(awk -v RS='”‘ ‘/temperature value=$/{getline;print} ‘ ${XML_F})
HUMID=$(awk -v RS='”‘ ‘/humidity value=$/{getline;print} ‘ ${XML_F})
PRESS=$(awk -v RS='”‘ ‘/pressure value=$/{getline;print} ‘ ${XML_F})
CLOUD=$(awk -v RS='”‘ ‘/clouds value=$/{getline;print} ‘ ${XML_F})
SPEED=$(awk -v RS='”‘ ‘/speed value=$/{getline;print} ‘ ${XML_F})
DIRECT=$(awk -v RS='”‘ ‘/direction value=$/{getline;print} ‘ ${XML_F})
/bin/echo “${CITY// /},Wetter,Stadt,,Stadt,,5,,” > ${POST_F};
/bin/logger “wetter ausgefuehrt”
/bin/echo “MeteoData|Temperature|Temperature in Celsius,,,${TIMESTAMP},${TEMP},” >> ${POST_F};
/bin/echo “MeteoData|Humidity|Humidity in percent,,,${TIMESTAMP},${HUMID},” >> ${POST_F};
/bin/echo “MeteoData|Air Pressure|Pressure in hPA,,,${TIMESTAMP},${PRESS},” >> ${POST_F};
/bin/echo “MeteoData|Wind|Speed|Speed in m/s,,,${TIMESTAMP},${SPEED},” >> ${POST_F};
/bin/echo “MeteoData|Wind|Direction|Direction in degrees,,,${TIMESTAMP},${DIRECT},” >> ${POST_F};
/bin/echo “MeteoData|Clouds|Cloudiness,,,${TIMESTAMP},${CLOUD},” >> ${POST_F};
# Upload the postfile content using HTTP Post API
/usr/bin/curl -k -v -H -X POST –data-binary @”${POST_F}” -u ${UID_PWD} https://${VCOPS}:443/HttpPostAdapter/OpenAPIServlet
Pingback: Wetter Content Pack für Log Insight – vrealize.it – Cloudmanagement mit VMware vRealize Suite