Software · Infraestrutura & Sistemas
Stack de Observabilidade Open Source: Prometheus, Grafana, Jaeger e ELK
Arquitetura detalhada da stack aberta de telemetria: coleta pull com Prometheus, dashboards no Grafana, spans com Jaeger e indexação textual via ELK.
Neste artigo
Operar microsserviços sem instrumentos confiáveis transforma incidentes em exercícios de adivinhação. A stack aberta consolidada pela comunidade corporativa divide as responsabilidades em três pilares fundamentais: Prometheus para métricas quantitativas, Jaeger para rastreamento de chamadas e ELK (Elasticsearch, Logstash, Kibana) para depuração granular de eventos.
flowchart TD
subgraph Apps["Aplicações & Nós"]
AppA["Microsserviço Pedidos"]
AppB["Microsserviço Pagamentos"]
NodeExporter["Node Exporter"]
end
subgraph MetricPipeline["Pipeline de Métricas"]
Prom["Prometheus Server (Pull)"]
AlertMgr["Alertmanager"]
end
subgraph TracePipeline["Pipeline de Traces"]
JaegerCollector["Jaeger Collector (OTLP/Zipkin)"]
JaegerStore[("Elasticsearch / Cassandra")]
end
subgraph LogPipeline["Pipeline de Logs"]
Filebeat["Filebeat (DaemonSet)"]
Logstash["Logstash / Kafka"]
ES[("Elasticsearch Cluster")]
end
subgraph Visual["Visualização & Operação"]
Grafana["Grafana Unified Dashboard"]
Kibana["Kibana (Análise Textual)"]
end
AppA -- "/metrics" --> Prom
AppB -- "/metrics" --> Prom
NodeExporter -- "/metrics" --> Prom
Prom --> AlertMgr
Prom --> Grafana
AppA -. "Spans gRPC" .-> JaegerCollector
AppB -. "Spans gRPC" .-> JaegerCollector
JaegerCollector --> JaegerStore
JaegerStore --> JaegerCollector
Grafana -. "Jaeger Plugin" .-> JaegerCollector
AppA -. "JSON Logs" .-> Filebeat
Filebeat --> Logstash --> ES
ES --> Kibana
ES --> Grafana
Prometheus e o Modelo Pull
O Prometheus opera primariamente via amostragem ativa (scraping HTTP). Cada processo expõe um endpoint textual padronizado contendo métricas com nomes e rótulos dimensionais (labels).
# Taxa de requisições por segundo com status 5xx nos últimos 5 minutos
sum(rate(http_requests_total{status=~"5.."}[5m])) by (service, route)
/
sum(rate(http_requests_total[5m])) by (service, route) * 100
A principal armadilha operacional do Prometheus é a explosão de cardinalidade. Se um desenvolvedor injetar identificadores únicos (como IDs de usuário ou tokens UUID) dentro das labels de uma métrica, o mecanismo cria uma nova série temporal na memória para cada variação, consumindo gigabytes de RAM e degradando o motor TSDB.
Jaeger e Correlação Contextual
O Jaeger recebe spans estruturados que compartilham um mesmo TraceID. Quando a requisição passa pelo gateway e trafega por múltiplos serviços internos, cada etapa registra seu tempo de execução individual (duration) e metadados contextuais (tags). A correlação entre o trace do Jaeger e as linhas de log do ELK ocorre injetando o TraceID diretamente no formato estruturado de log da aplicação.
| Ferramenta | Papel Central | Protocolo de Ingestão | Modelo de Armazenamento | Risco Operacional Principal |
|---|---|---|---|---|
| Prometheus | Métricas numéricas e contadores | Pull HTTP (/metrics) | TSDB em disco local / Cortex | Explosão de cardinalidade por labels dinâmicas |
| Grafana | Camada visual unificada | Conectores SQL, PromQL, OTLP | Stateless (banco SQLite/Postgres de config) | Consultas lentas congelando dashboards |
| Jaeger | Rastreamento distribuído | Push gRPC / UDP OTLP | Cassandra / Elasticsearch / OpenSearch | Volume de dados em tráfego intenso sem amostragem |
| ELK Stack | Agregação e busca textual de logs | Push via Beats / Logstash | Índices invertidos em shards distribuídos | Esgotamento de espaço em disco e I/O saturation |
Na DATAXSTUDIOS, desenhamos arquiteturas que utilizam o OpenTelemetry Collector na camada de ponta, permitindo desviar métricas para o Prometheus e traces para o Jaeger sem prender o código das aplicações aos clientes específicos de cada fabricante.