Monitora Chi ha Visualizzato Ogni Ticket in GLPI con Ticket Tracker

In GLPI standard non esiste alcuna registrazione di lettura. Il modulo gratuito Ticket Tracker registra ogni visualizzazione di ticket - conteggio, prima e ultima lettura e un log di accessi per utente - e fornisce persino le query SQL per trovare i ticket che il responsabile non ha mai aperto.

In GLPI standard non esiste alcuna registrazione di lettura: la cronologia del ticket conserva ciò che è cambiato, mai chi lo ha semplicemente aperto e letto. Nella manutenzione di parchi GLPI di clienti, questo diventa il classico stallo del "il tecnico non ha nemmeno guardato il ticket" contro "sì, l'ho letto" - e senza un dato oggettivo è la parola di uno contro quella dell'altro. Il modulo gratuito Ticket Tracker colma questa lacuna registrando ogni visualizzazione di ticket. Questa guida mostra come archivia i dati, come configurarlo senza gonfiare i contatori e tre query SQL che rispondono "chi ha letto cosa" all'istante.

Perché GLPI non sa chi ha letto un ticket

La cronologia nativa (glpi_logs) registra solo le modifiche: creazione, cambio di stato, nuovo followup, riassegnazione del tecnico. Aprire il modulo e leggerlo non modifica alcun campo, quindi non produce alcuna riga. Nel cuore di GLPI non esiste un evento di "visualizzazione". Ticket Tracker lo risolve agganciandosi al momento in cui il modulo del ticket viene renderizzato (l'hook postShowItem del Ticket): ogni volta che una sessione autenticata mostra un ticket, il modulo registra la visualizzazione. Senza azione manuale, senza un nuovo campo nel modulo.

I due livelli di registrazione: riepilogo e log

Il modulo scrive su due tabelle con scopi distinti. Quella di riepilogo risponde "quante volte e quando"; quella di log risponde "ogni accesso, uno per uno":

-- Riepilogo per (ticket, utente): una riga, aggiornata a ogni accesso.
CREATE TABLE `glpi_plugin_nextool_tickettracker_views` (
  `id`         int unsigned NOT NULL AUTO_INCREMENT,
  `tickets_id` int unsigned NOT NULL,
  `users_id`   int unsigned NOT NULL,
  `view_count` int unsigned NOT NULL DEFAULT 1,
  `first_view` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_view`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_ticket_user` (`tickets_id`, `users_id`)
);

-- Log dettagliato: una riga per ogni accesso individuale.
CREATE TABLE `glpi_plugin_nextool_tickettracker_viewlog` (
  `id`         int unsigned NOT NULL AUTO_INCREMENT,
  `tickets_id` int unsigned NOT NULL,
  `users_id`   int unsigned NOT NULL,
  `view_date`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

La chiave UNIQUE (tickets_id, users_id) è il cuore della tabella di riepilogo: ogni coppia ticket/utente ha esattamente una riga. La scrittura usa INSERT ... ON DUPLICATE KEY UPDATE view_count = view_count + 1, un upsert atomico - due accessi simultanei dello stesso utente non creano righe duplicate né perdono il conteggio. La scheda "Visualizzazioni" nel ticket legge il riepilogo (tabella con tutti i lettori, conteggio, prima e ultima lettura) e offre una cascata espandibile che estrae dal log ogni accesso individuale, con data e ora.

Attivazione e checklist di configurazione

Il modulo è gratuito e si attiva dal catalogo NexTool. Una volta abilitato, la configurazione si trova in Moduli > Ticket Tracker, scheda Funzionalità:

  1. Modulo attivo - lo stesso interruttore della pagina Moduli. Spento, non viene tracciato nulla.
  2. Tracciamento attivo (tracking_enabled) - attiva la registrazione delle visualizzazioni. Può restare attivo con la scheda nascosta, se vuoi raccogliere senza esporre.
  3. Mostra scheda sul ticket (show_tab_on_ticket) - mostra o nasconde la scheda "Visualizzazioni" nel modulo del ticket.
  4. Intervallo minimo (s) (min_interval_seconds, predefinito 60) - una finestra di debounce: gli accessi dello stesso utente allo stesso ticket entro quell'intervallo contano come uno.
  5. Ignorati (scheda Permessi aggiuntivi) - utenti, profili o gruppi che visualizzano senza essere tracciati. Tutto vuoto = ogni accesso conta.

L'errore di campo che gonfia (o azzera) i contatori

L'errore comune è azzerare l'intervallo minimo pensando "più è granulare, meglio è". L'hook scatta a ogni render del modulo - inclusi ricaricamenti, navigazione indietro e riaperture della scheda. Con min_interval_seconds = 0, un tecnico che lascia il ticket aperto e aggiorna tre volte diventa "tre letture", e view_count perde il senso di "quante volte è davvero tornato sull'argomento". Il valore predefinito di 60 secondi esiste proprio per comprimere la raffica di ricaricamenti in un'unica lettura. Usa 0 solo per una diagnosi puntuale e torna poi al valore predefinito.

Il secondo errore è più sottile e ci siamo imbattuti in esso presso un cliente: fino alla versione 1.2.0 del modulo, la registrazione dipendeva dal permesso di vedere la scheda Visualizzazioni - cioè venivano contati solo i profili amministrativi. Il richiedente e gli osservatori aprivano il ticket e non veniva registrato nulla, quindi la base sotto-riportava proprio chi conta di più in una disputa di SLA. Abbiamo disaccoppiato la registrazione dal permesso di vedere la scheda: oggi qualsiasi sessione autenticata che renderizza il ticket viene conteggiata - richiedente, osservatore o tecnico - indipendentemente dal profilo. Se usi una versione precedente, aggiorna prima di fidarti dei numeri.

Matrice di decisione: intervallo e ignorati per scenario

La regolazione giusta dipende da cosa vuoi dimostrare. La matrice che usiamo in fase di progettazione:

Scenario operativoTracciamentoIntervallo minimo (s)Chi mettere in "ignorati"
Audit di lettura / SLA (predefinito)Attivo60Nessuno
Parco con auto-refresh o pannello a muroAttivo180 a 300Account di integrazione / bot
Supervisione che non deve gonfiare il contatoreAttivo60Profilo di gestori / auditor
Diagnosi puntuale (contare ogni accesso)Attivo0 (temporaneo)Nessuno

Tre query SQL che rispondono all'istante

La scheda risolve il caso per caso; per una vista di parco, vai dritto al database. Ticket aperti assegnati che il tecnico responsabile non ha ancora aperto (type = 2 in glpi_tickets_users è il tecnico assegnato):

-- Ticket aperti assegnati che il tecnico responsabile non ha MAI visualizzato.
SELECT t.id AS ticket, t.name AS titolo, u.name AS tecnico, t.date AS aperto_il
FROM glpi_tickets t
JOIN glpi_tickets_users tu ON tu.tickets_id = t.id AND tu.type = 2
JOIN glpi_users u ON u.id = tu.users_id
LEFT JOIN glpi_plugin_nextool_tickettracker_views v
       ON v.tickets_id = t.id AND v.users_id = tu.users_id
WHERE t.is_deleted = 0
  AND t.status IN (1, 2, 3, 4)   -- nuovo, assegnato, pianificato, in attesa
  AND v.id IS NULL               -- nessuna lettura registrata dal tecnico
ORDER BY t.date ASC;

Latenza di lettura - quanti minuti il ticket è rimasto aperto fino alla prima lettura del tecnico assegnato. È la metrica che precede la prima risposta e spesso spiega uno SLA sforato:

-- Minuti tra l'apertura e la 1a lettura del tecnico assegnato.
SELECT t.id AS ticket,
       TIMESTAMPDIFF(MINUTE, t.date, v.first_view) AS minuti_alla_1a_lettura
FROM glpi_tickets t
JOIN glpi_tickets_users tu ON tu.tickets_id = t.id AND tu.type = 2
JOIN glpi_plugin_nextool_tickettracker_views v
       ON v.tickets_id = t.id AND v.users_id = tu.users_id
WHERE t.is_deleted = 0
ORDER BY minuti_alla_1a_lettura DESC;

I lettori più attivi di un ticket specifico, dal riepilogo, per sapere chi lo segue davvero (sostituisci 12345 con l'ID del ticket):

-- Chi ha aperto di più il ticket 12345, dal più ricorrente al meno.
SELECT u.name AS utente, v.view_count, v.first_view, v.last_view
FROM glpi_plugin_nextool_tickettracker_views v
JOIN glpi_users u ON u.id = v.users_id
WHERE v.tickets_id = 12345
ORDER BY v.view_count DESC;

Leggere non è rispondere: cosa dimostra il contatore

Il dato è potente, ma ha un limite onesto: dimostra che il modulo è stato renderizzato per quell'utente, non che la persona l'ha letto con attenzione né che ha agito. Un view_count alto senza followup è un segnale giallo - qualcuno apre e chiude senza risolvere. Un ticket con zero visualizzazioni del responsabile mentre lo SLA corre è un segnale rosso - nessuno l'ha nemmeno guardato. Nella manutenzione, il valore reale non è sorvegliare il tecnico, è colmare il vuoto probatorio: quando il cliente chiede "perché questo ticket è rimasto fermo tre giorni?", la risposta smette di essere un'opinione e ottiene un timbro con data e ora.

Ti serve una visibilità reale sull'assistenza nel tuo GLPI, con i moduli giusti attivati e regolati sul tuo flusso? Scopri il servizio di manutenzione GLPI di NexTool.


Questo contenuto è stato prodotto con l'ausilio dell'intelligenza artificiale e revisionato dal team Nextool Solutions.

Domande Frequenti

No. La cronologia (glpi_logs) registra solo le modifiche ai campi - stato, followup, riassegnazione del tecnico. Aprire e leggere non cambia nulla, quindi non esiste alcuna registrazione nativa di visualizzazione. Ticket Tracker colma la lacuna registrando ogni render del modulo del ticket.

Non nella versione attuale. Il log dettagliato memorizza ticket, utente e data/ora di ogni accesso; l'identificazione avviene tramite l'utente autenticato di GLPI, non tramite IP. Per un audit per persona, users_id è più affidabile dell'IP, che cambia con VPN, NAT e proxy.

No, se l'intervallo minimo è impostato. Il valore predefinito di 60 secondi fa sì che gli accessi dello stesso utente allo stesso ticket entro la finestra contino come uno. Solo con intervallo 0 ogni aggiornamento diventa una lettura - usa 0 solo per la diagnosi e torna al valore predefinito.

Aggiungi l'utente, il profilo o il gruppo alla lista degli "ignorati" (scheda Permessi aggiuntivi). Chi rientra visualizza normalmente, ma l'accesso non viene registrato - utile per la supervisione e per gli account di integrazione.

Unisci glpi_tickets_users (type = 2, tecnico assegnato) alla tabella di riepilogo del modulo tramite LEFT JOIN e filtra v.id IS NULL. La query dell'articolo elenca esattamente i ticket aperti, assegnati e mai letti dal responsabile.

Sì. È un modulo gratuito di NexTool, disponibile per GLPI 10 e 11, e si attiva direttamente dal catalogo, senza configurazione aggiuntiva obbligatoria.

Hai bisogno di aiuto?