Individuelles Dashboard für Icinga erstellen/Daten auslesen

Leider bietet Icinga keine Möglichkeit um ein Individuelles Dashboard zu erstellen, doch mit etwas jQuery-Kenntnissen, kann man sich sein eigenes Dashboard für Icinga selbst zusammenbauen, oder eben Daten zur Weiterverarbeitung auslesen. Dieser Beitrag soll nur die grundlegende Vorgehensweise erläutern, da man das ganze natürlich bis ins unendliche ausbauen kann – siehe Beitragsende.

Daten auslesen aus Icinga

Der einfachste Weg geht mit jQuery über das Icinga-Web-Interface. Hier werden bereits alle notwendigen Services und Hosts bzw. deren Status angezeigt. Das schöne daran ist, dass die Obefläche von Icinga Web sehr stark mit Ajax arbeitet. Somit können jegliche Daten aus Icinga ausgelesen werden. Die nachfolgenden Request lassen sich auch mit dem Firefox-Plugin „FireBug“ mitlesen.

Anmelden an Icinga Web

Bevor Daten mit jQuery für ein individuelles Dashboard ausgelesen werden können, muss zunächst ein Login erfolgen, dies geschieht mit folgendem Ajax-Request:

$.ajax(
{
	//Hier die URL oder den Hostnamen der Icinga Web Instanz angeben:
	url: 'http://'+host+'/icinga-web/modules/appkit/login/json',
	dataType: 'json',
	type: 'post',
	//Password und Benutzer senden
	data: {'password':"password",username:"root",dologin:1},
	success: function(res){
		if(res.success===true) {
			//Angemeldet
		}
		else {
			//Login failed
		}
	}
});

Update 07.08.2013: Application State zuerst abfragen

Bei den nachfolgenden Anfragen per Ajax an Icinga kommen falsche Zahlenwerte zurück (insbesondere beim Statusüberblick), nach längerer Suche fiel mir auf das ein weiterer Request notwendig ist. Anscheinend erwartet Icinga das zuerst der Application State abefragt wird. Dies geht wie folgt:

$.ajax(
{
	//Hier die URL oder den Hostnamen der Icinga Web Instanz angeben:
	url: 'http://'+host+'/icinga-web/modules/appkit/ext/applicationState',
	dataType: 'json',
	type: 'post',
	//Password und Benutzer senden
	data: "cmd=read&id=1&user=user&session=session"
});

Statusüberblick aller Hosts und Services von Icinga auslesen

Als Startübung soll nun zunächst der Statusüberblick von Icinga ausgelesen werden, das ist die Übersicht links oben im Icinga Dashboard. Dazu reicht folgender parameterlose Ajax Get Request:

$.ajax({
	url:	'http://'+host+'/icinga-web/modules/cronks/statusOverall/json',
	type: 'get',
	dataType: 'json',
	success: function(res){
		if(res.success===true) {
			{
				console.log(res);
				/*
				{
				...
				rows:[{
					state:0,
					state_name:"UP",
					type:"host", //oder service
					count: ..., //Anzahl
					acknowledged:0, //Anzahl bekannte Probleme
					unacknowledged:18, //Anzahl unbekannte Probleme
					...
				},
				...
				//Liefert insgesamt 11 Objekte die Status-Daten von
				Hosts: UP, DOWN, UNREACHABLE, PENDING, TOTAL und
				Services: OK, WARNING, CRITICAL, UNKNOWN, PENDING, TOTAL enthalten
				]}*/
				}
		}
	}
});

Auf Host Daten von Icinga zugreifen

Der folgende Ajax-Request liefert alle Daten zu den mit Icinga überwachten Hosts

$.ajax({
	url:	'http://'+host+'/icinga-web/modules/cronks/viewproc/icinga-host-template/json',
	data: 	{
		"page_start": 0, //Zeige ab 0, optional
		"page_limit": 1000, //max. 1000 Hosts, optional
		"f": { //ohne den Parameter f werden alle Hosts angezeigt
			"host_status-value":1, //0: up, 1: down, 2: Unreachable
			"host_status-operator":50,
		},
		"sort_field":"host_duration", //sortiere nach: host_last_check, host_name, ...
		"sort_dir":"DESC" //Auf- oder Absteigend
	},
	dataType: 'json',
	type: 'post',
	success: function(res){
		if(res!=null) if(res.success===true) {
			console.log(res);
			/* liefert: {
				metaData: {...},
				success:true,
				total: ... , //Anzahl
				rows: ... //Array mit allen Hosts
			}*/
		}
	}
});

Auf Service Daten von Icinga zugreifen

Der folgende Ajax-Request liefert alle Daten zu den mit Icinga überwachten Services. Dieser Ajax Request unterscheidet sich im eigentlichen nicht wesentlich von dem Host-Request, lediglich der url-Wert und die f-Parameternamen

$.ajax({
	url:	'http://'+host+'/icinga-web/modules/cronks/viewproc/icinga-service-template/json',
	data: 	{
		"page_start": 0, //Zeige ab 0, optional
		"page_limit": 1000, //max. 1000 Services, optional
		"f": { //ohne den Parameter f werden alle Services angezeigt
			"service_status-value":2, //0: up, 1: warning, 2: critical, 3: unknonw
			"service_status-operator":50,
		},
		"sort_field":"host_duration", //sortiere nach: host_last_check, host_name, ...
		"sort_dir":"DESC" //Auf- oder Absteigend
	},
	dataType: 'json',
	type: 'post',
	success: function(res){
		if(res!=null) if(res.success===true) {
			console.log(res);
			/* liefert: {
				metaData: {...},
				success:true,
				total: ... , //Anzahl
				rows: ... //Array mit allen Services
			}*/
		}
	}
});

Individuelles Dashboard für Icinga erstellen

Mit den oben genannten Requests werden die Daten von Icinga Web ausgelesen und können mit etwas Programmierarbeit weiter gefiltert, sortiert, ausgewertet und schließlich angezeigt werden. In Verbindung mit LConf lassen sich noch die Hosts und Services aus Icinga noch gruppieren, so dass dann mit viel Fleiß ein Dashboard wie dieser dabei herauskommt:

individuelles Dashboard
Beispiel für ein individuelles Dashboard

Update 31.03.2014

Aufgrund der Anfragen: hier mal eine provisorische HTML-Datei. Hier müssen einfach die Parameter usr, host und pwd gegen die eigenen austauschen. Das Beispiel zeigt momentan alle Hosts und Services an.

18 Gedanken zu „Individuelles Dashboard für Icinga erstellen/Daten auslesen“

  1. Hallo Udo,

    super Artikel. Gibt es denn dieses oder andere Beispieldashboards für nichtversierte Programmierer, die man dann anpassen könnte?

    Viele Grüße, Manni

    1. Leider nein, da würde etwas mehr Aufwand dahinter stecken. Es hängt ja auch vieles von der eingesetzten Icinga-Umgebung ab, aber vielleicht lasse ich mich ja breitschlagen, wenn noch mehr Anfragen kommen 😉

    1. Leider nein – da lässt sich nur schwer eine allgemeine Lösung bauen. Muss aber bald wieder ein neues Dashboard programmieren. Ich versuche es dann gleich so zu basteln, dass es mit ein paar wenigen Parametern auf die eigene Umgebung angepasst werden kann.

  2. Eine fertige allgemeine Lösung muss es gar nicht sein, ich kann dies recht gut selbst ändern und anpassen. Nur mit den obigen Code Schnipseln will mir der Einstieg derzeitige nicht gelingen.

  3. Hello. Im a Norwegian student at HIG, studying nettwork science and systems. Im having a bachelor project, and one of the tasks is to set up individual dashboards for some local IT service desks, where Icinga Classic is already implemented. Will this solution work on Icinga Classic?

  4. Hallo Udo, ich habe in den letzten Tagen versucht eine Einzige Abfrage mittels Ajax zu erhalten. Aber es klappt gar nichts. Leider habe ich nur noch rudimentäre Kenntnisse von PHP und Co von früher.
    Wie weit bist du denn schon mit dem Beispieldashboard gekommen?
    Kannst du vielleicht im Vorfeld mal ein HTML-Gerüst mit einer eingebundenen Beispielabfrage auf Knopfdruck zur Verfügung stellen? Den Rest könnte ich mir bestimmt zusammenprogrammieren. Es hängt aber schon an der DB-Verbindung und der ersten Abfrage.
    Wäre dir sehr verbunden.

    Viele Grüße,
    Manni

    1. So hab jetzt eine ganz simple HTML-Datei – hier einfach mal in den Quellcode schauen. Für eigene Tests sollten natürlich die Parameter host, pwd, usr gegen die eigene Icinga Installation ausgetauscht werden.

    1. Schau mal auf das Beispiel such dort nach den Wörtern limit und sort für die Ajax Request Parameter. Mit diesen Parameter kannst du dann nur die letzten (bzw. neuesten) Ereignisse herausfiltern.

    1. So, Fehler gefunden, habe die html natürlich nicht auf dem Server abgelegt :-/

      Aktuell macht er mir keine Ausgabe auf die Seite, die Daten bekommt er allerdings.
      Er erstellt nur keine Tabelle, auf der Seite ist aktuell nur „Hosts“ und darunter „Services“ zu sehen.

      1. Die Parameter in der Besipieldatei:

        var host="192.168.1.1";
        var usr="root";
        var pwd="password";

        hast du angepasst? Wenn nichts anzeigt wird, kann ein Parameter nicht stimmen, oder es kommt zu einem JavaScript-Error – das findest du mit Browser-Addons wie FirBug raus. Hier wäre die Fehlermeldung interessant.

      2. Keine Errors, Daten stimmen, Er bekommt laut FirBug auch alle Daten mit num „200 OK“.
        Nur er schreibt nichts in die Seite. außerdem dauert die Abfrage ca. 7sec .. Kann das eine Ursache sein?

  5. UPDATE:
    Icinga 1.7.1 gibt falsche Werte zurück, daher keine Tabellenbildung.
    Icinga 1.11.3 funktioniert einwandfrei mit Deinem Code.
    Danke Dir ! 🙂

Kommentare sind geschlossen.