Grafana: dashboards que hablan con la dirección y la operación

Cómo NexTool implanta y da soporte a Grafana junto a GLPI: arquitectura con fuente de datos de solo lectura, consulta real de SLA incumplido, separación de panel operativo y ejecutivo y regla de alerta sin duplicidad.

Grafana solo aporta valor cuando los paneles responden a las preguntas de quien opera y de quien decide. En el soporte de GLPI e infraestructura que ofrecemos a clientes B2B, es la capa de visualización que colocamos junto al service desk: lee métricas de SLA y tickets directamente de la base de datos de GLPI, las cruza con series de disponibilidad que llegan de Zabbix o Prometheus y lo muestra todo en una pantalla que el NOC y la dirección pueden interpretar sin exportar una hoja de cálculo.

Cómo posicionamos Grafana junto a GLPI

La arquitectura que usamos es deliberadamente ligera: un contenedor Grafana en el mismo host que ya ejecuta GLPI, detrás del mismo proxy inverso con TLS, consumiendo tres fuentes de datos distintas. La primera es el propio MariaDB/MySQL de GLPI, mediante un usuario de solo lectura, para indicadores de service desk (tickets abiertos, SLA incumplido, tiempo medio de respuesta). La segunda es Zabbix o Prometheus, para disponibilidad y capacidad de infraestructura. La tercera, cuando el cliente tiene el plugin NexTool, son las métricas de sincronización e integración que expone el ecosistema.

El error común que vemos en quien lo monta por su cuenta es apuntar Grafana al usuario administrativo de GLPI. Nunca lo hacemos. Un panel solo necesita leer, y una fuente de datos comprometida no puede convertirse en una puerta de escritura a la base de producción. Creamos un usuario dedicado con SELECT restringido a las tablas de interés, y Grafana nunca recibe más permiso del que necesita para dibujar un gráfico.

Artefacto: usuario de solo lectura y fuente de datos

Este es el par que aprovisionamos en cada implantación. Primero el usuario de lectura en la base de GLPI, con privilegio mínimo:

-- usuario de solo lectura para que Grafana lea GLPI
CREATE USER 'grafana_ro'@'%' IDENTIFIED BY '${CONTRASENA_FUERTE}';
GRANT SELECT ON glpi.glpi_tickets           TO 'grafana_ro'@'%';
GRANT SELECT ON glpi.glpi_slas              TO 'grafana_ro'@'%';
GRANT SELECT ON glpi.glpi_tickets_users     TO 'grafana_ro'@'%';
GRANT SELECT ON glpi.glpi_itilcategories    TO 'grafana_ro'@'%';
FLUSH PRIVILEGES;
-- nada de GRANT ALL: el panel solo dibuja, nunca escribe

Y el aprovisionamiento de la fuente de datos por archivo, para que el panel arranque versionado junto al contenedor y no dependa de un clic manual en la interfaz:

# /etc/grafana/provisioning/datasources/glpi.yaml
apiVersion: 1
datasources:
  - name: GLPI (solo lectura)
    type: mysql
    access: proxy
    url: glpidb:3306
    database: glpi
    user: grafana_ro
    secureJsonData:
      password: ${CONTRASENA_FUERTE}   # inyectada por variable de entorno
    jsonData:
      maxOpenConns: 5                  # no ahoga la base de produccion
      timeInterval: "1m"

Consulta real: SLA incumplido por categoría

Un panel ejecutivo que siempre entregamos es el de tickets con SLA de resolución vencido, agrupados por categoría. Es la vista que la dirección abre el lunes por la mañana. La consulta se ejecuta directamente sobre GLPI, respetando el formato de serie temporal que Grafana espera:

SELECT
  c.completename                             AS categoria,
  COUNT(*)                                   AS tickets_incumplidos
FROM glpi_tickets t
JOIN glpi_itilcategories c ON c.id = t.itilcategories_id
WHERE t.status NOT IN (5, 6)                 -- excluye resuelto y cerrado
  AND t.time_to_resolve IS NOT NULL
  AND t.time_to_resolve < NOW()             -- el plazo de resolucion ya vencio
  AND t.is_deleted = 0
GROUP BY c.completename
ORDER BY tickets_incumplidos DESC;

Un detalle que solo sabe quien opera GLPI: los estados 5 y 6 son resuelto y cerrado en el esquema por defecto, y is_deleted = 0 es obligatorio porque GLPI hace borrado lógico - ignorar esa columna infla el número con tickets que ya están en la papelera. En soporte ya hemos visto un panel de terceros reportar el doble de SLA incumplido solo por olvidar el is_deleted. Es el tipo de fallo que socava la confianza de la dirección en todo el dashboard.

Dashboard por audiencia: lo que separamos

No mezclamos NOC y dirección en la misma pantalla. La operación necesita granularidad para actuar ahora; la dirección necesita tendencia para decidir. La separación que estandarizamos:

DimensiónPanel operativo (NOC)Panel ejecutivo (dirección)
GranularidadPor servicio, host y ticketPor entidad, contrato y periodo
Ventana típicaÚltimas horas / tiempo realSemana, mes, trimestre
Métrica centralLatencia, errores, cola de ticketsCumplimiento de SLA, tendencia, capacidad
Acción esperadaIntervenir en el incidentePriorizar, contratar, renegociar
Frecuencia de refresco30s a 1min15min a 1h

Alertas: dónde disparar sin duplicar

La regla que aplicamos es simple y evita el peor problema de observabilidad: el mismo evento alertando por dos caminos. La disponibilidad y la capacidad de infraestructura alertan en la fuente (Zabbix o Prometheus), que ya tiene el histórico y el contexto del host. Grafana alerta solo sobre indicadores de negocio que únicamente existen en el cruce de fuentes - por ejemplo, el SLA de un contrato concreto a punto de incumplirse. Cada panel que entregamos lleva, en su descripción, la definición de la métrica y la acción esperada cuando hay una desviación. Un panel sin esa documentación se convierte en adorno, y nadie mira un adorno.

Otro punto de soporte: limitamos maxOpenConns en la fuente de datos precisamente porque un dashboard ejecutivo con refresco agresivo y varias consultas pesadas puede abrir demasiadas conexiones y competir con el GLPI de producción. Ya hemos corregido lentitud de tickets que el equipo atribuía a GLPI y era, en realidad, un Grafana mal configurado agotando el pool de conexiones de la base.

Cuando el cliente usa el plugin NexTool, además mostramos en el mismo dashboard las métricas de sincronización de los módulos - estado de integración, colas de webhook y salud de los jobs - de modo que la operación de service desk y la salud del ecosistema quedan en la misma lectura, sin cambiar de herramienta.

Si tu operación de GLPI todavía depende de exportar una hoja de cálculo para saber cómo va el SLA, NexTool implanta y da soporte a esta capa de observabilidad junto a tu service desk, con los paneles ya integrados con GLPI y tu infraestructura. Habla con nosotros sobre soporte de GLPI con observabilidad integrada.


Este contenido se ha producido con ayuda de inteligencia artificial y ha sido revisado por el equipo de Nextool Solutions.

Preguntas Frecuentes

Configuramos una fuente de datos MySQL/MariaDB que apunta a la base de GLPI con un usuario de solo lectura (solo SELECT en las tablas de interés). Grafana consulta tablas como glpi_tickets y glpi_slas y construye los paneles, sin recibir nunca permiso de escritura en la base de producción.

Porque un panel solo necesita leer. Si la fuente de datos se compromete, un usuario administrativo se convierte en una puerta de escritura a la base de producción. Creamos un usuario dedicado con SELECT restringido a las tablas necesarias, siguiendo el principio de privilegio mínimo.

La disponibilidad y la capacidad de infraestructura deben alertar en la fuente, que tiene el histórico y el contexto del host. Grafana debe alertar solo sobre indicadores de negocio que únicamente existen en el cruce de fuentes, como el SLA de un contrato concreto. Así se evita que el mismo evento alerte por dos caminos.

Porque GLPI hace borrado lógico: los tickets eliminados permanecen en la tabla con is_deleted = 1. Sin el filtro is_deleted = 0, el panel cuenta tickets que ya están en la papelera e infla el número de SLA incumplido, socavando la confianza de la dirección en el dashboard.

Puede, si un panel con refresco agresivo abre demasiadas conexiones y compite con el GLPI de producción por el pool de la base. Por eso limitamos maxOpenConns en la fuente de datos. Ya hemos corregido lentitud de tickets que el equipo atribuía a GLPI y era, en realidad, un Grafana mal configurado.

?Necesitas ayuda?