Comparativo: Prometheus+Grafana vs Loki+Tempo para observabilidade de aplicações PHP

Por · Publicado em · 8 min de leitura

Barras verdes e vermelhas com linhas de tendência e eixo numérico em fundo escuro
Gráfico de métricas que ilustra comparativo de stacks de observabilidade Foto: Rafael Minguet Delgado / Pexels

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 PHP

Veja também