Request for Comments: NagVis Worldmap

  • Hallo Community,


    ich habe in den letzten Wochen an einem neuen Feature im NagVis gewerkelt, der Worldmap. Nachdem NagVis bisher ja schon eine art statische geografische Karten, die Geomaps, unterstützt hat, war es nun lange überfällig eine zeitgemäßere Form der geografischen Maps zu implementieren. Die Worldmaps basieren nun auf Open Street Map und können, wie man das halt so von OSM basierten Anwenungen kennt, interaktiv genutzt werden.


    Im Gegensatz zu den klassischen NagVis Maps, auf denen man bei jeder neuen Map von vorne anfängt und alle Objekte neu positionieren muss bzw. kann, habe ich mir bei den Worldmaps einen anderen Ansatz ausgedacht. Die Annahme ist, da es sich hier ja um eine standortbasierte Darstellung handelt, dass ein Objekt immer genau an einen Punkt gehört - und zwar Mapübergreifend.


    Man kann sich mehrere Worldmaps anlegen, die sind aber im Grunde nur ein Bookmark auf den jeweiligen Kartenausschnitt. Auf den Maps kann man alle existierenden NagVis-Objekte hinzufügen, wie man es auch von den klassischen Maps gewohnt ist, sprich Icons, Linien usw.


    Da es für manche Objekte keinen Sinn macht sie in jeder Zoomstufe anzuzeigen, kann man pro Objekt festlegen in welchen Stufen diese angezeigt werden sollen.


    Mich würde nun interessieren, was ihr von diesem Ansatz und dem Feature insgesamt haltet. Fehlt euch noch etwas? Seht ihr Probleme? Habt ihr interessante Ideen dazu?


    Wer es ausprobieren möchte, kann sich den aktuellen Git-Build vom Master-Branch (http://nagvis.org/share/nagvis-1.9-nightly.tar.gz) ziehen und installieren. Dort einfach eine neue Map vom Typ "Worldmap" anlegen und die ersten Objekte aufnehmen.


    Ich würde mich über konstruktive Rückmeldungen freuen!


    Grüße
    Lars

  • Hi Lars,


    klingt auf jeden fall sehr sehr interessant. Ich kann es nur leider aus Ermangelung einer Test Installation nicht testen, aber ich werde es mir definitv anschauen sobald es live ist :thumbup:

  • Hi Lars,


    wahrscheinlich hier nicht richtig? (Evtl. neuen Thread dafür aufmachen?)


    Hatte vorher die 1.8.5 problemlos am laufen, update auf die 1.9.1b gemacht. Nagvis komplett weiß, lädt also nicht korrekt.
    Hab ich was übersehen? Welche Datei brauchst du um das prüfen zu können?

  • So, Apache error_log (/var/log/httpd/error_log)

    Code
    1. [Fri Jul 10 13:58:09 2015] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
    2. [Fri Jul 10 13:58:09 2015] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
    3. [Fri Jul 10 13:58:09 2015] [notice] Digest: generating secret for digest authentication ...
    4. [Fri Jul 10 13:58:09 2015] [notice] Digest: done
    5. [Fri Jul 10 13:58:09 2015] [notice] Apache/2.2.15 (Unix) DAV/2 mod_fcgid/2.3.9 PHP/5.3.3 configured -- resuming normal operations
    6. [Fri Jul 10 13:58:11 2015] [error] [client 192.168.1.243] PHP Parse error: syntax error, unexpected '[' in /usr/local/nagvis/share/server/core/sources/automap.php on line 342


    Scheint also ein PHP Fehler zu sein, diesen Error kriege ich bei 1.8.5 nicht angezeigt.


    Edit:
    entsprechende Stelle in der automap.php ( $obj['icon_size'] = [22]; )


  • Scheint geholfen zu haben.
    Im Error Log ist jetzt kein Fehler mehr.


    Beim ersten Laden der Seite kam der folgender Fehler:


    Beim neuladen ging es dann.
    Allerdings finde ich die Hosts bzw. die Beschreibung eindeutig zu klein:


    Ansonsten, sehr sehr interessantes Feature :thumbsup:

  • Hmm, interessant :-) So ein Feature hat das Thruk Panorama Dashboard ja ebenfalls und ich hab mir damals
    auch ein paar Gedanken gemacht. Die Idee jeden Host / Service nur einmal platzieren zu müssen finde ich interessant, aber
    das resultiert dann darin, dass du z.b. Hosts bis Zoomlevel 5 anzeigst und drüber dann nur noch Hostgruppen. Da hat man
    meiner Meinung nach nicht viel gewonnen, dann hätte ich auch gleich 2 Karten anlegen können.
    Am coolsten hätte ich gefunden, wenn die Hosts automatisch zusammengefasst werden je nach Zoomlevel. Aber das war
    mir bisher zuviel Arbeit und scheitert auch an der Datenbasis. Letztlich sind ja doch meist sehr viele Hosts an einem
    geographischen Ort, diese müsste man dann wieder künstlich auseinander ziehen. Insgesamt zuviel Aufwand für zuwenig
    Nutzen. Ziel der Geomaps in Thruk war ja eigentlich nur den Hintergrund einfacher auswählen zu können ohne sich
    jedesmal neue Landkarten ausschneiden zu müssen.

  • [Fri Jul 10 13:58:11 2015] [error] [client 192.168.1.243] PHP Parse error: syntax error, unexpected '[' in /usr/local/nagvis/share/server/core/sources/automap.php on line 342


    Ja, mein Fehler. War so im Javascript drin, dass ich hier [22] zur Deklaration eines Arrays verwendet habe. Geht wohl erst in neueren PHP-Versionen ... Mistsprache.


    Quote

    Allerdings finde ich die Hosts bzw. die Beschreibung eindeutig zu klein:


    Guck mal, ob die Schrift nach dem Leeren aller Caches größer ist. Eventuell lädt dein Browser da noch alte CSS-Definitionen. Die Schrift ist eigentlich deutlich größer.


    Quote

    sidebarUpdatePosition()


    Der Fehler weist auch darauf hin, dass da noch gecachtes Javascript geladen wird.

  • Hi Sven,


    Hmm, interessant :-) So ein Feature hat das Thruk Panorama Dashboard ja ebenfalls und ich hab mir damals
    auch ein paar Gedanken gemacht. Die Idee jeden Host / Service nur einmal platzieren zu müssen finde ich interessant, aber
    das resultiert dann darin, dass du z.b. Hosts bis Zoomlevel 5 anzeigst und drüber dann nur noch Hostgruppen. Da hat man
    meiner Meinung nach nicht viel gewonnen, dann hätte ich auch gleich 2 Karten anlegen können.


    Ja, stimmt. Also muss eigentlich eine vernünftige Möglichkeit her die Objekte dynamisch zusammenzufassen oder auszublenden. Am besten ohne, dass der Nutzer sich darum kümmern muss.


    Am coolsten hätte ich gefunden, wenn die Hosts automatisch zusammengefasst werden je nach Zoomlevel. Aber das war
    mir bisher zuviel Arbeit und scheitert auch an der Datenbasis. Letztlich sind ja doch meist sehr viele Hosts an einem
    geographischen Ort, diese müsste man dann wieder künstlich auseinander ziehen.


    Mit diesem ersten Wurf habe ich vor mal ein paar Rückmeldungen zum aktuellen Stand einzusammeln. Um zu gucken, ob es grob in die richtige Richtung geht.


    Die dynamische Clusterbildung habe ich auf der Liste. Das größte Problem hier ist eigentlich, dass die Bildung der Cluster um das Performant zu gestalten im Javascript-Code stattfinden muss. Das würde auch bedeuten, dass die Aggregation der Zustände im Javascript-Code gemacht werden muss, damit die Cluster sinnvoll den Gesamtzustand aller zusammengefassten Objekte darstellen können. Bisher hat NagVis allerdings keinerlei Aggregations-Logik im Javascript-Code und ich würde das auch nur sehr ungerne an zwei Stellen machen müssen. Oder ich müsste alternativ mal versuchen die Aggregation nicht im Javascript-Code zu machen und mir dann die Performance angucken. Mal sehen...


    Grüße
    Lars

  • Nach Cache leeren sieht jetzt alles so aus, wie es sein soll mit schön großer lesbarer Schrift 8)


    (Sobald man das Min_Zoom Level größer ist als das Max_Zoom Level, verschwindet der Host/Service und es gibt keine Möglichkeit den wieder richtig einzustellen. Die worldmap.cfg zeigt auch keinen einzigen Host an.)

  • Nach Cache leeren sieht jetzt alles so aus, wie es sein soll mit schön großer lesbarer Schrift 8)


    (Sobald man das Min_Zoom Level größer ist als das Max_Zoom Level, verschwindet der Host/Service und es gibt keine Möglichkeit den wieder richtig einzustellen. Die worldmap.cfg zeigt auch keinen einzigen Host an.)


    Super, so soll es sein.


    Habe das Handling gerade im Git angepasst. Min_zoom/max_zoom werden nun ignoriert, wenn min_zoom größer oder gleich max_zoom ist. Also werden deine "verlorenen" Objekte mit dem nächsten Update dann wieder angezeigt.


    Ansonsten noch Rückmeldungen zu der Worldmap?


    Grüße
    Lars

  • Perfekt, funktioniert :thumbup:


    Wenn ich eine Linie erstellen will, kann ich oft den Service nicht auswählen. Um den auswählen zu können muss ich erst ein paar Hosts "durchschalten".


    Zudem kommt wenn ich die Linie auf % angabe stellen möchte folgender Javascript Error.


    Code
    1. Javascript error occured:
    2. ReferenceError: msg is not defined http://192.168.1.14/nagvis/frontend/nagvis-js/js/NagVisCompressed.js (3329)


    Edit: Danach lassen sich auche keine Hosts mehr auf der Map hinzufügen. Diese verschwinden sofort wieder und sind dann nicht mehr aufzufinden (egal in welcher Zoom Stufe).


    Edit 2: Es lassen sich auche keine Hosts klonen. Kommt folgender PHP Error:

    Gruß,
    Lukas

    The post was edited 2 times, last by Menthe ().

  • Wenn ich eine Linie erstellen will, kann ich oft den Service nicht auswählen. Um den auswählen zu können muss ich erst ein paar Hosts "durchschalten".


    Hatte jetzt nichts mit den Linien oder Worldmaps zu tun. Trotzdem war es blöd so. Hab das jetzt überarbeitet, so dass es sich deutlich runder bedienen lässt.


    Zudem kommt wenn ich die Linie auf % angabe stellen möchte folgender Javascript Error.


    Code
    1. Javascript error occured:
    2. ReferenceError: msg is not defined http://192.168.1.14/nagvis/frontend/nagvis-js/js/NagVisCompressed.js (3329)


    Hab da auch einen Fehler behoben. Allerdings tritt der nur auf, wenn es Probleme mit den Performance-Daten gibt.Die Fehlermeldung solltest du nun im Hover-Menu sehen können.

  • Hallo Lars,


    Lieber spät als gar nie.
    Genial, die Worldmap erfüllt für mich eine wichtige Anforderung.


    Eine automatische, dynamische Zusamenfassung von Host's oder Services würde ich als perfekt anshen. Je nach Zoom-faktor und Nähe von Host's oder Services werden diese Zusammengefasst. Sicher einfacher definiert als ausprogrammiert .


    Da ich meistens nur Host's in den GEO / World-Maps darstelle, wäre die zentrale Erfassung (z.B. in OMD im WATO bei den Host-Properties) optimal.


    Damit ich auch unterhalb des Äquators Standorte abspeichern konnte, habe ich die Datei "opt/omd/versions/[version]/share/nagvis/htdocs/server/core/defines/matches.php" (2.11.20160223-labs-edition) wie folgt geändert:


    PHP: matches.php
    1. # define('MATCH_LATLONG', '/^[0-9]+(.[0-9]+),-?[0-9]+(.[0-9]+)?$/');
    2. define('MATCH_LATLONG', '/^-?[0-9]+(.[0-9]+),-?[0-9]+(.[0-9]+)?$/');


    Gruss
    Stefano

  • So, ich bin auch mal wieder am Worldmap testen. Mit der aktuellen Nightly (10.05.2016 runtergeladen, 1.9b7).


    Wenn ich einen Host in der Worldmap hinzufüge und das min_zoom und max_zoom jeweils auf 18 stelle (nach meinem Verständnis sollte hier der Host nur noch in der untersten Zoomstufe angezeigt werden). Allerdings sehe ich diesen auf jeder Zoomstufe.


    Edit: Egal welche Zoomstufe ich einstelle. Ist min_zoom und max_zoom gleich, sehe ich den Host, Service, Map,... immer auf allen Zoomstufen.


    Edit2: So, habe den min_zoom auf 18 und den max_zoom auf 19 gestellt. Siehe da, es klappt :)


    Edit3: Viel am testen :D
    Ich habe eine Linie über halb Deutschland gezogen, sie wird komplett richtig angezeigt. Gehe ich allerdings auf die unteren Zoomstufe (15-18) bekomme ich folgenden Javascript Error:

    Code
    1. Javascript error occured: Uncaught TypeError: Cannot read property 'addChild' of undefined http://192.9.200.14/nagvis/frontend/nagvis-js/js/NagVisCompressed.js (4309)

    Will ich einen Host oder einen Service klonen bekomme ich statt der Auswahle folgendes:


    Code
    1. Failed to get objects: Error: (0) Invalid argument supplied for foreach()<div class="details">URL: /nagvis/server/core/ajax_handler.php?mod=Map&act=addModify&show=karldischinger-gesamt&type=host&x=47.921986374042554&y=7.728838920593262&clone_id=c518c4&_ajaxid=1462882126<br> File: /usr/local/nagvis/share/server/core/mapcfg/default.php<br> Line: 126<br> <code>#0 /usr/local/nagvis/share/server/core/mapcfg/default.php(126): nagvisExceptionErrorHandler(2, 'Invalid argumen...', '/usr/local/nagv...', 126, Array)<br> #1 /usr/local/nagvis/share/server/core/mapcfg/default.php(159): getObjectNames('host', Object(GlobalMapCfg), 'c518c4', Array)<br> #2 /usr/local/nagvis/share/server/core/classes/ViewMapAddModify.php(380): listHostNames(Object(GlobalMapCfg), 'c518c4', Array)<br> #3 /usr/local/nagvis/share/server/core/classes/ViewMapAddModify.php(490): ViewMapAddModify->drawField('host_name', Array, Array)<br> #4 /usr/local/nagvis/share/server/core/classes/ViewMapAddModify.php(518): ViewMapAddModify->drawFields(Array)<br> #5 /usr/local/nagvis/share/server/core/classes/ViewMapAddModify.php(603): ViewMapAddModify->drawForm()<br> #6 /usr/local/nagvis/share/server/core/classes/CoreModMap.php(133): ViewMapAddModify->parse()<br> #7 /usr/local/nagvis/share/server/core/functions/index.php(120): CoreModMap->handleAction()<br> #8 /usr/local/nagvis/share/server/core/ajax_handler.php(58): require('/usr/local/nagv...')<br> #9 {main}</code>Output: <pre><form id=&quot;addmodify&quot; name=&quot;addmodify&quot; action=&quot;javascript:submitForm('/nagvis/server/core/ajax_handler.php?mod=Map&amp;act=addModify', 'addmodify');&quot; method=&quot;POST&quot;> <input type=&quot;hidden&quot; id=&quot;_form_name&quot; name=&quot;_form_name&quot; value=&quot;addmodify&quot; /> <input type=&quot;hidden&quot; id=&quot;_update&quot; name=&quot;_update&quot; value=&quot;0&quot; /> <input type=&quot;hidden&quot; id=&quot;sec&quot; name=&quot;sec&quot; value=&quot;general&quot; /> <ul class=&quot;nav&quot; id=&quot;nav&quot;><li id=&quot;nav_general&quot; class=&quot;active&quot;><a href=&quot;javascript:toggle_section('general')&quot;>General</a></li><li id=&quot;nav_appearance&quot; ><a href=&quot;javascript:toggle_section('appearance')&quot;>Appearance</a></li><li id=&quot;nav_state&quot; ><a href=&quot;javascript:toggle_section('state')&quot;>Status</a></li><li id=&quot;nav_actions&quot; ><a href=&quot;javascript:toggle_section('actions')&quot;>Aktionen</a></li><li id=&quot;nav_label&quot; ><a href=&quot;javascript:toggle_section('label')&quot;>Label</a></li><li id=&quot;nav_worldmap&quot; ><a href=&quot;javascript:toggle_section('worldmap')&quot;>Worldmap</a></li></ul><div id=&quot;sec_general&quot; class=&quot;section&quot; style=&quot;&quot;><table class=&quot;mytable&quot;><tr class=&quot;must&quot;><td class=tdlabel>host_name</td><td class=tdbox></td><td class=tdfield></pre>

    Gruß,
    Lukas

    The post was edited 3 times, last by Menthe ().

  • Finde das Feature auch sehr interessant. Was mir noch gefallen würde wäre, wenn man die Worldmap ebenfalls wie die geomap aus einer CSV Datei speisen kann - alternativ wäre eine Dokumentation interessant wie die Worldmap DB zu befüllen ist. Hintergrund ist das ich Portable Systeme Monitoren und Anzeigen möchte - sich deren Position eben über die zeit verändert. Ich habe mich noch nicht viel beschäfdigt mit der Worldmap, bin gerade erst auf das Feature gestossen. Auf jedenfall gefällt mir sehr was ich sehe,


    lg
    mobro

  • Ist auf jeden Fall interessant :thumbup:


    Was mich immer berührt, ist die Möglichkeit der Darstellung mit Produktivsystemen ohne Internet-Verbindung = lokaler Kartenserver?


    Da es bei Icinga wohl mal ein Elasticsearch-Modul gibt und ich bereits GeoIP von Kibana kenne, würd ich mir am liebsten was gemeinsames wünschen.
    Hier ein Beispiel wie dort mit Koordinaten umgegangen wird: GeoIP and ELK