Idade Média dos Chamados: O Indicador que Ninguém Mede no GLPI

A idade média dos chamados revela o backlog esquecido que o tempo médio de resolução não enxerga. Veja de onde o número sai no GLPI, por que a média engana, como separar idade de estagnação com SQL e como automatizar a revisão semanal do backlog.

O tempo médio de resolução mede quem já saiu da fila. A idade média dos chamados mede quem ainda está nela - e é aí que mora o backlog esquecido. Este guia mostra de onde o número sai no GLPI, por que a média sozinha engana, como separar idade de estagnação e como transformar isso em uma rotina semanal de revisão de backlog nos ambientes que sustentamos.

O que a idade média mede - e o que ela esconde

A idade média dos chamados é a média de dias entre a abertura e hoje, considerando apenas os chamados que continuam em aberto. Diferente do TMR, que só enxerga o que já foi resolvido, ela fotografa o estado atual da fila. O problema é que a média, sozinha, é um péssimo resumo de uma fila real: um backlog típico é bimodal - dezenas de chamados novos com poucas horas de vida convivem com uma cauda de chamados parados há semanas. A massa de chamados novos puxa a média para baixo e esconde justamente os antigos, que são o que você precisa achar. Por isso a média nunca anda sozinha: ela vem acompanhada da distribuição e da mediana.

De onde o número sai no GLPI

Tudo vive na tabela glpi_tickets. A idade usa a coluna date (data de abertura); o recorte de "em aberto" usa status. Os estados que importam:

  • 1 - Novo (ainda não triado)
  • 2 - Em atendimento (atribuído)
  • 3 - Em atendimento (planejado)
  • 4 - Pendente (aguardando terceiro)
  • 5 - Solucionado e 6 - Fechado (fora do backlog)

O erro mais comum aqui é jogar tudo que não é 5 nem 6 no mesmo bolo. Chamados em Pendente (status 4) estão legitimamente parados aguardando um fornecedor, o cliente ou uma peça - eles inflam a idade média sem que ninguém tenha esquecido nada. Segmentar por status é o primeiro filtro honesto:

-- Idade média por status (segmentar: "Pendente" infla a média)
SELECT
  status,
  ROUND(AVG(DATEDIFF(NOW(), date)), 1) AS idade_media_dias,
  COUNT(*)                             AS total
FROM glpi_tickets
WHERE status NOT IN (5, 6)   -- fora Solucionado e Fechado
  AND is_deleted = 0
GROUP BY status
ORDER BY idade_media_dias DESC;
-- status: 1 Novo, 2 atribuído, 3 planejado, 4 Pendente

Idade não é o mesmo que estagnação

Um chamado aberto há 40 dias mas com uma tarefa registrada ontem é muito diferente de um aberto há 40 dias sem ninguém tocar. A idade (desde a abertura) mede antiguidade; a estagnação (desde a última ação humana) mede abandono - e é a estagnação que aponta o chamado esquecido.

Na sustentação, o erro que já vimos custar caro foi usar date_mod como "última ação". A coluna date_mod do chamado é atualizada por qualquer coisa: uma notificação enviada, um seguidor adicionado, o cron de SLA recalculando prazo, uma regra de negócio disparando. Ou seja, ela dá a ilusão de movimento em chamados que ninguém trabalhou de fato. A última ação humana real está no acompanhamento e na tarefa - glpi_itilfollowups e glpi_tickettasks. Quando trocamos date_mod pela data máxima dessas duas tabelas, a lista de estagnados de um cliente pulou de 3 para 17 chamados: os outros 14 pareciam vivos só porque uma automação encostava neles todo dia.

-- Estagnação real: dias desde a última interação humana
-- date_mod não serve (notificações, seguidores e cron o atualizam)
SELECT
  t.id,
  t.name,
  DATEDIFF(NOW(), t.date) AS idade_dias,
  DATEDIFF(NOW(), GREATEST(
      t.date,
      COALESCE(MAX(f.date), t.date),
      COALESCE(MAX(k.date), t.date)
  ))                       AS parado_ha_dias
FROM glpi_tickets t
LEFT JOIN glpi_itilfollowups f
       ON f.itemtype = 'Ticket' AND f.items_id = t.id
LEFT JOIN glpi_tickettasks k
       ON k.tickets_id = t.id
WHERE t.status NOT IN (4, 5, 6)   -- fora Pendente, Solucionado, Fechado
  AND t.is_deleted = 0
GROUP BY t.id, t.name, t.date
HAVING parado_ha_dias >= 7
ORDER BY parado_ha_dias DESC;

Distribuição, não só a média

Antes de reagir a uma média que subiu, veja a forma da fila. A consulta abaixo quebra o backlog em faixas de idade e revela a cauda longa que a média achata:

-- Distribuição do backlog por faixa de idade
SELECT
  CASE
    WHEN DATEDIFF(NOW(), date) <= 3  THEN '0-3 dias'
    WHEN DATEDIFF(NOW(), date) <= 7  THEN '3-7 dias'
    WHEN DATEDIFF(NOW(), date) <= 15 THEN '7-15 dias'
    WHEN DATEDIFF(NOW(), date) <= 30 THEN '15-30 dias'
    ELSE '30+ dias'
  END        AS faixa,
  COUNT(*)   AS chamados
FROM glpi_tickets
WHERE status NOT IN (4, 5, 6)
  AND is_deleted = 0
GROUP BY faixa
ORDER BY MIN(DATEDIFF(NOW(), date));

Como referência honesta de faixa (dias corridos, não dias úteis): abaixo de 3 dias é saudável, 3 a 7 dias é aceitável, 7 a 15 dias liga o alerta e acima de 15 dias pede revisão chamado a chamado. Não são metas universais - o número justo depende do contrato e do tipo de operação.

Do número à ação: matriz de decisão

Idade alta não é um problema; é um sintoma com várias causas. O que resolve é ler o sinal técnico e classificar antes de agir:

Sinal técnicoClassificaçãoAção
status 1 (Novo) e idade > 3 diasNão triadoAtribuir dono/grupo agora
parado_ha_dias alto, sem seguidor externoEsquecidoReatribuir e cobrar
status 4 (Pendente) com retorno vencidoBloqueio expiradoRecobrar o terceiro ou reabrir
idade alta e parado_ha_dias baixoLegítimo (complexo)Revisar SLA / escopo
idade alta e categoria recorrenteCandidato a problemaAbrir Problema / artigo de KB

Um caso silencioso que vale destacar: chamados presos em Novo porque a regra de negócio de atribuição não casou com a categoria e nunca colocou um grupo. Eles envelhecem invisíveis - somem dos painéis por grupo e só aparecem quando você olha a idade média sem filtro de grupo.

Automatizando a revisão semanal

Rodar consulta na mão não escala. Salvamos a consulta de estagnação em um arquivo .sql e agendamos no cron do sistema, lendo credenciais de um arquivo .cnf (chmod 600) para nunca deixar senha na linha de comando. O resultado é um CSV semanal que vira a pauta da revisão de backlog:

# /etc/cron.d/glpi-idade  ->  toda segunda 07:30, como www-data
# Gera a lista de chamados estagnados (7+ dias) para a revisão de backlog
30 7 * * 1 www-data /usr/bin/mysql --defaults-file=/etc/glpi/kpi-ro.cnf glpi \
  < /opt/glpi-kpi/estagnados.sql \
  > /var/log/glpi-kpi/estagnados-$(date +\%Y-\%m-\%d).csv 2>&1

Erros comuns de campo

  • Olhar só a média: ela achata a cauda. Sempre acompanhe a distribuição e, quando possível, a mediana.
  • Misturar Pendente no bolo: status 4 é espera legítima; sozinho ele levanta a média e gera alarme falso.
  • Usar date_mod como última ação: automações o atualizam. Use as datas de acompanhamento e de tarefa.
  • Comparar entidades com calendários diferentes: DATEDIFF conta dias corridos; entidades com jornadas distintas não são comparáveis uma a uma.
  • Esquecer is_deleted = 0: a lixeira do GLPI não some da tabela e contamina qualquer média.

Próximo passo

Combine a idade média com os demais KPIs de Service Desk e monte tudo em um painel no Metabase ou Grafana com filtro por entidade e grupo. Assim a idade deixa de ser um número no fim do mês e vira um alerta que dispara enquanto ainda dá para agir.

Na NexTool, idade e estagnação do backlog entram no relatório mensal de sustentação que entregamos aos clientes, junto com a lista de chamados a recuperar. Se quiser esse acompanhamento no seu GLPI, conheça nosso serviço de suporte e sustentação.


Este conteúdo foi produzido com auxílio de inteligência artificial e revisado pela equipe Nextool Solutions.

Perguntas Frequentes

É a média de dias entre a data de abertura (coluna date) e hoje, contando apenas chamados em aberto (status diferente de 5 Solucionado e 6 Fechado). Ela fotografa o estado atual da fila, ao contrário do tempo médio de resolução, que só mede chamados já encerrados.

Porque o backlog costuma ser bimodal: muitos chamados novos convivem com uma cauda de antigos. A massa de novos puxa a média para baixo e esconde os poucos parados há semanas. Por isso ela precisa vir acompanhada da distribuição por faixa e, quando possível, da mediana.

Idade é o tempo desde a abertura; estagnação é o tempo desde a última ação humana (acompanhamento ou tarefa). Um chamado antigo mas trabalhado ontem não está esquecido; um antigo e sem interação está. A estagnação é o sinal que aponta o abandono.

Porque date_mod é atualizado por notificações, adição de seguidores, cron de SLA e regras de negócio - movimentos automáticos que não são trabalho humano. Use a data máxima em glpi_itilfollowups e glpi_tickettasks para saber quando o chamado foi de fato tocado por alguém.

Como faixa de referência em dias corridos: abaixo de 3 dias é saudável, 3 a 7 aceitável, 7 a 15 acende o alerta e acima de 15 pede revisão chamado a chamado. Não é meta universal - depende do contrato, do calendário de trabalho e do tipo de operação.

Não diretamente. O módulo de Estatísticas ajuda em consultas pontuais, mas não guarda a série histórica nem separa idade de estagnação. Para isso usa-se SQL com usuário somente-leitura ou um painel no Metabase/Grafana alimentado por essas consultas.

Precisa de ajuda?