Zabbix consente di monitorare molto bene i cosiddetti IT Services, ovvero oggetti che rappresentano un servizio erogato contemporaneamente da diversi sistemi correlati tra di loro. Putroppo però la rappresentazione grafica di questi oggetti è molto primitiva.
Avevo la necessità di creare una mappa interattiva per un cliente a cui avevamo installato Zabbix, ma gli oggetti della mappa dovevano essere gli IT services, perché questa era la specifica di progetto.
Il problema è che Zabbix nativamente non consente di inserire gli IT Services tra gli oggetti rappresentati su di una mappa, ma solo host, trigger o immagini statiche.
Dopo aver provato diverse soluzioni ho deciso di costruirmela da solo.
Visto che su di una mappa posso essere rappresentati solo host ho pensato di creare degli host fittizi,con un solo item, che rappresentasse lo stato di un IT Service, prendendo questo dalle API di Zabbix (dalle quali si può tranquillamente estrarre lo stato di un IT service).
Ho quindi creato un template che contiene un solo item, di tipo External Check, che chiama uno script che a sua volta interroga le API di Zabbix per leggerne lo stato. Il template contiene una macro, da sovrascrivere di volta in volta con l’ID del servizio monitorato e un trigger. Il template potete scaricarlo qua, assieme allo script e ad un secondo script che ricava il token di autenticazione delle API di Zabbix in base all’utente usato per collegarsi. Nello script va inserito il token corretto e cambiata la URL se lo si fa girare su di un sistema diverso dallo Zabbix Server.
Ho quindi creato tanti host quanti erano i servizi da controllare, in modo da coprire l’intero albero, ho assegnato ad ogni host il template e ho impostato la macro a livello di host al valore dell’ID del servizio monitorato (l’ID si recupera facilmente dal browser, passando il mouse sul nome del servizio che ci interessa).
A questo punto avevo tanti host quanti erano i livelli dell’albero dei servizi, ognuno dei quali aveva un solo item che poteva assumere il valore 0 se il servizio era funzionante o 4 in caso contrario (esistono altri valori, ma non ci interessano in questa sede) e un trigger che scattava se il valore dell’item era diverso da 0.
L’ultima cosa che serviva era un set di icone adatto a rappresentare i due stati e ho creato anche quelle. Le trovate qua.
Con gli item e le icone ho quindi creato una mappa ad albero le cui foglie sono rappresentate dai servizi monitorati e variano quindi di aspetto al variare dello stato del servizio stesso.
Questo è il risultato finale: