O que são Métricas Customizadas e Por Que Elas Importam
No ecossistema moderno de observabilidade, confiar exclusivamente nas métricas padrão do sistema operacional — como uso de CPU, memória RAM e I/O de disco — é uma estratégia insuficiente para garantir a saúde real das aplicações. Essas métricas infraestruturais dizem apenas se o servidor está "vivo", mas não revelam se a aplicação está funcionando corretamente sob a perspectiva do usuário final ou do negócio.
Muitas vezes, o gargalo de desempenho não reside na infraestrutura subjacente, mas sim na lógica de negócios, em integrações externas lentas ou em vazamentos de memória dentro do código. É aqui que as métricas customizadas se tornam essenciais: são dados específicos coletados diretamente da sua aplicação que revelam como o software performa sob diferentes cargas e cenários. Elas permitem capturar KPIs (Indicadores-Chave de Desempenho) de domínio, como carrinhos abandonados em um e-commerce, filas de processamento assíncrono não atendidas ou taxas de erro específicas por tipo de transação.
O Prometheus consolidou-se como o padrão da indústria para coleta e armazenamento de séries temporais (TSDB). Diferente de sistemas tradicionais baseados em push, o Prometheus opera em um modelo de pull, onde o servidor de monitoramento busca ativamente os dados expostos pelos serviços-alvo. Para coletar métricas que não são nativas do sistema operacional, utilizamos o conceito de exportadores ou bibliotecas client-side. Este tutorial demonstra como criar um exportador simples em Python para expor dados de uma aplicação fictícia e visualizá-los no Grafana, estabelecendo as bases para uma estratégia robusta de monitoramento vps e aplicações.
Arquitetura da Solução
Antes de executar os comandos, é crucial entender o fluxo de dados entre os componentes que compõem a pilha de monitoramento. A arquitetura proposta segue o padrão industrial de separação de responsabilidades:
- Aplicação (Exporter): Um script Python ou binário que roda localmente e expõe uma URL HTTP (geralmente na porta 9100 ou similar) no formato
/metrics. Este componente atua como a fonte da verdade, expondo os dados brutos no formato textual legível pelo Prometheus. A instrumentação é feita diretamente no código da aplicação. - Prometheus Server: Configura periodicamente para buscar os dados dessa URL via HTTP GET. Ele armazena esses dados em disco local (TSDB) e permite consultas complexas usando sua linguagem própria, PromQL. O servidor gerencia a descoberta de alvos e a retenção dos dados.
- Grafana: Conecta-se ao Prometheus como fonte de dados principal. Ele não armazena métricas por si só, mas as consulta em tempo real para renderizar gráficos interativos, tabelas e alertas. É a camada de apresentação da observabilidade.
Essa separação permite flexibilidade operacional. Você pode trocar o banco de dados Prometheus por um sistema compatível com o protocolo OpenMetrics sem alterar seu código de aplicação. Da mesma forma, pode mudar a ferramenta de visualização (para InfluxDB, Datadog, etc.) sem mexer na coleta de dados, desde que o exportador continue expondo os dados no formato padrão.
Pré-requisitos
Para seguir este tutorial com sucesso e garantir um ambiente de teste estável, você precisará atender aos seguintes requisitos técnicos:
- Um servidor Linux (Ubuntu 20.04/22.04 ou Debian 11/12) com acesso root ou usuário sudo.
- Python 3 instalado e configurado no PATH global.
- Conhecimento básico de linha de comando Linux, gerenciamento de serviços (systemd) e conceitos de redes (HTTP, portas, firewalls).
- Acesso a um navegador web para configurar o Grafana.
- Um firewall configurado (UFW ou iptables) liberando as portas necessárias (9090 para Prometheus, 3000 para Grafana e 8080 para o exporter).
Este ambiente pode ser uma máquina virtual na nuvem ou um VPS dedicado. Ter controle total sobre o sistema operacional permite ajustar parâmetros de kernel e permissões que são críticos para o desempenho do monitoramento em produção.
- Entendendo a Arquitetura de Monitoramento
- Instalação e Configuração do Prometheus
- Criando um Exportador Customizado em Python
- Gestão de Processos com Systemd
- Validação da Coleta de Dados
- Visualização e Análise com Grafana
- Troubleshooting e Boas Práticas
- Perguntas Frequentes (FAQ)
Passo 1: Preparando o Ambiente
Vamos começar preparando o sistema operacional. Para este exemplo, simularemos a coleta de uma métrica customizada chamada app_requests_total, que conta quantas requisições foram processadas pela aplicação ao longo do tempo.
Instale as dependências básicas do sistema e o Python 3:
sudo apt update
sudo apt install python3 python3-pip curl wget -y
O Prometheus pode ser instalado via pacote binário oficial ou Docker. Para simplificar este tutorial e focar na configuração manual e na compreensão interna do funcionamento, utilizaremos a instalação via binário pré-compilado em um diretório dedicado. Isso oferece maior transparência sobre o que está acontecendo no sistema, facilitando o troubleshooting.
Passo 2: Instalando e Configurando o Prometheus
Por questões de segurança e boas práticas de isolamento de privilégios, nunca execute serviços de monitoramento como usuário root. Crie um usuário específico para rodar o serviço:
sudo useradd --no-create-home --shell /bin/false prometheus
Crie os diretórios de configuração e dados persistentes para separar os arquivos estáticos dos dados dinâmicos:
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
Baixe a versão mais recente estável do Prometheus. Verifique sempre o site oficial para a última versão, mas o exemplo abaixo ilustra o processo genérico com a versão 2.47.0:
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
tar xvfz prometheus-2.47.0.linux-amd64.tar.gz
Mova os binários e arquivos de configuração para seus locais definitivos, garantindo que estejam acessíveis ao sistema:
sudo cp prometheus-2.47.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.47.0.linux-amd64/promtool /usr/local/bin/
sudo cp -r prometheus-2.47.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.47.0.linux-amd64/console_libraries /etc/prometheus
Agora, defina as permissões corretas para que o usuário prometheus possa acessar e escrever em seus próprios arquivos sem necessidade de elevação de privilégios:
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
sudo chown -R prometheus:prometheus /etc/prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus
Configurando o Arquivo YAML
Crie o arquivo de configuração /etc/prometheus/prometheus.yml. Este arquivo instrui o Prometheus onde buscar as métricas e como interpretá-las. A estrutura YAML deve ser rigorosa quanto à indentação, pois erros aqui impedirão o início do serviço.
sudo tee /etc/prometheus/prometheus.yml > /dev/null <
Nesta configuração, adicionamos um novo trabalho (job_name) chamado custom-app-exporter. Ele instrui o Prometheus a buscar dados no endereço localhost:8080 a cada 15 segundos. Note que usamos static_configs para simplicidade, mas em ambientes de produção com orquestração (Kubernetes/Docker Swarm), você provavelmente usará docker_sd_configs ou kubernetes_sd_configs para descoberta automática de serviços.
O parâmetro scrape_interval: 15s define a frequência global. Se sua aplicação gerar picos rápidos e você precisar de granularidade fina, pode reduzir esse valor (ex: 5s), mas lembre-se de que intervalos menores aumentam exponencialmente o consumo de recursos de armazenamento e CPU no servidor Prometheus.
Passo 3: Criando o Exportador Customizado
O coração da coleta de métricas customizadas reside no exportador. Vamos criar um script em Python que usa a biblioteca oficial prometheus_client. Primeiro, instale a biblioteca:
sudo pip3 install prometheus_client
Crie o arquivo do exportador, por exemplo, custom_exporter.py, no diretório /opt:
sudo tee /opt/custom_exporter.py > /dev/null <<'PYTHON_CODE'
from prometheus_client import start_http_server, Counter, Histogram, Gauge
import time
import random
# 1. Definir as métricas customizadas
# Counter: Métrica que só aumenta (ex: total de requisições)
app_requests_total = Counter('app_requests_total', 'Total number of requests processed')
# Histogram: Mede a duração das requisições (latência)
request_duration = Histogram('app_request_duration_seconds', 'Duration of requests in seconds')
# Gauge: Métrica que sobe e desce (ex: número de usuários ativos)
active_users = Gauge('app_active_users', 'Number of active users')
def simulate_work():
"""Simula o processamento de uma requisição"""
start_time = time.time()
# Simula tempo de processamento aleatório entre 0.1s e 0.5s
time.sleep(random.uniform(0.1, 0.5))
end_time = time.time()
duration = end_time - start_time
# Incrementa o contador de requisições
app_requests_total.inc()
# Registra a duração no histograma
request_duration.observe(duration)
return duration
def main():
# 2. Iniciar o servidor HTTP na porta 8080
# O endpoint /metrics será servido automaticamente pela biblioteca
start_http_server(8080)
print("Exporter started on port 8080...")
while True:
# Simula a chegada de requisições
simulate_work()
# Atualiza métricas gauge simulando usuários entrando e saindo
active_users.set(random.randint(10, 100))
# Aguarda um pouco antes da próxima simulação
time.sleep(2)
if __name__ == '__main__':
main()
PYTHON_CODE
Este script faz três coisas essenciais para a instrumentação aplicações:
- Define os tipos de métricas: Usa
Counterpara contagem acumulada (nunca decrementa, exceto em reinicializações),Histogrampara distribuição de latência (calcula percentis automaticamente) eGaugepara estado atual (pode subir e descar arbitrariamente). - Inicia o servidor HTTP: A função
start_http_server(8080)cria um servidor web leve que responde às requisições de scrape do Prometheus no endpoint padrão/metrics. - Gera dados: O loop principal simula trabalho e atualiza as variáveis de métrica, permitindo visualizar o comportamento dinâmico.
É importante notar que a biblioteca prometheus_client gerencia automaticamente os cabeçalhos HTTP e o formato de saída, seguindo rigorosamente o padrão do Prometheus. Você não precisa formatar strings manualmente, o que evita erros comuns de parsing e garante compatibilidade com ferramentas como PromQL.
Passo 4: Executando o Exportador como Serviço Systemd
Para garantir que o exportador reinicie em caso de falhas e sobreviva a reinicializações do servidor, crie um serviço systemd. Isso é crítico para ambientes de produção onde a disponibilidade do monitoramento não pode ser interrompida.
sudo tee /etc/systemd/system/custom-exporter.service > /dev/null <
Habilite e inicie o serviço:
sudo systemctl daemon-reload
sudo systemctl enable custom-exporter.service
sudo systemctl start custom-exporter.service
Verifique se o serviço está rodando corretamente:
sudo systemctl status custom-exporter.service
Se o status mostrar "active (running)", seu exportador está exposto e pronto para ser consumido. O uso do usuário prometheus aqui é uma escolha de simplicidade, mas em ambientes reais, recomenda-se criar um usuário dedicado apenas para a aplicação.
Passo 5: Validando a Coleta de Dados
Agora, teste se o Prometheus consegue acessar as métricas. Acesse a URL http://localhost:8080/metrics via curl:
curl http://localhost:8080/metrics
Você deve ver uma saída no formato texto do Prometheus, contendo linhas como:
# HELP app_requests_total Total number of requests processed
# TYPE app_requests_total counter
app_requests_total 42.0
# HELP app_request_duration_seconds Duration of requests in seconds
# TYPE app_request_duration_seconds histogram
app_request_duration_seconds_bucket{le="0.1",...} 5
app_request_duration_seconds_sum 8.5
...
Em seguida, verifique o status do scrape no Prometheus. Abra o navegador e acesse http://SEU_IP_PROMETHEUS:9090/targets. O job custom-app-exporter deve aparecer com o status UP. Se estiver DOWN, verifique os logs do serviço no /var/log/syslog ou via journalctl -u custom-exporter.
Aviso: Se você vir o status "Unknown" ou "Down", verifique se o firewall (UFW/iptables) está permitindo a comunicação na porta 8080 entre o servidor Prometheus e o host onde o exportador roda. Em ambientes de VPS, isso é uma causa frequente de falhas.
Passo 6: Visualizando no Grafana
Com os dados sendo coletados, o próximo passo é a visualização. Certifique-se de ter o Grafana instalado e em execução.
Adicionando a Fonte de Dados
- Acesse o painel do Grafana (
http://SEU_IP_GRAFANA:3000). - Vá em Configuration > Data Sources.
- Clique em Add data source e selecione Prometheus.
- No campo URL, insira
http://localhost:9090(ou o IP do servidor Prometheus). - Clique em Save & Test. Você deve ver a mensagem "Data source is working".
Criando um Painel com Métricas Customizadas
- Vá em Create > Dashboard.
- Clique em Add a new panel.
- No campo PromQL, digite o nome da sua métrica. Por exemplo:
app_requests_total. - O Grafana tentará auto-completar. Selecione a instância correta se houver múltiplas.
- Altere o tipo de gráfico (no topo direito do painel) para Time series.
- Adicione uma expressão para calcular a taxa por segundo:
rate(app_requests_total[5m]). A funçãorateé essencial para métricas do tipo Counter, convertendo o incremento total em uma taxa instantânea. - Salve o painel com Ctrl+S.
A função rate() é um conceito-chave no PromQL. Como o Prometheus armazena valores cumulativos (ex: 100 requisições, depois 105), usar o valor bruto em um gráfico de linha resultaria em uma escalada infinita. O rate calcula a variação por segundo, permitindo visualizar picos de tráfego reais e tendências de crescimento.
Troubleshooting Comum
Problemas na integração entre Prometheus e Exportadores são frequentes. Aqui estão as causas mais comuns e como resolvê-las:
- Erros de Sintaxe YAML: O Prometheus é rigoroso com indentação. Um espaço a mais ou a menos no arquivo
prometheus.ymlfará o serviço falhar ao iniciar. Usepromtool check config /etc/prometheus/prometheus.ymlpara validar a configuração antes de reiniciar. - TLS/SSL: Se seu exportador exigir HTTPS, você precisará configurar certificados no Prometheus ou desabilitar a verificação de TLS (não recomendado para produção) usando
tls_config: { insecure_skip_verify: true }. - Timeout de Scrape: Se sua aplicação for lenta para gerar o endpoint
/metrics, o Prometheus pode cancelar a requisição antes de receber os dados. Ajuste oscrape_timeoutno arquivo de configuração para um valor maior que oscrape_interval. - Alta Cardinalidade: Se o Prometheus começar a consumir muita RAM ou falhar ao escrever em disco, verifique se você está usando labels com valores únicos por requisição (como IDs de usuário). Isso explode o número de séries temporais.
Perguntas frequentes
Posso usar linguagens diferentes do Python para criar exportadores?
Sim, absolutamente. O protocolo exposto pelo Prometheus é agnóstico à linguagem. Existem bibliotecas oficiais ou mantidas pela comunidade para Java, Go, Node.js, Ruby, PHP e muitas outras. A lógica de definir o tipo de métrica (Counter, Gauge, Histogram) e servir via HTTP permanece a mesma, independentemente da stack tecnológica.
O que é cardinalidade alta e por que devo evitá-la?
Cardinalidade refere-se ao número de combinações únicas de labels em uma métrica. Se você adicionar um label como user_id ou session_id, cada usuário único criará uma nova série temporal no banco de dados. Isso cresce exponencialmente e pode esgotar a memória RAM do Prometheus rapidamente. Use labels apenas para dimensões que fazem sentido agrupar, como region, service_name ou version.
Prometheus armazena os dados para sempre?
Não. O Prometheus tem políticas de retenção configuráveis no arquivo storage.tsdb.retention.time. Por padrão, ele pode reter dados por 15 dias (configurável). Para retenção de longo prazo (meses ou anos), é necessário integrar o Prometheus com sistemas de armazenamento em objeto como Amazon S3 ou Min