Wer Erfahrung mit zabbix?

Hi

Habe noch im zabbix Forum und im hwluxx schon Threads diesbezüglich offen. Bin aber ein bisschen hibbelig gerade. Grossteil konnte ich mich mit gemini und Hilfe aus dem Luxx mal lösen soweit. Aber da hat sich auch keiner gemeldet, der sich mit zabbix auskennt. Und gemini die Tante führt mich gerne mal auf die falsche Fährte, heute Morgen sind mir mindestens 100 neue graue Haare gewachsen. Oder gibt es diesbezüglich noch bessere KIs als gemini? Weil die hat echt ganz schön viel Unsinn verzapft, und konnte mir nicht über 2-3 Posts hinaus folgen. Hatte stundenlang mit bash scripts rum gewerkelt bis ich mal heraus fand, dass man das direkt vom zabbix Server aus machen kann zum grossen Teil.

Ich habe alle Hosts mal eingepflegt, und dort den Zabbix Agenten eingerichtet. Ziel ist es, auf den Hosts sowohl UDP als auch TCP Ports zu überwachen, und diese in einer Tabelle alle zusammen anzeigen zu können. Ein Problem dabei ist, dass das mit dem Windows zabbix Agenten nicht geht für UDP. Konnte aber schon 90% abdecken der zu überwachenden Dienste (Items/Datenpunkte). Eigentlich fehlen mir nur noch zwei Server, welche auf Verfügbarkeit überprüft werden sollen. Bei einem habe ich aber noch eine alternative externe Lösung, die man allenfalls verwenden könnte.

Ziel ist es, alle meine Server auf der Website im Footer als Übersicht mit dem jeweiligen Onlinestatus anzuzeigen. Ist zabbix selbst down, soll überall "unknow" oder "offline" angezeigt werden. Die Website läuft zum grossen Teil extern, die ganzen Server dazu auf meinem Homeserver. Sollte sich auch vom Design her bisschen gut in meine Website einfügen.

Bevor ich da ins Detail gehe, wollte ich hier mal fragen ob da wer Ahnung von zabbix hat, oder sonst noch eine Idee dazu hat. Ist wieder mal komplizierter, als ich mir vorgestellt habe.

Gruss und danke
 
Setze Zabbix seit 18 Jahren in Umgebungen mit mehreren Tausend Hosts und rund 6000 Werten pro Sekunde ein. Ich würde mich mal trauen, zu sagen, ja Erfahrung ist vorhanden. ;)
 
Okay. Ja, danke.

Also mein erstes Problem wäre mal, dass ich bei zwei UDP Diensten in Windows VMs noch den Status abfragen müsste. Würde auch reichen, wenn man den Status des Programms/Prozess abfragen könnte. Nach dem unter dem Windows Agent "net.udp.listen" leider nicht geht, versuchte ich mir mit "net.udp.service" zu behelfen. Aber das funktioniert wohl auch nur mit ein paar vorgefertigten Diensten? Zu überwachen wären zwei Gameclients, ob die online, bzw am laufen sind. Zum Teil sind es auch nicht einzelne Ports, sondern ganze Ranges. Habe mir bis jetzt damit beholfen, halt nur einen einzelnen Port aus dem Range abzufragen.

Dann im nächsten Schritt möchte ich gerne eine Seite/Tabelle/Abfrage/Bericht/"was weiss ich" haben, wo all die Datenpunkte/Items aus allen Hosts zusammen angezeigt werden. Die haben alle den Wert 0 oder 1. In der Tabelle mit 2 Spalten soll dann angezeigt werden, welcher Dienst gerade online oder offline ist. Hatte auch gemini dazu befragt. Mein Interface ist auf Deutsch eingestellt, und komme da mit gemini nicht weiter. Und wenn ich bei Nutzer und System auf Englisch gehe, wird die Oberfläche trotzdem noch auf Deutsch angezeigt. Vielleicht wäre das besser, wenn ich trotzdem mal noch auf englisch gehe.

Im dritten Schritt müsste man dann die betreffende Tabelle aus dem zabbix mit einem speziellen Benutzer per ftp auf die externe Website hochladen, und dort sinnvoll integrieren. Das ist nämlich das Ziel der Sache. Habe zabbix nur aus dem Grund aufgesetzt. Ganz schön wäre es, wenn die Werte auch dynamisch angezeigt würden. Oder sonst halt mit einem Aktualisieren Button. Keine Ahnung, habe mir da noch nicht allzuviel Gedanken dazu gemacht.

Dann noch eine Frage: habe bei den Datenpunkten UDP und TCP überall ein Intervall von 3s angegeben. Ist das ein Problem für die Hosts, dass die dauernd zugespamt werden mit Abfragen? Hätte da schon gerne eine zeitnahe Abfrage. Standard ist ja 1m.
 
Bis auf den ersten Punkt sind das eher allgemeine Monitoring Fragen und haben nicht viel mit Zabbix zu tun. ;)

UDP Checks sind in der Tat etwas bescheiden, weil es Prinzipbedingt keinen Handshake gibt, um zu prüfen ob der Port offen ist und die meisten UDP Services antworten gar nicht, wenn man ihnen Datenmüll hinwirft. Wenn man es sauber monitoren will, müsste man also das Protokoll implementieren. DNS, NTP oder eben das der Gameserver.
Manche Gameserver erlauben recht stumpfe Stats Abfragen, die bekäme man mit einem Bashscript und netcat oder einer beliebigen anderen Sprache auch noch recht einfach implementiert. Muss man sich aber eben mit dem Protokoll des jeweiligen Gameservers auseinander setzen. Zabbix weiß nicht, was du monitoren willst, es stellt eine vielfältige Auswahl an Werkzeugen zur Verfügung um auf alle Möglichen Wege Daten zu sammeln.

Ich hab recht wenig Windows Systeme und noch weniger UDP Services auf Windows. Daher fand ichs grad recht witzig, dass es immer noch kein net.udp.listen für Windows gibt. Obwohls doch recht einfach wäre.
Kann man sich mit einem eigenen UserParameter und einem netstat Aufruf aber recht schnell selbst bauen. Mit etwas parsing Logik, könntest sogar alle UDP Ports in eine Low Level Discovery Regel laufen lassen. Ein Master Item, was die ganze Liste holt, JSON geht am einfachsten, notfalls geht aber auch alles andere. Die LLD kommt als Dependent Item an das Master Item dran und erstellt für jeden Port, der gewissen Kriterien entspricht (bspw. Prozessname xy.exe) dann ein Item und einen Trigger.

Wenns dir rein darum geht, die Prozesse zu überwachen, könntest aber auch einfach proc.num verwenden und die Prozessanzahl zählen. Setzt allerdings vorraus, dass die Prozesse so heißen, dass man sie noch von einander Unterscheiden kann.

Die Website ist einfach implementiert. Zabbix hat ein sehr gut dokumentierte JSON-REST-API. Lass deine Website die Daten einfach Live abfragen. Vergiss den Blödsinn mit FTP.

Monitoring Intervalle werden am Bedarf der Aktualität der Daten festgemacht und hängt am Ende auch vom verwendeten Check ab. Der Bedarf wird dadurch ermittelt, was mit Eintreffen neuer Werte (oder Alarme) an Konsequenzen ausgelöst werden soll. Wenn ein Dienst ausfällt, was passiert dann? Wann reagiert ein Mensch darauf? Wenn der Mensch üblicherweise sowieso min. 15 Minuten braucht, um zu reagieren, bringt es absolut nichts, es sekündlich zu monitoren. Davon wird der Mensch auch nicht schneller.
Ein proc.num ist deutlich ressourcenschonender und DEUTLICH schneller in der Ausführung, als wenn du da per UserParameter eine PowerShell starten musst, um dir die Socketliste, samt Prozessnamen zu holen und in JSON zu konvertieren.
Oder als sonst wie gearteten Text an Zabbix zu übergeben und die Parsing-Logik im Zabbix Server (entweder per Built-In Features (bspw CSV to JSON) oder via Javascript zu machen.

Die Erfahrung zeigt aber eher, nicht alles was technisch machbar ist, ist auch sinnvoll. Einen Gameserver im 3s Abstand zu monitoren ... hola ... So wie du schreibst, klingt es eher nach einem Miniatur Hobby Projekt. Mit Verlaub, aber kein Mensch interessiert sich für einen 3s genauen Wert über die Verfügbarkeit eines Gameservers.
Selbst die meisten Loadbalancer für Webserver machen ihre Healthchecks in 10s oder 30s Intervallen. Und da liegt für gewöhnlich ein größerer wirtschaftlicher Druck dahinter, als bei dir.

Ich persönlich halte 3s für massiv übertrieben. Ob technisch realisierbar hängt am Ende davon ab, was du für Ressourcen du dem Zabbix Server und dem Gameserver zur Verfügung stellst, welche Art von Check es am Ende wird und wie viele solcher Checks es geben wird.
 
Hi

Danke für Deinen ausführlichen Post. Finde das gar nicht witzig, dass die bei zabbix net.udp.listen für Windows nicht implementiert haben. Weil dann könnte ich die beiden verbleibenden Dienste auch noch über zabbix überwachen (FSX FSopen, aber den kann man auch anders fischen und JoinFS). Mit Bash Scripts habe ich den ganzen Morgen rum gekämpft, allerdings für die drei Phoenix Dienste auf Linux. Mit mässigem bis ernüchterndem Erfolg. Wobei war eher niederschmetternd. Bis ich dann mal raus gefunden habe, dass man das direkt von zabbix aus machen kann.

Da gibt es wohl leider keine Dokumentation für die Schnittstellen der beiden Anwendungen. Eine davon ist FSX bei FSopen. Da siehst Du auf dem Web wenn Du zu Server runter scrollst aber einen online/offline Button welcher von extern kommt. Denke den könnte man im Notfall irgendwie in der Website abgreifen. Der andere Dienst welcher mir fehlt ist JoinFS. Das wäre ein einziger UDP Port. Der Entwickler hat sich aber auch in den Ruhestand versetzt, und sein Forum geschlossen.

Um die Anwendung geht es:


Auf der selben VM läuft auch das navmap.ch tool. Aber das konnte ich mit einer tcp Abfrage lösen. JoinFS und navmap.ch könnte man wohl auf auch noch auf Linux portieren, steht auch schon lange auf dem Wunschzettel. Wie so viele andere Baustellen.

Auf der externen Website sollte das dann so aussehen:



Screenshot 2024-12-06 015457.png


Das hätte ich gerne erstmal so in zabbix gesehen.



Das sind die Hosts, welche beteiligt sind:

Screenshot 2024-12-05 090133.png



Edit: und beim mittleren Teil von Deinem Post habe ich leider nicht mal die Hälfte verstanden. Mehr dazu später, oder irgendwann.

Ja sicher ist das ein "miniatur Hobby Projekt", trotzdem möchte ich den Status der Server möglichst in Realtime ausgeben. Da wird auch niemand benachrichtigt, wenn sich da mal was schlafen legt. Aber wenn das dann mal läuft, kann man den Intervall auch hoch schrauben. Hatte es zu Testzwecken mal auf 3s gesetzt. Ist mir schon auf den Keks gegangen, dass man bei den Hosts ellenlang wartet, bis da mal der korrekte Status angezeigt wird. Bin manchmal etwas ungeduldig, mag sein.
 
Last edited:
Ich nutze Zabbix zwar nur für meine privaten Systeme, denke aber, ein bischen kenne ich mich auch aus ;-)
@Firewire2002 hat ja oben schon beschrieben, dass UDP systembedingt und eingeschränkt überwachbar ist, da es sich um ein statuslosese Protokol handelt, d.h. bei UDP gibt es keine direkte Antwort, solange der empfangende Dienst hier nicht was entsprechendes zurückmeldet (bei TCP ist vorgesehen, dass der Empfang bestätigt wird). Ich überwache nicht die offenen Ports von Server-Diensten, sondern schaue stattdessen, ob der jeweilige Prozess läüft (mit proc.num). Für meine Zwecke reicht das
 
Kommt halt immer drauf an, wie wichtig einem ein Service ist.
In einer perfekten Welt baut man ausschließlich Monitorings die Protokoll-spezifisch eine konkrete Anfrage schicken und den Inhalt der Antwort auswerten.

Bei einem Webserver mit einem Online Shop würde man also beispielsweise den Request mit der Suche nach einem Produkt auslösen und schauen ob das korrekte Produkt zurückgeliefert wird. Wenn man nicht nur die Verfügbarkeit des Webshops an sich überwachen möchte, sondern direkt den gesamten Geschäftsprozess, lässt man das Monitoring auch direkt noch eine Bestellung abschicken und prüft ob die Ware geliefert wird. ;)
(für die stillen Mitleser: da gehört natürlich bisschen mehr dazu, ja nicht einfach so umsetzen. Das wird teuer. :D)

In der Realität sind es aber oft dann halt doch nur tcp Handshakes die geprüft werden oder die Existenz von Prozessen. Schlicht weil es einfacher, schneller und mit weniger Kosten verbunden ist.
Nur weil ein Webserver erreichbar ist, heißt das aber eben nicht, dass er auch den korrekten Content liefert.

Das lässt sich natürlich ebenso auf Gameserver anwenden.

@MarroniJohny ich habe bisher noch keine konkrete Frage zu Zabbix herauslesen können. Strukturell kann Zabbix alles das, was du brauchst, aber Zabbix ist kein 1-Click Monitoring-Tool für Gameserver. Zabbix bringt viele fertige Templates mit, die mal mehr und mal weniger gut zu gebrauchen sind. Aber du hast einen Software-Stack der nicht ganz zur Zielgruppe der Zabbix-Nutzer passt. Das ist nicht schlimm, erfordert dann aber eben ein bisschen Arbeit.

Ich beantworte gern Zabbix Fragen. Aber ich habe keine Erfahrung mit deinem Software-Stack und der ist leider so speziell, dass ich da weder Zeit noch Interesse habe, mich da einzuarbeiten. :D
 
Hi

Komme da leider nicht weiter. Auch bei proc.num kommt "not supportet". In einem anderen Forum meinte noch einer, vielleicht hilft mir net.udp.socket.count weiter. Aber da braucht es wohl den zabbix 2 agent dazu. Der lässt sich aber leider nicht installieren, da kommt immer eine unbehandelte Ausnahme bei der Installation.

Wenn ich ein neues Diagramm erstelle, und da nur mal überhaupt den betreffenden Host überwachen will, was brauche ich da für einen Datenpunkt? Habe es mit Stat of Service "Power" versucht. Da wird dauernd der Integer Wert 0 ausgegeben. Ist die Maschine aus, wird gar nichts ausgegeben. Kann man da nicht irgendwie bei Power aus eine 0 ausgeben, ist die VM oben eine 1? Oder wie heisst der korrekte Datenpunkt für Maschine ein?
 
Mit was für Parametern hast du proc.num denn aufgerufen? proc.num alleine kann nicht funktionieren. Die Zabbix Dokumentation hast du aber schon gelesen? https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/zabbix_agent#proc.num

net.udp.socket.count gibts auch im "normalen" Zabbix Agent. Was mich wieder vermuten lässt, dass du die Dokumentation nicht liest.
Ebenso sind beide Agent Varianten unter Windows recht problemlos installierbar.
Wenn es bei dir nicht funktioniert, musst du uns schon im Detail verraten was du genau treibst. Oder sollen wir erraten, was du falschen machen könntest? ;)

Zabbix hat keine Ahnung was "Machine ein" bedeuten soll. Zabbix kennt im wesentlichen Items und Trigger + paar Visualisierungsmöglichkeiten wie Maps, Dashboards, Graphen, Service SLA, Reports, usw.
Welche Metrik ein Item darstellt, liegt ganz bei dir. Das kann der Status einer VM sein. Das könnte aber auch der Öffnungswinkel deines Garagentors oder die Anzahl der Latten am Zaun sein.
Selbst mit dem Server-Hintergrund kann dir kein Admin dieser Welt sagen, wie du "Maschine ein" definierst. Die einen nutzen ICMP Ping, die anderen schauen per API am Hypervisor ob die VM gestartet ist. Es gibt zig verschiedene Wege.

Bisher hast du uns nicht mal verraten, welche Templates und/oder Items an deinem Host überhaupt dran hängen.

Ich würde übrigens empfehlen Zabbix auf Englisch zu verwenden. Die deutsche Übersetzung mit der englischen Doku zusammen zu bekommen ist schon schwer genug. Allerdings versteht auch keiner wovon du sprichst, weil die wenigsten wissen, welche Begriffe Zabbix in der deutschen Übersetzung verwendet.
 
Ja sicher habe ich die Syntax der Anleitung vom Agent gelesen. Glaube habe da alles richtig gemacht:

Screenshot 2024-12-08 221409.png




Screenshot 2024-12-08 221515.png



Screenshot 2024-12-08 222545.png



Für die Linux Dienste nutzte ich überall net.udp.listen und net.tcp.listen, die funktionieren ja alle. Nun habe ich noch zwei Windows Anwendungen mit UDP, die ich überwachen möchte. Da net.udp.listen unter Windows nicht geht, würde mir proc.num reichen. Aber das wird ja offensichtlich auch nicht unterstützt. Oder ich mache was falsch.
 
Last edited:
Ahja, genau. Danke. Wer lesen kann, ist halt klar im Vorteil. Jetzt habe ich mal alle Server eingepflegt, funktionieren alle.

Dann mache ich mich mal an die Website dazu.
 
Hmm, eins hatte ich dabei gar nicht bedacht. Ist der Server inkl. zabbix down, wird ja der Status ewig abgefragt, und dann kommt ein Fehler, Server nicht erreichbar.

Ziel war es eigentlich, ist der Server nicht erreichbar kommt in der Statusabfrage "unknow", ist der Server erreichbar aber gewisse Dienste darauf nicht kommt "offline", ist alles ok steht "online" bei den betreffenden Servern. Aber das ist so wohl nicht umsetzbar ohne dedizierte Hardware für zabbix?

Kann ich das allenfalls irgendwie mit meiner baremetal OPNsense lösen?
 
Sofern die externe Webseite dynamische Webseiten z.B. mit PHP ermöglicht, könntest du natürlich über PHP einmal mit einem entsprechen kurzen Timeout abfragen, ob der Zabbix-Server erreichbar ist und falls nicht einfach alle Stati auf "unknown" setzen und nicht mehr separat vom Zabbix-Server abrufen.
 
Sofern die externe Webseite dynamische Webseiten z.B. mit PHP ermöglicht, könntest du natürlich über PHP einmal mit einem entsprechen kurzen Timeout abfragen, ob der Zabbix-Server erreichbar ist und falls nicht einfach alle Stati auf "unknown" setzen

Ach so. Wusste gar nicht, dass das geht mit php. Sehr gut schonmal! Dachte schon, wegen dem Problem muss ich meinen Plan verwerfen.

Ja, die Websites haben die .php Endung, aber bislang ist das eher html. Ursprünglich war das mal ein html template. Einzig den Header haben wir mit php gebastelt, bzw. eingebunden, um das ganze responsive zu optimieren. Da hat mir aber ein netter User aus einem anderen Forum geholfen, das war dann schon zu hoch für mich mit dem ganzen CSS.

Wie muss ich die betreffende Website genau umsetzen? Habe wieder Gemini befragt. Die meinte, da musst Du phyton und flask installieren. Brauch ich dazu was spezielles auf dem Webserver? Mit phyton hatte ich bislang noch gar nie was zu tun, und flask höre ich zum ersten mal. Aber ich glaube sie meinte das als Entwicklungsumgebung. Da nutze ich bislang vor allem einen simplen Editor, bzw. mit VS Code habe ich auch schon erste Schritte gemacht. Früher habe ich immer Dreamwaver genutzt für Web. Weil das ist ein normales Reseller Plesk, da kann ich nicht mal Plesk Plugins installieren, geschweige denn über die Konsole irgendwelche Server Erweiterungen.

Reicht da nicht php und JS, oder so? JSON hatte ich schon mal raus gelesen. Das ist aber nicht direkt eine Programmiersprache, oder?

Kann mir da jemand kurz erklären, wo ich sinnigerweise ansetzen sollte? Damit ich weiss, nach was ich suchen muss. Bisschen prozedural scripten kann ich schon. Mit OO habe ich leider nicht so wirklich Erfolge erzielen können, das ist immer noch ein Buch mit 7 Siegeln. Hatte mal eine Phase, wo ich mich intensiv mit coden auseinandergesetzt habe, mit C++, C#, Java und so. Das ist aber ewig her, und ich war auch nicht besonders erfolgreich darin. Aber ist schon das ein- oder andere hängen geblieben.

Habe auch mal in die zabbix API Anleitung rein geschaut. Aber ist mir halt vorne und hinten noch nicht klar, wie das ablaufen soll. Muss ich da einen Port weiterleiten zu zabbix? Und wie läuft das mit den Zertifikaten? Muss ich die dauernd erneuern? Oder kann man dazu simples http nutzen? Auf dem Homeserver Server läuft auch ein Plesk, das könnte man verwenden wegen dem SSL im Notfall. Aber lieber wäre mir http, dann muss ich mich um nichts kümmern. Und mit Standard Ports wie 80, 443 für das zabbix API ist auch nichts drin, das müsste man auf was anderes umbiegen.

Leider alles bisschen komplizierter wieder als gedacht. Aber die Aufgabenstellung ist ja auf den ersten Blick nicht soo ambitioniert, sollte ich hin kriegen mit ein bisschen Hilfe. Und falls da jemand unterstützen würde für die A-Z Lösung, da würde ich vielleicht auch ein paar Münzen einwerfen. Denke da so an einen höheren zweistelligen Betrag, mehr kann ich leider nicht auslegen. Bin dauernd abgebrannt, Weihnachten sieht so schon mau aus. Hoffe es reicht für Billigbier.

Alles was ich bräuchte ist das da, am liebsten in einem popup:



Screenshot 2024-12-06 015457.png


Zabbix ist bis auf den API Token soweit eingerichtet.
 
Zabbix stellt selbst keine abstrahierte PHP Klasse für deren API bereit. Es gibt aber 3rd Party Libs dafür:
Von der API brauchst dann entweder
oder

Ich würde empfehlen einen Trigger in Zabbix zu definieren und dessen Status abzufragen. Macht das ganze etwas flexibler, weil du über die Trigger-Expression problemlos auch mehrere Items prüfen kannst oder das Item einfach austauschen könntest, ohne die Website anfassen zu müssen.
Gänge allerdings mit Hilfe der Tags auch direkt mit den Items. Wie immer in der IT, viele Wege führen nach Rom.
In deinem Fall wäre die API trigger.get dem problem.get vorzuziehen, weil du mit trigger.get auch inaktive Trigger zurückbekommen kannst. problem.get würde dir nur etwas liefern, wenn der Gameserver offline wäre. Ist damit für die Website einfacher, weil man an der Stelle weniger Code zum interpretieren der Monitoringdaten braucht und die Logik dort lässt, wo sie hingehört: im Monitoring Tool. :)

Falls du auf den Trigger verzichten willst und nur mit dem Item arbeiten möchtest, wäre history.get die passende API Funktion. Es gibt allerdings keine Funktion für den letzten Wert. D.h. du musst bei history.get eine Zeitspanne angeben, in der du den letzten Wert erwartest. Ist sie zu groß, bekmmst mehrere Werte und du musst den aktuellste selbst aus der Liste raussuchen; ist sie zu klein bekommst unter Umständen gar keinen Wert und das PHP Script müsste dann einen Fallback auf "unknown" machen. Gleiches, wenn er die API gar nicht erreicht. Aber das hattet ihr ja oben schon.

Um aus Website Sicht das Item oder den Trigger zu finden, würd ich es mit Tags versehen und nicht auf Name oder Item/Trigger ID prüfen. Dann ist man schön flexibel und kann einfach alles anzeigen, was man mit dem Website Tag in Zabbix findet. Und im Zabbix hängst an beliebiges einfach das Tag dran und schwupps tauchts auf der Website auf.
 
Back
Top