Pular para conteúdo

Aula 19 - Monitoramento e Observabilidade com Prometheus e Grafana 📊

Objetivo Pedagógico

Objetivo: Conceber arquiteturas modernas de observabilidade baseadas nos Três Pilares (Métricas, Logs e Tracing) utilizando Prometheus para coleta em modelo pull, Alertmanager para roteamento de incidentes e Grafana para visualização operacional.


📑 1. Fundamentos Teóricos & Análise Técnica

Em arquiteturas distribuídas e de microsserviços, o monitoramento tradicional baseado em ping ou verificação de portas tornou-se obsoleto. A disciplina de Engenharia de Confiabilidade de Sites (SRE) estabelece o conceito de Observabilidade: a capacidade de inferir os estados internos de um sistema complexo a partir de suas saídas externas.

A observabilidade moderna estrutura-se sobre Os Três Pilares: 1. Métricas (Prometheus): - Dados numéricos de séries temporais agregáveis (Counter, Gauge, Histogram, Summary). - O Prometheus opera no Modelo Pull: o servidor busca ativamente métricas nos endpoints HTTP /metrics dos alvos (Scraping), evitando sobrecarga nos agentes e facilitando descoberta dinâmica de serviços. - Os Quatro Sinais Dourados (Google SRE): Latência, Tráfego (taxa de requisições), Erros e Saturação (uso de CPU, disco, pools de memória). 2. Logs Estruturados (Loki / ELK): - Registros de eventos com timestamp em formato JSON enriquecidos com metadados de contexto (traceId, userId, tenantId). 3. Rastreamento Distribuído (Distributed Tracing - OpenTelemetry / Tempo): - Rastreia o caminho exato percorrido por uma única requisição através de dezenas de microsserviços distintos via injeção de cabeçalhos de contexto (traceparent), destacando o span exato que causou lentidão.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    App["Microsserviço de Aplicação (/metrics)"] --> Prometheus["Prometheus Server (Scrape Pull a cada 15s)"]
    Prometheus --> TSDB["Armazenamento Time-Series Local"]
    Prometheus --> PromQL["Motor de Consultas PromQL"]
    PromQL --> Alert["Alertmanager (Deduplicação & PagerDuty/Slack)"]
    PromQL --> Grafana["Grafana Dashboards (Visualização em Tempo Real)"]
    style App fill:#e1f5fe,stroke:#01579b
    style Prometheus fill:#fff3e0,stroke:#e65100
    style TSDB fill:#ffebee,stroke:#c62828
    style Grafana fill:#f3e5f5,stroke:#7b1fa2
    style Alert fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Métricas em Formato Aberto (OpenMetrics): Padronização do formato texto de métricas adotado por Prometheus e toda a Cloud Native Computing Foundation (CNCF). - PromQL (Prometheus Query Language): Linguagem poderosa para cálculo de taxas instantâneas (rate()), percentis de latência (histogram_quantile()) e alertas preditivos. - SLO e Error Budgets: Definição matemática da margem de erro aceitável para orientar a cadência de novas releases sem degradar a experiência do cliente. - Alertas Baseados em Sintomas: Disparo de alertas voltados para a degradação de serviço percebida pelo usuário em vez de alertas ruidosos de causa raiz.


🛠️ 2. Implementação Prática em Observabilidade de Sistemas Distribuídos e SRE

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// prometheus_rules_slo.yml (Regras de Alerta Prometheus com SLO e Taxa de Erro)
groups:
  - name: api_slo_alerts
    rules:
      # Alerta quando a taxa de erro HTTP 5xx ultrapassar 1% em uma janela de 5 minutos
      - alert: HighHttpErrorRate
        expr: |
          sum(rate(http_requests_total{status=~"5.."}[5m]))
          /
          sum(rate(http_requests_total[5m])) * 100 > 1.0
        for: 2m
        labels:
          severity: critical
          team: platform
        annotations:
          summary: "Taxa de erro HTTP crítica em {{ $labels.instance }}"
          description: "A taxa de erro 5xx está em {{ $value | printf '%.2f' }}%, violando o SLO de confiabilidade."

      # Alerta de latência de percentil 99 acima do threshold aceitável
      - alert: HighLatencyP99
        expr: |
          histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 0.5
        for: 3m
        labels:
          severity: warning
        annotations:
          summary: "Latência p99 degradada (> 500ms)"
          description: "99% dos usuários estão esperando mais de 500ms nas respostas da API." 

💡 Análise Passo a Passo do Código

  1. Cálculo Relativo de Taxa (rate): Normaliza picos de tráfego temporários avaliando a proporção de erros em relação ao volume total de requisições.
  2. Diretiva for: 2m: Previne falsos alertas e alertas intermitentes (Alert Flapping) exigindo persistência da condição de anomalia.
  3. Mapeamento de Metadados e Severidade: Direciona o incidente automaticamente para o canal correto de resposta de engenharia.

🎯 3. Próximos Passos & Sequência Didática