Erros comuns em Prometheus que você deve evitar
Guia técnico objetivo para melhorar a observabilidade: métricas, scraping, alertas e consultas PromQL, com foco em eficiência e escalabilidade.
1) Padronização de nomes de métricas e labels
Um erro recorrente é a ausência de convenções de nomenclatura e a utilização indiscriminada de labels de alto cardinalidade. Métricas mal nomeadas dificultam filtragem, compreensão e a escalabilidade de consultas em Grafana ou outras plataformas. Estabelecer padrões facilita a vida da equipe, reduz ruído e melhora a performance do data plane.
- Defina um conjunto mínimo de labels estáveis para filtragem (por exemplo: service, region, instance) e evite labels com IDs de usuário, session_id ou caminhos dinâmicos.
- Use nomes de métricas consistentes: sufixos como _total para contadores, _gauge para valores que variam livremente, e padrões como myservice_request_total.
- Considere normalizar rotas e endpoints para reduzir cardinalidade quando possível (por exemplo, endpoint=”/api/v1/resource” em vez de “/api/v1/resource/123”).
- Mantenha consistência entre serviços: o mesmo tipo de métrica deve seguir o mesmo conjunto de labels em toda a base observável.
Exemplos:
- Errado: http_requests_total{method=”GET”, path=”/api/v1/resource/12345″, status=”200″}
- Certo: http_requests_total{service=”billing”, method=”GET”, status=”200″, endpoint=”/api/v1/resource”}
2) Configuração de scraping e intervalos
A configuração de scraping impacta diretamente na carga do Prometheus e na qualidade dos dados. Intervalos muito curtos em serviços com métricas de baixa cardinalidade geram ruído desnecessário, enquanto intervalos excessivamente longos podem perder picos de latência. Alinhe scrape_interval, scrape_timeout e as descobertas de serviço com a criticidade das métricas.
- Ajuste o scrape_interval conforme a criticidade e a taxa de emissão das métricas. Para serviços de alto tráfego, 15s a 30s costuma funcionar bem; para métricas menos dinâmicas, 1m ou mais é aceitável.
- Defina scrape_timeout menor que o interval para evitar falhas de scrape não gerenciadas. Ex.: scrape_interval: 30s; scrape_timeout: 10s.
- Use descobertas de serviço estáveis (Kubernetes, Consul, etc.) com rótulos consistentes e evite endpoints instáveis que gerem métricas raras.
- Se possível, utilize TLS/MTLS e autenticação para endpoints sensíveis e mantenha path padrão (/metrics) ou ajuste conforme necessário.
Dicas rápidas: agrupe métricas com criticidade alta em scrapes mais frequentes e reduza a frequência para métricas administrativas menos relevantes.
3) Alertas: regras mal definidas e severidade
Alertas mal calibrados geram ruído, dificultam a detecção de incidentes reais e sobrecarregam equipes. Planeje regras com neutralidade de falhas, tempo de espera (for) adequado e rotas de resolução claras no Alertmanager.
- Evite regras simples como “se erro > 0”, prefira taxas com janela temporal e coerção de falhas, por exemplo 5xx / total em 5 minutos.
- Avalie o for para evitar notificações de ruídos imediatos; use valores proporcionais ao tempo de resposta esperado pelo serviço.
- Utilize labels consistentes e o roteamento do Alertmanager para agrupar incidentes por serviço, ambiente e prioridade.
- Documente as regras com descrições claras, para facilitar a operação e auditoria.
Exemplo de regra mais robusta (PromQL):
ALERT HighErrorRate
IF sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])) > 0.05
FOR 10m
LABELS { severity="critical", service="api" }
ANNOTATIONS {
summary = "Alto percentual de erros 5xx no serviço API",
description = "A taxa de erros 5xx excedeu 5% nos últimos 5 minutos por mais de 10 minutos."
}
Essa abordagem evita notificações falsas e facilita a priorização no time de SRE.
4) Consultas PromQL eficientes e dashboards confiáveis
Consultas PromQL mal elaboradas podem se tornar gargalos, especialmente em grandes ambientes com alta cardinalidade. Foque em previsões estáveis, usando regras de gravação (recording rules) para pré-computar agregações caras e reduzir o custo de dashboards em Grafana.
- Prefira consultas com filtros explícitos (por exemplo, service, region) para evitar varreduras de grandes conjuntos de rótulos.
- Use windowing adequado: rate() e increase() requerem janelas que reflitam o comportamento da métrica; janelas muito curtas podem ser ruidosas, janelas muito longas podem mascarar picos.
- Crie recording rules para métricas compostas (ex.: request_rate_per_service) e reuse-as nos dashboards.
- Avalie cardinalidade: rótulos com muitas possibilidades geram muitos dados preservar; reduza rótulos desnecessários.
Exemplo de melhoria de PromQL (antes e depois):
# Mau exemplo (sem filtro de serviço, janela muito curta)
sum(rate(http_requests_total[1m]))
# Melhor exemplo (filtro por serviço e janela adequada)
sum by (service) (
rate(http_requests_total{service="api-gateway"}[5m])
)
# Taxa de erro de serviço (usando filtragem explícita)
sum by (service) (
rate(http_requests_total{service="api-gateway", status=~"5.."}[5m])
) / sum by (service) (
rate(http_requests_total{service="api-gateway"}[5m])
)
Observação: para consultas repetitivas, implemente recording rules como api_gateway_request_rate_5m para reduzir carga durante a correção de problemas e o tuning de dashboards.
Gostou do conteúdo?
Explore mais artigos técnicos para aprimorar suas práticas de observabilidade e Prometheus.
Observabilidade: fundamentos
Prometheus: práticas avançadas
Dashboards no Grafana
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!