Reportings Zabbix avec Jasper

2014-03-03 4 Par seuf

zabbixJasper studio
Aujourd’hui au boulot, je leur ai proposé de faire des rapport sur l’utilisation de Zabbix via l’outil Open source Jasper.
Je vais donc décrire ici les différentes étapes permettant de générer de beaux rapports Jasper pour Zabbix !
J’utilise pour cela jasper Studio en version community (la version open source gratuite).

    • Etape 1 : Création du rapport

On va d’abord créer un nouveau rapport Jasper, ainsi qu’un Data Adapter (une connexion a la base de données).
On va utiliser pour cela une connexion jdbc. Il faut alors télécharger le connecteur jdbc correspondant à notre type de base de données (Mysql / Postgres / Oracle, etc..) et renseigner l’url de connexion (ici posgtresql):
JDBC Driver : org.postgresql.Driver
JDBC url : jdbc:postgresql:///zabbix
Username : zabbix
Password :

Attention, il ne faut pas oublier d’ajouter le répertoire dans lequel est stocké le Driver jdbc .jar dans l’onget « Driver Classpath », sinon, ça ne marchera pas.
DataAdapter

    • Etape 2 : Création du Data Set principal

Ensuite, on va créer le Data Set principal, qui servira a dérouler l’ensemble du rapport.
On sélectionne pour cela le Data Adpater que l’on a créé précédemment et on écrit la requête principale pour le rapport.
Voici ce que j’ai mis pour pouvoir lister toutes les alertes Acquittées pendant la semaine :

SELECT DISTINCT
   h.name as host,
   g.name as host_group,
   t.description as trigger,
   a.message,
   u.alias
FROM 
    groups g,
    hosts_groups hg,
    hosts h,
    triggers t,
    items i,
    functions f,
    events e,
    acknowledges a,
    users u
WHERE 
    AND g.groupid = hg.groupid
    AND hg.hostid = h.hostid
    AND e.objectid = t.triggerid
    AND t.triggerid = f.triggerid
    AND f.itemid = i.itemid
    AND i.hostid = h.hostid
    AND e.eventid = a.eventid
    AND a.userid = u.userid
    AND e.value = 1 
    AND TIMESTAMP 'epoch' + e.clock * INTERVAL '1 second' BETWEEN $P{date_start} AND $P{date_end}
ORDER BY g.name, h.name, t.description

DataSet1

Il faut également penser à ajouter les 2 paramètres date_start et date_end de type java.util.Date dans l’onglet parameters.

    • Etape 3 : Layout

Ensuite, on commence par faire un peut de mise en page, avec un titre, un logo, et les dates de début et fin du rapport. J’ai mis un tableau pour contenir le Top 10 des alertes générées, ainsi qu’un camembert pour avoir la répartition des alertes par host.
Ensuite dans les Entêtes de Groupe, de Host, on place les champs $F{host_group} et $F{host} de la requête principale.
Et dans la zone Detail, j’ai mis 3 colonnes avec le nom du trigger, le message d’acquittement et le nom du user qui a acquitté l’alerte.

layout

    • Etape 4 : Top 10 des Triggers

Pour le Top 10 des alertes, voici ma requête SQL, qu’il faut placer dans un nouveau Data Set :

SELECT 
	count(DISTINCT e.eventid) as nb, 
	h.hostid,
	h.name as host,
	t.triggerid,
	t.description
 FROM 
 	events e
 		INNER JOIN triggers t ON t.triggerid = e.objectid
 		INNER JOIN functions f ON t.triggerid = f.triggerid
 		INNER JOIN items i ON i.itemid = f.itemid
 		INNER JOIN hosts h ON h.hostid = i.hostid
 WHERE 
 	e.source = 0 
 	AND e.value = 0 
 	AND h.status = 0
 	AND t.status = 0
 	AND TIMESTAMP 'epoch' + e.clock * INTERVAL '1 second' BETWEEN $P{date_start} AND $P{date_end}
 GROUP BY 
 	h.hostid, h.name, t.triggerid, t.description
ORDER BY nb DESC
LIMIT 10;

Ici aussi, il ne faut pas oublier d’ajouter les parametres date_start et date_end dans l’onglet parameters.

    • Etape 5 : Cammembert

Et pour le Pie Chart (le cammembert), j’ai utlisé la requête SQL suivante (encore dans un nouveau Data Set :

SELECT
    count(DISTINCT e.eventid) as nb,
    h.name as host
FROM
    events e
    INNER JOIN triggers t ON t.triggerid = e.objectid
    INNER JOIN functions f ON t.triggerid = f.triggerid
    INNER JOIN items i ON i.itemid = f.itemid
    INNER JOIN hosts h ON h.hostid = i.hostid
    INNER JOIN hosts_groups hg ON hg.hostid = h.hostid
    INNER JOIN groups g ON g.groupid = hg.groupid
WHERE
    e.source = 0
    AND e.value = 1
    AND h.status = 0
    AND t.status = 0
    AND TIMESTAMP 'epoch' + e.clock * INTERVAL '1 second' BETWEEN $P{date_start} AND $P{date_end}
GROUP BY h.hostid,h.name;

Ici aussi, il ne faut pas oublier d’ajouter les paramètres date_start et date_end dans l’onglet parameters.

Libre a vous d’ajouter des filtre par host group, par user group ou whatever..

    • Etape 6 : Mapping des paramètres

Enfin, il ne reste plus qu’a mapper les paramètres de la requête principale dans les Data Set secondaires pour qu’ils soient pris en compte partout. Pour cela, on sélectionne Paramètre dans le menu en bas à droite du tableau ou dans le formulaire Wizard du camembert.
il faut alors associer date_start à $P{date_start} et date_end à $P{date_end}

parameters

Et voilà ! Il ne reste plus qu’a prévisualiser le tout pour vérifier que cela fonctionne (en général, on a au moins 3 ou 4 java.WTF.Exception) et il faut s’y reprendre a plusieurs fois avant d’arriver a faire marcher le truc.

  • Dernière étape : Automatisation !!/li>Comme j’ai pas envie de me prendre la tête avec un jasper Server, et que j’ai juste besoin de lancer mon rapport une fois par semaine, j’ai téléchargé jasperstarter que j’ai installé sur le serveur ou il y a la BDD et il suffit ensuite de le cronner avec les bons paramètres !

    Voici les lignes de commande que j’utilise pour compiler et générer le rapport :
    Compilation :

    ./jasperstarter/bin/jasperstarter compile path/to/zabbix_A4.jrxml

    Génération :

    ./jasperstarter/bin/jasperstarter process path/to/zabbix_A4.jasper -t postgres -H 127.0.0.1 -u zabbix -p password -n zabbix --db-port 5432 -f pdf -P date_start=2014-02-24 date_end=2014-02-31

    Et voila, on obtient un beau PDF avec plein de stats dedans !