Metabase vs Grafana pour les Dashboards GLPI : Lequel Choisir ?

Metabase et Grafana lisent la même base GLPI mais résolvent des problèmes différents. Comparatif pratique : mapper les statuts, se connecter sans ralentir la production, verdict par scénario et coût réel.

GLPI conserve tout l'historique du service desk, mais les rapports natifs s'arrêtent là où la direction commence à demander "pourquoi". Metabase et Grafana lisent la même base MariaDB de GLPI et transforment cet historique en tableaux de bord - mais ils résolvent des problèmes différents, et se tromper coûte du retravail.

Ce qui change quand on branche un BI sur GLPI

Avant de comparer les deux outils, il faut comprendre que la base de GLPI n'a pas été conçue pour le BI. Trois détails définissent la majeure partie du travail sur n'importe quel tableau de bord, que ce soit dans Metabase ou dans Grafana :

  • Le statut, la priorité et l'urgence sont des nombres, pas du texte. Dans glpi_tickets, la colonne status va de 1 (Nouveau) à 6 (Clos). Aucun outil ne le sait tout seul - si vous ne traduisez pas les codes, le gestionnaire voit "status 2" sur le graphique.
  • Rien n'est vraiment supprimé. GLPI utilise la suppression logique : is_deleted = 1 marque l'enregistrement comme "dans la corbeille". Oublier le filtre is_deleted = 0 gonfle tous les décomptes.
  • C'est multi-entité. La colonne entities_id segmente les données par client ou service. Un tableau de bord que le client va voir doit filtrer le bon sous-arbre d'entités - et ce n'est pas gratuit en SQL pur.

Ajoutez un quatrième point, purement opérationnel : pointer le BI directement sur la base de production, en heures ouvrées, avec des requêtes qui balaient toute la table glpi_tickets jointe à glpi_logs, est le moyen le plus rapide de ralentir GLPI lui-même. Nous y revenons plus bas.

Comparatif direct

CritèreMetabaseGrafana
StackApplication JavaApplication Go
Public cibleDirection, client, analysteÉquipe technique et NOC
Modèle de requêteÉditeur visuel ou SQLSQL sur chaque panneau
Séries temporelles / temps réelRafraîchissement périodique (cache)Natif (macros de temps, auto-refresh)
Sélecteur de périodeFiltre manuel par questionTime picker global en haut
Filtre dynamique par entitéFiltres et paramètresVariables de template via SQL
AlertesBasiques (e-mail)Avancées (e-mail, Slack, Teams, webhook)
Cloisonnement par client (row-level)Sandboxing payant seulement ; en gratuit, 1 question par entitéVariable de template + organisations ; contrôle manuel
Embed / partageLien public et embedding signé (JWT)iframe (allow_embedding) et public dashboards
Tableau de bord comme codeLimité dans la version gratuiteNatif (provisioning YAML/JSON versionnable)
Empreinte mémoirePlus élevée (heap Java, ~2 Go ou plus)Faible (centaines de Mo)
Idéal pourRapport de gestion navigable et exportableTableau de bord opérationnel en direct
CoûtOpen source ; Pro/Enterprise payantsOpen source ; Enterprise payant

Comment se connecter sans plomber GLPI

Quel que soit l'outil, la connexion est la même : un utilisateur de base en lecture seule, idéalement pointant sur une réplique ou une copie restaurée de nuit, jamais sur le maître de production avec droit d'écriture.

-- Utilisateur en lecture seule pour le BI (executer sur le MariaDB/MySQL de GLPI).
-- Pointez de preference sur une replique ou une copie restauree,
-- jamais sur le maitre de production avec droit d'ecriture.
CREATE USER 'bi_ro'@'10.0.0.%' IDENTIFIED BY '${MOT_DE_PASSE_FORT}';
GRANT SELECT ON glpi.* TO 'bi_ro'@'10.0.0.%';
FLUSH PRIVILEGES;

Une fois l'accès prêt, le premier artefact qui règle le problème des "nombres bruts" est une requête qui traduit les codes de statut. Elle vaut pour les deux : dans Metabase elle devient une "Question SQL", dans Grafana un panneau tableau ou barres.

-- Tickets ouverts par statut, avec les codes traduits.
-- Dans GLPI, glpi_tickets.status va de 1 a 6.
SELECT
  CASE status
    WHEN 1 THEN 'Nouveau'
    WHEN 2 THEN 'En cours (attribue)'
    WHEN 3 THEN 'En cours (planifie)'
    WHEN 4 THEN 'En attente'
    WHEN 5 THEN 'Resolu'
    WHEN 6 THEN 'Clos'
  END AS statut,
  COUNT(*) AS total
FROM glpi_tickets
WHERE is_deleted = 0          -- ignore la corbeille (suppression logique)
  AND status IN (1, 2, 3, 4)  -- seulement ceux encore ouverts
GROUP BY status
ORDER BY status;

Metabase offre un raccourci : au lieu du CASE, vous pouvez mapper les valeurs de la colonne directement dans les réglages du champ (1 vers "Nouveau", 2 vers "En cours" et ainsi de suite), et l'étiquette apparaît automatiquement sur tout graphique. C'est un gain de productivité que Grafana n'a pas - là le CASE est obligatoire.

Grafana : le tableau de bord comme code

L'avantage de Grafana pour qui exploite beaucoup d'environnements n'est pas à l'écran, il est sur le disque : source de données et panneaux sont des fichiers versionnables. Nous provisionnons le même tableau de bord chez plusieurs clients à partir d'un YAML et d'un JSON dans Git, sans cliquer nulle part.

# /etc/grafana/provisioning/datasources/glpi.yaml
# Source de donnees versionnable : le meme fichier provisionne N environnements.
apiVersion: 1
datasources:
  - name: GLPI-MariaDB
    type: mysql
    access: proxy
    url: mariadb.interne:3306
    database: glpi
    user: bi_ro
    jsonData:
      maxOpenConns: 5             # limitez les connexions : n'etouffez pas GLPI
      timezone: America/Sao_Paulo
    secureJsonData:
      password: ${GLPI_BI_PASSWORD}

L'autre différenciateur, c'est le temps. Grafana comprend les séries temporelles nativement : avec les macros $__timeFilter et $__timeGroup, le sélecteur de période et l'auto-refresh du haut de l'écran pilotent la requête, et une variable de template devient un filtre d'entité dynamique.

-- Panneau de serie temporelle : les macros branchent le time picker du haut.
SELECT
  $__timeGroup(date, '1d') AS time,    -- regroupe par jour
  COUNT(*)                 AS ouverts
FROM glpi_tickets
WHERE is_deleted = 0
  AND entities_id IN (${entite})        -- variable de template (filtre par client)
  AND $__timeFilter(date)               -- respecte l'intervalle choisi a l'ecran
GROUP BY 1
ORDER BY 1;

-- Requete qui alimente la variable de template "entite" :
SELECT name AS __text, id AS __value
FROM glpi_entities
ORDER BY completename;

Le compromis qui apparaît en exploitation

En maintien en condition opérationnelle de parcs GLPI pour des clients, la décision est rarement technique - elle porte sur qui va regarder le tableau de bord. L'erreur la plus courante que nous corrigeons est toujours la même : quelqu'un choisit Grafana parce que "c'est plus puissant", monte un panneau opérationnel impeccable, et trois mois plus tard le directeur demande un rapport mensuel des tickets par catégorie avec export pour le client. Dans Grafana c'est pénible : il a été conçu pour des métriques en direct, pas pour qu'un gestionnaire navigue et exporte des tableaux. Alors Metabase entre en scène, et l'environnement devient deux BI à maintenir.

Un détail que seule l'exploitation révèle, c'est le cloisonnement par client. Dans un cabinet qui sert plusieurs clients sur le même GLPI (ou sur des GLPI distincts), il faut garantir que le tableau de bord du client A n'affiche jamais un ticket du client B. Dans Metabase, le vrai row-level security - le sandboxing par utilisateur - est une fonction payante ; en version gratuite, la parade est de créer une question par client avec l'entities_id figé dans le WHERE, ce qui multiplie la maintenance. Dans Grafana, nous le résolvons avec une variable de template liée aux entités, mais le contrôle de qui voit quoi reste entre vos mains. Il n'existe pas de raccourci gratuit pour l'isolation multi-client - nous décidons au cas par cas, et dans le doute nous séparons par instance, pas par requête.

Verdict par scénario

Choisissez Metabase quand le public est la direction, le client ou l'analyste sans SQL. La courbe est douce, le rapport sort navigable et exportable, et le mapping visuel des statuts règle les "nombres bruts" sans écrire de CASE. C'est le meilleur outil pour amener la donnée du service desk à ceux qui n'ouvrent jamais un terminal.

Choisissez Grafana quand le tableau de bord est opérationnel et en direct - file par groupe, SLA à risque, tickets par heure - pour l'équipe technique ou le NOC. Le time picker, l'auto-refresh, les alertes multi-canal et le provisioning comme code sont des avantages réels que Metabase ne couvre pas bien.

Utilisez les deux quand le même GLPI sert des publics différents : Grafana sur le mur de l'exploitation, Metabase entre les mains de la direction et du client. C'est courant et ça marche, mais assumez le coût de maintenir deux BI - ne prenez pas cette voie "par précaution".

Coût et effort

La licence n'est pas l'axe de la décision : les deux ont une édition open source gratuite qui suffit aux tableaux de bord GLPI, et les offres payantes (Metabase Pro/Enterprise, Grafana Enterprise) ne comptent qu'à l'échelle ou pour la gouvernance. Le vrai coût, c'est la modélisation. Le plus lourd n'est pas d'installer - c'est de connaître le schéma de GLPI : mapper les statuts et priorités, se souvenir de is_deleted, résoudre l'arbre des entités et ne pas surcharger la production. Comme fourchette honnête : une poignée de panneaux opérationnels dans Grafana se monte en une après-midi ; un jeu de rapports de gestion bien modélisés dans Metabase, avec filtres par client et statuts traduits, prend généralement de deux à quatre jours de travail avant d'être fiable. Pour savoir quelles métriques mettre sur chaque tableau de bord, voyez notre guide des KPI de Service Desk dans GLPI.

Chez NexTool, nous déployons Metabase et Grafana sur le GLPI des clients sur les deux fronts - rapport de gestion et tableau de bord opérationnel - toujours avec un utilisateur en lecture seule et sans plomber la production. Si vous voulez les bons tableaux de bord pour le bon public, sans être otage d'un BI inadapté, notre conseil conçoit cette couche d'indicateurs de bout en bout.


Ce contenu a été produit avec l'aide de l'intelligence artificielle et revu par l'équipe Nextool Solutions.

Questions fréquentes

GLPI stocke le statut sous forme de nombre dans la colonne glpi_tickets.status : 1 Nouveau, 2 En cours (attribué), 3 En cours (planifié), 4 En attente, 5 Résolu, 6 Clos. Aucun des deux outils ne le traduit tout seul. Dans Grafana vous utilisez un CASE en SQL ; dans Metabase vous pouvez mapper les valeurs directement dans les réglages du champ, sans écrire de requête.

Oui, mais avec prudence. Créez toujours un utilisateur en lecture seule (GRANT SELECT) et limitez le nombre de connexions. Le vrai risque est la performance : des requêtes lourdes balayant glpi_tickets et glpi_logs en heures ouvrées ralentissent GLPI lui-même. L'idéal est de pointer le BI sur une réplique ou une copie restaurée de nuit.

Metabase est une application Java et demande plus de mémoire - prévoyez de l'ordre de 2 Go de heap ou plus pour un fonctionnement confortable, et la synchronisation du schéma pèse sur les grosses bases comme celle de GLPI. Grafana est écrit en Go et tourne léger, de l'ordre de centaines de Mo. Pour un environnement sobre, Grafana a l'avantage de l'empreinte.

Oui, mais pas gratuitement dans Metabase : le vrai row-level security (sandboxing par utilisateur) est payant ; en version gratuite la parade est une question par client avec entities_id figé dans le filtre. Dans Grafana vous utilisez une variable de template liée à glpi_entities, mais le contrôle d'accès vous incombe. Pour une isolation forte entre clients, séparer par instance est souvent préférable.

Oui, les deux supportent l'embed via iframe. Dans Grafana, activez allow_embedding dans grafana.ini (ou utilisez les public dashboards) ; dans Metabase, utilisez le lien public ou l'embedding signé par JWT. GLPI accepte l'iframe sur des pages personnalisées ou via un module d'intégration. Utilisez toujours l'utilisateur en lecture seule derrière.

Besoin d'aide ?