Comparativo: Prometheus+Grafana vs Loki+Tempo para observabilidade de aplicações PHP
Por Kevin Marcondes · Publicado em · 8 min de leitura
Este comparativo entre Prometheus+Grafana e Loki+Tempo foca em aplicações PHP que preferem evitar SaaS. Explico onde cada stack brilha, como instrumentar PHP para métricas, logs e traces, custos operacionais típicos e quando faz sentido combinar tudo no Grafana. O objetivo é orientar escolhas práticas para produção, sem promessas mágicas.
Visão geral: duas pilhas que se complementam
Prometheus+Grafana cobre métricas e alertas a partir de endpoints de scraping. É ideal para séries temporais, uso de CPU, latências e contagem de erros.
Loki+Tempo foca em logs e tracing distribuído. Loki indexa rótulos e armazena logs de forma eficiente. Tempo armazena e consulta traces. Ambos integram no Grafana.
Para PHP, a pergunta não é só “qual é melhor?”, mas “o que medir agora” e “como correlacionar eventos” sem depender de SaaS.
Cenários PHP: web, jobs e fila
Em PHP monólito (Laravel, Symfony ou Slim), você quer métricas de latência HTTP, erros por rota, uso de PHP-FPM e banco. Logs estruturados ajudam no diagnóstico.
Em workers de fila, métricas de jobs processados, falhas por tipo e duração. Logs com IDs de correlação permitem rastrear um pedido pela cadeia.
Traces mostram a linha do tempo de requisições complexas, chamadas externas e gargalos. A decisão é sobre prioridade e orçamento de dados.
- Prometheus: latências, contadores, histogramas e alertas objetivos.
- Loki: logs de aplicação e Nginx em JSON, busca rápida por rótulos.
- Tempo: traces com contexto e spans detalhados para gargalos.
Arquitetura, armazenamento e manutenção
Prometheus é um TSDB local com scraping pull. É simples para começar e confiável para métricas. Para retenções maiores, use discos rápidos ou integre remote_write.
Loki usa index leve sobre rótulos e chunks de logs. O custo depende do volume e da cardinalidade dos labels. Você controla retenção por stream.
Tempo recebe traces via OTLP. Pode operar com armazenamento de objetos. A retenção depende do sampling. Tracing sem amostragem costuma ficar caro em dados.
- Prometheus: simples, porém sensível à alta cardinalidade de labels.
- Loki: eficiente, mas rotulagem ruim explode índices e custos.
- Tempo: requer estratégia de amostragem e limites por serviço.
Instalação e operação com Docker Compose
Ambas as pilhas funcionam bem em Compose. O caminho mínimo é isolar componentes e volumes, expor portas internas e colocar o Grafana por cima.
Para métricas, Prometheus faz scrape de exporters e do endpoint /metrics do app. Para logs, Promtail ou Fluent Bit enviam para Loki. Para tracing, o SDK do OpenTelemetry envia OTLP para Tempo.
Quer um passo a passo de métricas? Veja o guia de configuração de Prometheus e Grafana com Compose.
- Componentes básicos: Grafana, Prometheus, Loki, Tempo, Promtail/Fluent Bit, exporters.
- Exponha /metrics no app PHP ou use exporters de PHP-FPM e Nginx.
- Opcional: OpenTelemetry Collector para padronizar e rotear dados.
Instrumentação no PHP: métricas, logs e traces
Métricas: use uma biblioteca cliente do Prometheus para expor contadores, gauges e histogramas. Exponha /metrics no app. Para jobs curtos, considere Pushgateway.
Exporters úteis: PHP-FPM exporter, Nginx exporter e Node Exporter no host. Eles cobrem infraestrutura e web server sem mexer no app.
Logs: escreva em JSON com rótulos estáveis (app, ambiente, serviço). Configure Promtail para coletar arquivos e enviar ao Loki. Use um ID de correlação por requisição.
Traces: use o SDK OpenTelemetry no PHP. Envie spans via OTLP ao Tempo. Instrumente middleware HTTP e drivers de banco para ver gargalos.
- Padronize nomes de métricas e rótulos.
- Use correlação entre log, trace_id e request_id.
- Documente limites de cardinalidade e retenção por serviço.
Consultas e dashboards no Grafana
PromQL é expressivo para taxas, percentis e alertas. Construa SLOs e painéis por serviço.
LogQL permite filtrar por labels e buscar padrões nos logs. Combine com parsers para extrair campos do JSON.
Tempo integra direto no Grafana. Você investiga spans, dependências e latências por operação. Correlacione: da métrica para o log, e do log para o trace, em poucos cliques.
- PromQL: rate(), histogram_quantile(), increase().
- LogQL: {app="php"} |= "error" | json.
- Traces: visualize a árvore de spans e latências por camada.
Tabela comparativa: critérios práticos
Resumo lado a lado para decidir com clareza. Lembre: você pode combinar as pilhas sob o Grafana e evoluir por etapas.
| Critério | Prometheus + Grafana | Loki + Tempo (+ Grafana) |
|---|---|---|
| Objetivo principal | Métricas e alertas | Logs e tracing |
| Coleta no PHP | Endpoint /metrics com biblioteca Prometheus | Logs JSON via Promtail; traces via OpenTelemetry |
| Ingestão | Pull (scrape) e opcional Pushgateway | Push (Promtail/OTLP) |
| Linguagem de consulta | PromQL | LogQL para logs; UI/TraceQL para traces |
| Armazenamento padrão | TSDB local; opcional remote_write | Logs em chunks e índices leves; traces em objeto |
| Curva de implantação | Rápida para começar | Requer padronizar logs e instrumentar tracing |
| Escalabilidade | Boa com rótulos controlados | Boa com rotulagem e sampling disciplinados |
| Quando brilha | SLOs, capacidade e alertas determinísticos | Debug profundo, reprodução de falhas, causa-raiz |
| Limitações comuns | Cardinalidade alta degrada o TSDB | Volume de logs e traces sem limites explode custos |
Quando escolher e quando combinar
Só métricas? Prometheus resolve rapidamente SLOs e alertas. Precisa investigar incidentes difíceis? Adicione Loki para logs úteis. Gargalos entre serviços? Some Tempo com OpenTelemetry.
Para equipes pequenas, uma abordagem incremental funciona: comece com métricas essenciais e logs estruturados. Ative tracing seletivo nas áreas mais críticas. Revise retenção e sampling mensalmente.
- Comece simples, meça o necessário e evolua.
- Defina SLOs com Prometheus antes de abrir o “firehose” de logs.
- Ative tracing com amostragem direcionada por erro ou latência.
Boas práticas e armadilhas a evitar
Rótulos em Prometheus: mantenha cardinalidade sob controle. Evite IDs únicos como label. Cardinalidade alta degrada performance e consumo de RAM.
Logs: escreva JSON limpo e estável. Não registre dados sensíveis. Separe níveis, padronize campos e crie pipelines de retenção.
Tracing: configure sampling por rota, código de status e erro. Sem sampling, o volume cresce rápido. Documente custos de armazenamento e políticas de rotação.
- Nomeie métricas com prefixos claros (ex.: http_, db_).
- Aplique limites por fluxo de logs e quotas por serviço.
- Monitore o próprio Prometheus, Loki e Tempo no Grafana.
- Automatize backups dos volumes e teste restauração.
Próximos passos e referências do site
Quer começar pela base de métricas? Siga o guia prático de Prometheus com Compose. Para correlacionar tudo no PHP, aprofunde em OpenTelemetry e em logs JSON com correlação.
Se ainda avalia alternativas, veja o comparativo entre soluções de observabilidade para PHP, incluindo OTel.
- Guia de Prometheus e Grafana com Docker Compose.
- Tracing distribuído no PHP com OpenTelemetry.
- Logs estruturados em JSON e correlação em produção.
- Comparativo de ferramentas de observabilidade para PHP.
Perguntas frequentes
Dá para usar Prometheus e Loki+Tempo juntos no mesmo Grafana?
Sim. Grafana suporta múltiplas fontes de dados. Você pode consultar métricas com PromQL, logs com LogQL e traces do Tempo. O ganho real vem da correlação: parta de uma métrica de latência, abra os logs daquela janela e, se necessário, chegue ao trace correspondente.
Como correlacionar logs, métricas e traces no PHP?
Propague um request_id e trace_id desde a entrada HTTP. Inclua esses campos nas métricas como rótulos controlados, nos logs JSON e nos spans do OpenTelemetry. No Grafana, use links e variáveis para navegar do painel de métricas para logs e do log para o trace.
Preciso de OpenTelemetry para usar o Tempo?
Tempo fala OTLP, então o caminho recomendado no PHP é instrumentar com o SDK do OpenTelemetry. Ele envia spans e atributos padronizados ao Tempo. Integrações existem para HTTP, banco e filas. A amostragem deve ser configurada para equilibrar detalhes e volume de dados.
E se meus jobs PHP são curtos e morrem rápido?
Para métricas, use o Pushgateway do Prometheus. O job empurra a métrica antes de encerrar. Para logs, escreva em JSON e deixe o Promtail coletar. Para tracing, emita spans curtos e garanta flush no encerramento do processo para não perder eventos.
Onde armazenar dados em produção?
Depende do volume, retenção e orçamento. Prometheus pode rodar com disco local rápido e backups. Loki e Tempo funcionam bem com armazenamento de objetos. Defina políticas por ambiente e serviço, e verifique periodicamente o consumo e a necessidade de compactação.
Quer ajuda para desenhar sua stack de observabilidade open‑source em PHP?
Explique seu cenário, prioridades e restrições. Podemos avaliar juntos a combinação certa entre métricas, logs e tracing, e um plano incremental de implantação.
Falar sobre observabilidade PHPVeja também
- Ceph vs NFS vs GlusterFS para storage compartilhado em VPS com containers
- Comparativo: Amazon SQS vs RabbitMQ gerenciado para integrações entre ERP e marketplaces
- Comparativo: estratégias de deploy zero‑downtime em Kubernetes — RollingUpdate vs Blue/Green vs Canary
- comparativo: Traefik vs Caddy para roteamento HTTPS em ambientes Docker