Le plus grand problème de votre exploitation n'est pas le SLA - c'est le manque de visibilité

La visibilité dans un Service Desk, ce n'est pas plus de rapports - c'est voir la file tant qu'il est encore temps d'agir. Découvrez où vit la vraie visibilité dans GLPI : SQL de diagnostic pour le backlog par groupe, anticiper un dépassement de SLA, les tickets sans responsable et sans SLA, la matrice des couches de visibilité et comment transformer tout cela en alerte automatique.

La visibilité ne consiste pas à avoir plus de rapports - il s'agit de voir l'état de la file tant qu'il est encore possible d'agir. GLPI stocke déjà tout ce dont vous avez besoin ; le problème, c'est que la donnée est dispersée et que le tableau de bord natif ne montre que le passé. Ce guide montre où vit la vraie visibilité dans GLPI, quelles requêtes de diagnostic nous lançons quand nous reprenons l'exploitation d'un environnement, comment anticiper un dépassement de SLA avant qu'il ne survienne et comment transformer tout cela en alerte automatique.

La visibilité que GLPI vous donne déjà - et où elle s'arrête

GLPI est livré avec des tableaux de bord sur la Centrale et une recherche filtrée puissante. Au quotidien, cela règle beaucoup de choses : comptages par statut, par technicien, par catégorie. La limite apparaît en trois points :

  • C'est à la demande, pas proactif. Le tableau de bord ne se rafraîchit que lorsqu'on ouvre l'écran. Personne n'est prévenu quand un goulet d'étranglement se forme - il faut aller regarder.
  • Il compte ce que votre profil peut voir. Le chiffre du tableau de bord dépend de l'entité et du profil de la personne connectée. Le coordinateur d'une entité et l'administrateur global voient des totaux différents de la même file.
  • Il montre l'agrégat, pas le ticket oublié. "42 tickets ouverts" ne dit pas lequel est bloqué depuis 20 jours.

La vraie visibilité commence quand on arrête de regarder le total et qu'on regarde la forme de la file et ce qui est sur le point de mal tourner.

Étape 1 : où le backlog s'accumule

Avant tout beau tableau de bord, la première radiographie est la répartition du backlog par groupe et par statut. Tout vit dans glpi_tickets ; l'affectation à un groupe, dans glpi_groups_tickets (type 2 = attribué). Les statuts qui comptent : 1 Nouveau, 2/3 En cours, 4 En attente, 5 Résolu, 6 Clos.

-- Backlog ouvert par groupe attribué (type 2 = attribué)
SELECT
  g.completename                    AS groupe,
  COUNT(*)                          AS ouverts,
  SUM(t.status = 1)                 AS nouveaux_non_tries,
  SUM(t.status = 4)                 AS en_attente
FROM glpi_tickets t
JOIN glpi_groups_tickets gt
     ON gt.tickets_id = t.id AND gt.type = 2
JOIN glpi_groups g ON g.id = gt.groups_id
WHERE t.status NOT IN (5, 6)
  AND t.is_deleted = 0
GROUP BY g.id
ORDER BY ouverts DESC;

En quelques secondes, vous voyez quel groupe est surchargé et quelle part du backlog correspond à des tickets neufs que personne n'a triés - le chiffre que le tableau de bord natif masque derrière le total.

Étape 2 : le SLA qui va être dépassé avant de l'être

C'est là que se sépare l'exploitation qui réagit de celle qui anticipe. Quand un SLA correspond au ticket, GLPI écrit l'échéance dans des colonnes dédiées de glpi_tickets : time_to_resolve (échéance de résolution) et time_to_own (échéance de prise en charge). C'est une horloge - on peut regarder ce qui expire dans les prochaines heures, pas seulement ce qui a déjà expiré :

-- Tickets ouverts dont le SLA de résolution expire dans les 4 prochaines heures
SELECT
  t.id,
  t.name,
  t.time_to_resolve,
  TIMESTAMPDIFF(MINUTE, NOW(), t.time_to_resolve) AS minutes_restantes
FROM glpi_tickets t
WHERE t.status NOT IN (4, 5, 6)        -- hors En attente, Résolu, Clos
  AND t.is_deleted = 0
  AND t.time_to_resolve IS NOT NULL
  AND t.time_to_resolve > NOW()
  AND t.time_to_resolve <= NOW() + INTERVAL 4 HOUR
ORDER BY t.time_to_resolve ASC;

Le piège de terrain est dans ce IS NOT NULL. La colonne time_to_resolve n'est renseignée que lorsqu'une règle de SLA a correspondu au ticket à sa création. Un ticket qui n'a correspondu à aucune règle garde une échéance NULL - et disparaît silencieusement du tableau de bord de risque. Autrement dit : les tickets sans SLA, précisément ceux que personne ne mesure, sont invisibles pour toute alerte basée sur une échéance. Quand nous reprenons un environnement, le premier comptage que nous lançons est le nombre de tickets ouverts avec time_to_resolve IS NULL. Nous avons déjà vu un client avec 60% du backlog sans aucun SLA associé : le tableau de bord disait "tout dans les temps" parce que la moitié de la file n'avait tout simplement pas d'échéance.

Étape 3 : le responsable qui n'existe pas

Autre angle mort classique : un ticket attribué à un seul groupe, sans technicien nommé. À l'écran il paraît attribué ; en pratique, personne ne se sent responsable. Ces tickets disparaissent des tableaux de bord personnels ("mes tickets") et vieillissent invisibles. L'attribution à une personne vit dans glpi_tickets_users avec type = 2 :

-- Ouverts attribués à un groupe mais SANS technicien responsable nommé
SELECT COUNT(*) AS sans_responsable
FROM glpi_tickets t
WHERE t.status NOT IN (5, 6)
  AND t.is_deleted = 0
  AND NOT EXISTS (
    SELECT 1 FROM glpi_tickets_users tu
    WHERE tu.tickets_id = t.id AND tu.type = 2
  );

Les couches de visibilité : quoi utiliser pour quoi

Il n'existe pas d'outil unique. Chaque couche résout un problème et a une limite. Voici comment nous décidons où placer chaque indicateur :

CoucheCe qu'elle voit bienTemps réel ?Limite principale
Tableau de bord natif (Centrale)comptages par statut, technicien, catégoriese rafraîchit au chargement de l'écranne prévient pas ; dépend du profil connecté
Recherche enregistrée + alerteun comptage qui franchit un seuil (ex. plus de 5 en attente)s'exécute via cron, envoie un e-mailcompte seulement ; pas de détail riche
SQL de diagnosticn'importe quelle coupe (répartition, stagnation, SLA à échéance)à la demandeexige un accès à la base (lecture seule)
Tableau de bord externe (Metabase/Grafana)historique, tendance, écran muralrafraîchissement planifiéinfrastructure supplémentaire à maintenir

Étape 4 : transformer le diagnostic en alerte automatique

Lancer la requête à la main ne passe pas à l'échelle et, pire, repose sur le fait que quelqu'un pense à regarder. Deux façons de boucler la boucle dans GLPI :

  1. Natif, sans infrastructure supplémentaire : enregistrez la recherche "SLA à échéance" ou "en attente depuis plus de 7 jours" et créez une alerte de recherche enregistrée. Le cron de GLPI exécute la recherche périodiquement et déclenche un e-mail quand le comptage franchit le seuil que vous définissez.
  2. Hors de GLPI, pour un écran mural et l'historique : planifiez la requête de diagnostic dans le cron du système, en lisant l'identifiant depuis un fichier .cnf (chmod 600) pour ne jamais laisser de mot de passe sur la ligne de commande.
# /etc/cron.d/glpi-visibilite  ->  chaque heure ouvrée, en tant que www-data
# Liste les tickets dont le SLA expire dans les 4h pour la file d'astreinte
0 8-18 * * 1-5 www-data /usr/bin/mysql --defaults-file=/etc/glpi/kpi-ro.cnf glpi \
  < /opt/glpi-kpi/sla-a-echeance.sql \
  > /var/log/glpi-kpi/sla-risque-$(date +\%Y-\%m-\%d-\%H).csv 2>&1

Avant de planifier, assurez-vous que le cron de GLPI tourne bien en mode externe (le cron du système appelant front/cron.php) - sinon les échéances de SLA et les alertes natives ne sont même pas recalculées, et vous liriez une horloge arrêtée.

Le tournant, vu de la pratique du support

Quand nous reprenons le GLPI d'un client, la première radiographie n'est jamais le tableau de bord natif - c'est le comptage des tickets attribués à un seul groupe (sans responsable) et des tickets avec un time_to_resolve nul. Dans un cas, 40% du backlog était "attribué" à un groupe de huit personnes et personne ne se sentait responsable ; aucun de ces tickets n'apparaissait sur un tableau de bord personnel et le plus ancien avait 90 jours. Le correctif n'était pas un nouveau tableau de bord - c'était une règle métier imposant un technicien nommé à l'attribution, plus une alerte de SLA à 4 heures de l'échéance. La visibilité n'est pas venue de l'achat d'un outil ; elle est venue du fait de regarder les bons champs.

Erreurs de terrain fréquentes

  • Se fier au total du tableau de bord : il agrège et masque le ticket bloqué ; regardez la répartition par groupe et par ancienneté.
  • Croire que chaque ticket a un SLA : time_to_resolve NULL = hors de toute alerte d'échéance. Comptez d'abord ceux sans SLA.
  • Traiter "attribué à un groupe" comme "a un responsable" : sans une ligne dans glpi_tickets_users avec type = 2, personne n'est responsable.
  • Comparer des entités par le même chiffre : le tableau de bord natif filtre déjà par profil et entité ; le total change selon qui est connecté.
  • Oublier is_deleted = 0 : la corbeille de GLPI ne quitte pas la table et pollue tout comptage.
  • Mesurer avec le cron arrêté : sans le cron externe en marche, les SLA et les alertes natives ne se mettent pas à jour.

Étape suivante

Commencez par les trois comptages de ce guide (sans responsable, sans SLA, SLA à échéance), poussez ces coupes vers un tableau de bord dans Metabase ou Grafana et reliez vos KPI de Service Desk à des alertes. Ainsi la file cesse d'être un chiffre de fin de mois et devient un signal qui se déclenche tant qu'il est encore temps d'agir.

Chez NexTool, cette radiographie de visibilité est le premier livrable quand nous reprenons le support d'un GLPI : nous cartographions les angles morts, branchons les alertes et livrons le tableau de bord. Si vous voulez ce suivi sur votre environnement, découvrez notre service de support et de maintenance.


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

Questions fréquentes

Interrogez glpi_tickets joint à glpi_groups_tickets (type = 2, attribué), en filtrant status NOT IN (5,6) et is_deleted = 0, groupé par groupe. En quelques secondes vous voyez le groupe surchargé et la part de backlog en tickets neufs non triés - détail que le total du tableau de bord natif masque.

Quand une règle de SLA correspond au ticket, GLPI écrit l'échéance dans les colonnes time_to_resolve (résolution) et time_to_own (prise en charge) de glpi_tickets. Ce sont des datetime, on peut donc les comparer à NOW() et trouver ce qui expire dans les prochaines heures, pas seulement ce qui a déjà dépassé.

Parce que time_to_resolve reste NULL quand aucune règle de SLA n'a correspondu au ticket à sa création. Toute alerte basée sur l'échéance ignore ces tickets. L'erreur fréquente est de croire que chaque ticket a un SLA ; comptez d'abord combien de tickets ouverts ont time_to_resolve IS NULL.

Oui. Enregistrez la recherche (par exemple 'SLA à échéance' ou 'en attente depuis plus de 7 jours') et créez une alerte de recherche enregistrée. Le cron de GLPI exécute la recherche périodiquement et envoie un e-mail quand le comptage franchit le seuil défini, sans aucune infrastructure externe.

Pas forcément. L'attribution à un groupe vit dans glpi_groups_tickets ; le responsable nommé vit dans glpi_tickets_users avec type = 2. Un ticket avec seulement un groupe n'a pas de responsable, disparaît des tableaux de bord personnels et vieillit invisible. Imposez un technicien nommé via une règle métier.

Pas pour démarrer. Le tableau de bord natif, les recherches enregistrées avec alerte et le SQL de diagnostic couvrent déjà l'essentiel en temps réel. Grafana et Metabase interviennent quand vous voulez de l'historique, de la tendance et un écran mural - une couche de plus à maintenir, pas un prérequis.

Besoin d'aide ?