Ist das Wetter normal?

Von | 2. Juni 2013

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

vC Ops Adapters

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

  1. vC Ops in der Advanced oder Enterprise Version
  2. Zugang zu einem Linux System (z.B. vC Ops UI VM)
  3. Browser mit REST AddOn (Firefox oder Chrome)
  4. 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):

https://vcops/HttpPostAdapter

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

rest-api

 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:

zuerich

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:

Screen Shot 2013-06-02 at 18.46.36

 

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:

Screen Shot 2013-06-02 at 19.13.52

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:

tb_sc_2014-03-30_12-16-36_pm

print

6 Gedanken zu „Ist das Wetter normal?

  1. Christian

    Super Artikel über die Einbindung externer Datenquellen – toll aufbereitet! 🙂

    Antworten
  2. Pingback: Nag iOS, Nagios oder das Wetter ist mir nicht genug (Teil 1) | Wie geht das mit dem Cloud?

  3. Pingback: Ich habe das Wetter geloggt! | Wie geht das mit dem Cloud?

  4. Tomas Baublys Beitragsautor

    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

    Antworten
  5. Pingback: Wetter Content Pack für Log Insight – vrealize.it – Cloudmanagement mit VMware vRealize Suite

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.