Livestatus AND/OR Operatoren... funktionsweise? 1.5.0p24.cee

Hallo zusammen,

ich habe eine eingehende Fragen bezüglich der Livestatus-Queries. Ich habe mir bereits die
Dokus auf der Seite CMK_Livestatus durchgelesen, allerdings sind mir die Beispiele zu einfach, um mir bei meiner etwas erweiterten Query helfen zu können.

Hier einmal die “zensierte” Query:

GET services
Columns: host_name host_address check_command host_last_check host_contact_groups plugin_output host_services_with_fullstate
Filter: host_name = HOSTNAME
Filter: check_command = check_mk_active-cmk_inv
Filter: check_command = check-mk
And: 2
Filter: host_check_command != check-mk-host-ping-cluster
Or: 2
Separators: 10 59 44 124

Mein Wunsch war es hier, auf einen bestimmten Host zu suchen und seinen “check-mk” Service auszulesen. Sofern keiner existiert, soll er den “cmk_inv” nehmen. Der Teil mit “cmk_inv” scheint super zu klappen, allerdings funktioniert diese Query nicht bei ‘vollständigen’ Hosts, also mit Check_MK Service. Hier gibt er mir immer alle Service aus.

Habe schon einiges versucht und einige dreher rein gemacht, allerdings verstehe ich die Funktionsweise von den “And” und “Or” Operatoren nicht vollständig, da ich das Gefühl habe, sie funktionieren anders als wie beschrieben. Zudem ist der Gedankensprung beim “And: 2 ->line Or: 2” schwer nachzuvollziehen, also was er hier jetzt mit “And” verknüpft und was genau das “Or” ist.

Hoffe ich habe mich verständlich ausgedrückt und wer kann mir helfen. Sofern möglich, möchte ich eine zweite Query vermeiden.

Danke vorab.

Meines Wissens ist so ein Query nicht in Livestatus formulierbar. Das musst Du in der Applikation handeln.

Die UND-Verknüpfung von Filter: check_command = check_mk_active-cmk_inv und Filter: check_command = check-mk wird immer kein Ergebnis liefern, da ja beides gleichzeitig nicht sein kann.

Und genau das ist, was ich mit “Ich verstehe nicht genau, wie die AND/OR funktionieren”, weil es eben DOCH ein Ergebnis bringt. Ich erhalte ja das “cmk_inv”, sofern kein “check-mk” Service für den Host existiert, andersrum allerdings erhalte ich alle Service sofern der “check-mk” Service da ist.

Es schaut also eher danach aus, dass der Filter mit dem “check-mk” nicht nach ganzen Namen sucht, sondern alles wo “check-mk” enthalten ist. Mir fällt quasi also ein regex “$” der den Such-String begrenzt. Bisher konnte ich leider keinen Ausmachen. Der Rest scheint sowas ja zu klappen irgendwie…

PS: Hier funktionert die Kombo aus AND und OR ähnlich wie im Beispiel von Check_MK - Filter kombinieren, d.h. ich habe eine OR-Verknüpfung auf die Check-Commands und mit dem Ergebnis davon eine UND-Verknüpfung mit der “Sei kein Cluster”-Bedingung.

Nein, Du hast oben eine UND-Verknüpfung der beiden check_command-Filter und dieses Ergebnis dann ODER-verknüpft mit dem host_check_command-Filter. Das ist eine Postfix-Notation.

1 Like

Dann schreib doch einfach ein $ ans Ende des Filterstrings.

Noch eine kleine Ergänzung.

Filter: check_command = check-mk

Sucht genau nur nach den “Check_MK” Services das “=” sagt halt wirklich gleich, für ein like muss “~” verwendet werden.
Ein Filter: check_command = check_mk_active-mk_inv findet nur dann was wenn dieser Check ohne Parameter verwendet wird. Normal stehen da noch einige Parameter dahinter in beliebiger Reihenfolge. Deshalb dort Filter: check_command ~ check_mk_active-mk_inv verwenden.

In der ursprünglichen Query steht am Ende ein host_services_with_fullstate damit bekommt man doch für jeden Host nochmal alle Services ausgegeben ist das so gewollt?

Das Ergebnis ist aber am Ende wie @r.sander schon gesagt hat nie ein nur einzelnes Ergebnis pro Host. Sollten beide Services vorhanden sein gibt es auch pro Host zwei Ausgaben ansonsten halt nur der eine Service welcher vorhanden ist.

1 Like

Das war noch aus dem Debugging drin. Das habe ich nun entfernt, da es nicht benötigt wird. Danke fürs sehen :wink:

Und es ist ja mein Wunsch, mindestens 1 Ergebnis zu haben, damit ich jeden Host “erwische” und sofern möglich, kontrollieren kann. Habe die Query auf jedenfall jetzt zum laufen gebracht.

Danke an @r.sander und @andreas-doehler. Ich finde, Check_MK sollte hier dringend Ihre Doku nochmal überarbeiten, da meine Query an Ihrem Beispiel angelehnt war. Es ist manchmal echt schwer verständlich.

Edit: Habe auch gerade einen weiteren Fehler herausgefunden meinerseits.
Das Umschließen der Suchwörter mit Anführungszeichen (") funktioniert lokal ohne Problem, sollte
die Abfrage aber von einem Remote-Host ausgeführt werden, findet er diese Suchwörter nicht mehr, da er irgendwie Probleme mit den Anführungszeichen hat. Gleiches natürlich mit Apostrophs(').

1 Like

Ja das gehört immer zum gesuchten mit dazu. Es gibt in den Queries nix was “Escaped” werden kann oder muss.

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.