Voltar ao portfólio
EN PT ES
Estudo de caso · Observabilidade

Modernizando uma stack de observabilidade com Grafana e Prometheus

A stack tinha ficado para trás: o Grafana além do fim de vida (end-of-life), o Prometheus com oito versões minor de atraso e os dashboards pesados levando dezenas de segundos para renderizar. Veja como levei ambos ao LTS e deixei esses dashboards cerca de 30 vezes mais rápidos, sem perda de dados e sem tocar nos alertas.

Por Vitor Schiavo Atualizado em outubro de 2026 ~7 min de leitura
A solução em resumoMantenha o monitoramento útil durante upgrades de versão major.
Fontes de métricasPreservar a cobertura de scrape
PrometheusFazer upgrade e ajustar as regras
GrafanaValidar queries e visualizações

O trabalho combinou upgrades de versão, recording rules e validação operacional.

Contribuição em resumo

Minha responsabilidade
Upgrades faseados do monitoramento, limpeza de dashboards e trabalho com recording rules.
Escopo
Modernização do Grafana e do Prometheus com backups e validação operacional.
Colaboração & limites
Mantive a stack de monitoramento e verifiquei o comportamento de queries e dashboards ao longo das mudanças de versão.
Resultado
Atualizei a stack de monitoramento e preservei os dashboards migrados; este caso não estabelece uma melhoria de latency em toda a frota.

Stacks de observabilidade apodrecem em silêncio. Os upgrades parecem arriscados, então são adiados, e um dia você está num Grafana em fim de vida, com dashboards em que ninguém confia e queries que levam meio minuto. Este é um relato de como trouxe uma dessas stacks de volta ao estado atual: duas versões major do Grafana, uma atualização de LTS no Prometheus e as recording rules que foram a verdadeira vitória.

Grafana: do fim de vida ao 11.6 LTS

O Grafana estava numa release em fim de vida, a uma versão major de distância de o runtime de plugins Angular ser removido por completo. Levei-o ao 11.6 LTS de um jeito deliberado e reversível:

A verdadeira vitória: recording rules do Prometheus

Os dashboards pesados de ingress eram sofríveis: de 8 a 33 segundos por render. A causa era o histogram_quantile() sendo recalculado a partir de dezenas de milhares de séries de bucket (cerca de 57k) a cada atualização. A correção é clássica e fácil de esquecer de usar: recording rules.

Adicionei três recording rules por ambiente que pré-agregam o P50, o P90 e o P99 do histograma de duração de requisições, e apontei os dashboards para as séries pré-computadas em vez dos buckets brutos.

AmbienteAntesDepoisAceleração
Produção (cardinalidade maior)8 a 33 s~0.66 s~30×
Sandbox (cardinalidade menor)3.5 a 9 s~0.66 s~5 a 13×
~30×dashboards mais rápidos
0.66 stempo de query consistente
LTSGrafana 11.6 + Prom 2.53
0dados perdidos ou alertas alterados

Prometheus: 2.45 to 2.53 LTS

Atualizei o Prometheus em oito versões minor até o 2.53 LTS, de forma faseada e segura: primeiro o cluster de sandbox, depois a produção após um período de observação de 24 horas. Uma restrição do mundo real que vale mencionar: a stack roda o fork gerenciado (GMP) do Prometheus porque os alertas e dashboards do Cloud Monitoring do ambiente dependem do exporter embutido dele. O Prometheus upstream já está na 3.x, mas o fork gerenciado vai no máximo até o 2.53 LTS, então esse era o teto. Saber em que fork você está, e por quê, é metade do upgrade.

Um refactor de config que vale a pena

As configs do Prometheus por ambiente tinham divergido em ordens de seção diferentes, o que tornava trabalhoso fazer o diff de um ambiente contra outro. Reordenei-as para uma única estrutura canônica (persistent volumes, config, RBAC, StatefulSet, services, ingress). Nenhuma mudança funcional, mas agora um diff lado a lado mostra só as diferenças que importam.

Um bug latente, encontrado de passagem

Enquanto validava as recording rules, encontrei um painel exibindo "No data" sobre uma query que claramente tinha dados. A causa era uma config de thresholds do Grafana (thresholdsStyle: line+area) com um passo de threshold final sem o seu valor. O tipo de bug que se esconde por meses até alguém olhar de perto o painel certo.

O que eu diria a quem está começando isto

Decisões e próximos passos

Uma visão retrospectiva da abordagem e seus limites. A próxima melhoria é uma proposta, não um resultado entregue.

Alternativa e justificativa

Um único upgrade grande reduz etapas, mas combina modos de falha. Mudanças faseadas e backups tornam as incompatibilidades mais fáceis de isolar.

Trade-off

Recording rules reduzem o trabalho repetido de query, mas introduzem definições adicionais cujo significado e atualidade precisam ser mantidos.

O que eu melhoraria em seguida

Próxima melhoria: manter queries de dashboard representativas e testes de regras em uma suíte repetível de aceitação de upgrade.