Grafana e Loki: dashboards e logs centralizados
Objetivos desta aula
- Construir dashboard que responde perguntas
- Consultar logs com LogQL
- Correlacionar métrica e log
Dashboard não é galeria de gráficos: é ferramenta de decisão. O primeiro painel responde 'está tudo bem?' com taxa de erro, p95 e throughput. Os seguintes ajudam a localizar o problema: por rota, por dependência, por recurso. Se um painel nunca é usado em incidente, ele só ocupa espaço.
Loki indexa labels e guarda o conteúdo comprimido, o que o torna barato e integrado ao mesmo modelo de labels do Prometheus. Com LogQL você filtra por stream e por conteúdo, extrai campos de JSON e até gera métricas a partir de logs.
O ganho maior é correlação: do painel de latência, ir para os logs daquele intervalo e serviço em dois cliques. Padronizar log estruturado com requestId e traceId é o que permite fechar o ciclo métrica → log → trace.
1. Dashboard que ajuda num incidente
Topo: os sinais de ouro do serviço. Meio: dependências (banco, fila, gateway de pagamento). Base: recursos (CPU, memória, Pods). Quem abre às 3h da manhã precisa entender em 10 segundos se o problema é aqui.
2. Variáveis e dashboards como código
Variáveis ($namespace, $service) evitam um painel por serviço. Guarde os dashboards em JSON no Git e provisione por ConfigMap ou Terraform — sem cliques perdidos.
3. Loki: logs baratos
O Loki indexa só labels (namespace, app), não o texto — por isso é barato. Promtail ou o Grafana Alloy coletam os logs dos nós. A consulta LogQL filtra por labels e depois pelo conteúdo.
4. Da métrica ao log
Ao ver um pico de erro no gráfico, clique e abra os logs do mesmo intervalo e serviço; com trace_id no log, pule direto para o trace no Tempo.
Na prática
Consultas LogQL
logql
{app="cloudshop", component="api"} |= "ERROR"
{app="cloudshop"} | json | status >= 500 | line_format "{{.route}} {{.message}}"
# taxa de erro derivada de log
sum(rate({app="cloudshop"} | json | status >= 500 [5m]))
# rastrear uma requisicao especifica
{app="cloudshop"} | json | requestId = "7f3c1a"
# duracao acima de 1s
{app="cloudshop"} | json | duration_ms > 1000Log estruturado na aplicação
javascript
function log(level, message, extra = {}) {
process.stdout.write(JSON.stringify({
ts: new Date().toISOString(),
level,
service: "cloudshop-api",
message,
...extra, // requestId, route, status, duration_ms, traceId
}) + "\n");
}
// nunca inclua: senha, token, cookie, dado de pagamento
log("info", "pedido criado", { requestId, route: "/orders", status: 201, duration_ms: 84 });Nota de segurança: Mantenha uma lista de campos proibidos e um teste automatizado que falha se algum deles aparecer no log.
LogQL: encontrar e contar erros
logql
{namespace="cloudshop", app="api"} |= "error"
{app="api"} | json | status >= 500 | line_format "{{.route}} {{.msg}}"
sum by (route) (count_over_time({app="api"} | json | status >= 500 [5m]))Por que isso importa
Em incidente, o tempo gasto procurando log é tempo de indisponibilidade.
Erro comum
Dashboard com quarenta painéis onde ninguém encontra o que importa.
Dica de produção
Coloque o painel de SLO no topo e o runbook linkado na descrição do dashboard.
Alerta de segurança
Log centralizado concentra dados sensíveis: defina retenção e controle de acesso.
Pergunta de entrevista
Como você correlaciona um pico de latência com os logs correspondentes?
Glossário
- LogQL
- Linguagem de consulta do Loki, inspirada em PromQL.
- log estruturado
- Log emitido como objeto (JSON) com campos consultáveis.
- Loki
- Sistema de logs que indexa apenas labels, reduzindo custo.
- LogQL
- Linguagem de consulta de logs do Loki.
- Provisioning
- Carregar dashboards e fontes de dados a partir de arquivos versionados.
Conexão com o CloudShop
Criar o dashboard principal do CloudShop com SLO, RED e link para logs.
Quiz da aula
1. Qual campo é essencial para correlacionar log com trace?
2. Por que o Loki é mais barato que soluções que indexam todo o texto?
Minhas anotações
Salvo automaticamente neste navegador.