English English preferred? This way, please.

Heute habe ich einen coolen neuen Trick gelernt, in dem ich das Item Preprocessing benutzen kann das Zabbix seit der Version 3.4 anbietet. Dies ist kein Zabbix-Blog, aber ich betrachte das als so nützlich — und nicht gerade intuitiv — dass ich das mal eben aufschreiben möchte.

Für alle die es nicht kennen: Zabbix ist ein quelloffenes Monitoring System, der Hersteller nennt es nicht ganz zu unrecht „Enterprise Class“. Ich nutze das nicht nur bei der Arbeit sondern auch zu Hause — nicht nur um das Fleisch in meinem Smoker zu monitoren. :-)

Meiner Meinung nach ist Zabbix wirklich stark bei allem was in Zahlen ausgedrückt werden kann. Es kann auch mit textuellen Informationen umgehen, aber nachdem ich damit ein paar kleinere Schwierigkeiten hatte versuche ich das nach Möglichkeit zu vermeiden. Zustände können in Zabbix auch numerisch dargestellt und als Ganzzahl gespeichert werden, mit dem Value Mapping kann man trotzdem gut lesbare Ausgaben erzeugen.

Heute bin ich an ein Problem gekommen das ich mit meinen üblichen Methoden erst nicht umsetzen konnte. Ein Webservice gibt mir den Status einer Applikation, die ist entweder RUNNING, STOPPING oder STOPPED. Es ist nicht schwer das in einem String-Item zu speichern, und einen Trigger anzulegen der reagiert wenn die Applikation STOPPED ist. In diesem speziellen Fall sollte ich aber einen Trigger bauen der meldet wenn der Dienst länger als eine gewisse Zeit im Status STOPPING ist, daran ist zu erkennen dass es ein Problem beim regulären Anhalten der Applikation gibt. Das war nicht trivial, da die Triggerfunktion str("STOPPING",15m) auch schon zuschlägt wenn mindestens einer der Werte in den letzten 15 Minuten „STOPPING“ war.

Item Preprocessing to the rescue!

Drei Schritte

Drei Schritte

Mit Version 3.4 hat ein Feature namens Item Preprocessing in Zabbix Einzug gehalten. Damit kann ein gemessener Wert auf verschiedene Arten weiterbehandelt werden bevor er gesichert wird. Eine der Methoden ist, durch reguläre Ausdrücke eine Art „Suchen und Ersetzen“ vorzunehmen.

Wie sich rausstellt brauchte ich dazu einen halbwegs komplexen regulären Ausdruck, aber am Ende konnte ich die Zustände des Webservices in einfache Ganzzahlen umwandeln. Bei einer Websuche habe ich etwas über „conditional replacement“ gefunden, und mit diesem großartigen Tester für reguläre Ausdrücke konnte ich diese Schönheit bauen:

Damit kann ich den String den ich mittels JSON Path aus der Ausgabe des Webservices ziehe in zwei weiteren Schritten umwandeln:

  • Erst hänge ich eine Art „Wörterbuch“ an meinen Wert: ich ersetze den kompletten Wert (.*) durch sich selbst, gefolgt von den Ersetzungswerten: \1:STOPPED=0:STOPPING=1:RUNNING=2.
  • Dann ersetze ich den regulären Ausdruck (STOPPED|STOPPING|RUNNING)(?=.*:\1=(\d)) durch den Wert der zweiten Capturing Group \2.

Auf die Weise kann ich mein Item als vorzeichenlose Ganzzahl konfigurieren, da hier nur noch die Zahlen 0, 1 oder 2 abgelegt werden müssen. Und ich kann die übliche Trigger-Funktions-Magie anwenden um zu melden wenn der Wert länger als eine gewisse Zeit bei 1 verbleibt. Ein weiterer Bonus: ich kann im Graphen des Items sehen wann der Webservice nicht im Zustand RUNNING gewesen ist, und wie lange das angehalten hat.

Vorschläge?

Ich bin ziemlich angetan davon, Werte auf diese Weise für die Weiterverarbeitung vorzubereiten. Aber ich bin auch an Meinungen interessiert: gibt es bessere Wege mit diesem Problem umzugehen? Irgendwas offensichtliches das ich übersehen habe?

Der gVim-Spezialist für reguläre Ausdrücke der mir hier schon einiges hinterlassen hat hatte ein Problem. Seinen Kommentar vom 09.04. hat mein Blog aus irgendwelchen Gründen nicht auf anhieb gefressen. Der Anti-Spam-Algorithmus hat ihm freundlich aber bestimmt (‚… this might be an error, in which case all apologies.‚) mitgeteilt dass seine Nachricht erst dem Admin vorgelegt wird, der sie dann gegebenenfalls freigeben kann. Er hat das nicht verstanden und seinen Kommentar nochmal in sein (!) Forum geposted. Ich habe dann eine Mail bekommen, wohl in der Erwartung dass ich mich da anmelde (!!) und ihm beibringe wie man reguläre Ausdrücke benutzt.

Das habe ich nicht gemacht, sondern — wie ihm von WordPress ja schon in Aussicht gestellt wurde — seinen Kommentar hier freigegeben und beantwortet. Noch am gleichen Tag. Er hat nichts weiter dazu geschrieben. Dachte ich.

Heute habe ich jemandem die Geschichte erzählt, und ich habe ihm dabei auch den Beitrag im Forum gezeigt. Ehrlich gesagt war ich auch interessiert zu sehen ob da jemand geantwortet hat, also habe ich gescrollt. Und was lese ich?

Nachtrag: Manche Foren- oder Blogadmins wollen sich mit ihrem Webauftritt nur irgendwie profilieren. Wenn dann irgendwann mal jemand was mehr oder weniger Herausragendes schreibt, befürchtet diese Person dann, dass diese selbst dadurch irgendwie dadurch in den Schatten gestellt werden könnte.

Es wird dann krampfhaft versucht, dem zumindest scheinbar irgendwie was entgegenzusetzen, auch wenn es oftmals nur der aller größte mit entsprechender überheblicher Polemik versehene Schwachsinn ist, der oftmals im ersten Moment tatsächlich irgendwie sogar logisch klingt. Der unliebsame Schreiber wird dann sofort gesperrt, damit er diesen absoluten Unsinn nichts entgegen setzen kann, und nicht noch mehr „Schaden“ anrichten kann. Um es kurz zu machen:

Am besten die Finger weg von Blog.schatenseite.de!

Dem kann ich mich einfach nur anschliessen. Finger weg von Blog.schatenseite.de! :-D

In den letzten Tagen hat jemand zwei ziemlich umfangreiche Kommentare an einen Beitrag gehängt in dem ich mich letzten Oktober über den Vim gewundert habe. Vielleicht hat jemand mehr Zeit sich das anzusehen, deshalb antworte ich ihm mal nicht im Kommentar sondern in einem separaten Artikel.

Hallo, Peter…

Keine Ahnung warum Du mir das hier rein schreibst, ich bin kein vim-Entwickler. Ich habe im Moment auch nicht die Zeit allem nachzugehen was Du schriebst, aber nach Deinem letzten Absatz („…eines der am liederlichsten programmierten Programme… Software-Verhau… eines der am blödesten zu bedienendsten Programme…“) habe ich doch mal einen Blick auf einige Deiner Beispiele geworfen.

Meine Testdatei:

Bahnfahrer
bahnfahrer
Autofahrer
Autobusfahrer
Autobahnfahrer

Zunächst: Eine Suche mit /Auto(bahn)[0}fahrer ergibt tatsächlich nichts. Wie auch? Das ist syntaktischer Humbug. Nehmen wir an dass Du /Auto(bahn){0}fahrer meintest. Das findet bei mir (vim 7.1.267) genau den Autofahrer, und das ist meiner Meinung nach absolut richtig. Ich suche nach etwas das mit ‚Auto‘ anfängt, danach soll null mal ‚bahn‘ stehen, danach ‚fahrer‘. Das kommt genau ein mal vor. Autobusfahrer wird natürlich nicht gefunden weil in dem Ausdruck kein ‚bus‘ erlaubt wurde.

Nächster Versuch: Ich suche nach /(Bahn){0}fahrer. Nein, ich suche lieber nach /(Bahn){0}fahrer. Damit kriege ich fünf Fundstellen, nämlich jeweils das ‚fahrer‘ am Ende der Zeile. Klar, ich suche ja nicht nach kompletten Worten, sondern nur nach Stellen an denen ‚fahrer‘ steht. Meinetwegen nach Stellen an denen null mal ‚Bahn‘ steht, gefolgt von ‚fahrer‘. Ob vor dem Nicht-Auftreten von ‚Bahn‘ nicht noch ein ‚Bahn‘ stehen darf ist nicht gesagt. Ich hoffe ich konnte mich klar ausdrücken?

Von weiteren Versuchen sehe ich einfach mal ab, vielleicht hat ja jemand anderes Lust sich da durchzuquälen. Du solltest Dich vielleicht tatsächlich einfach mit Deinem Windows 98 SE und dem mitgelieferten Notepad zufrieden geben. Dazu hätte ich dann auch nochmal einen lustigen Beitrag für Dich…

Noch ein Tip am Rande: wenn Du mit einer Software rumspielst von der Du keine Ahnung hast, die aber gerade von Profis sehr gerne benutzt wird, und Du stößt dabei auf Ungereimtheiten die Du Dir nicht erklären kannst… Erst RTFM beherzigen, dann nochmal probieren. Dann im Netz nach Lösungen suchen, oder nach Leuten die die gleichen Probleme haben. Wenn das nix bringt in entsprechende Foren und Mail-Archive sehen. Ist auch das ohne Erfolg, frage an geeigneter Stelle nach. Wenn Du mit dem Problem absolut nicht leben kannst, und sich rausstellt dass das wirklich ein Bug ist der in den aktuellen Versionen noch nicht behoben ist… DANN reichst Du einen Bug-Report bei dem Projekt ein. Und zwar wirklich bei dem Projekt, nicht als Kommentar auf einen Blog-Eintrag von vor einem halben Jahr…

Ach, noch was: Danke für den Link auf Deine Homepage. Sehr aufschlussreich. :-D