Observabilidade
Introdução ao documento
Este documento define os padrões de observabilidade do serviço: logs, healthchecks, métricas e alertas.
Versionamento
- Versão do documento: 1.0.0
- Última atualização: 2026-03-09
- Responsável: Marivaldo Vinicius
Referencial teórico
Escopo
Mapeamento de logs, healthchecks e métricas com base no código versionado.
Fontes de evidência
- Configuração de logs: Laravel Logging com Monolog
- Health check: endpoint
/upconfigurado no bootstrap - Configuração de queue: Laravel Queue
- Workers: Supervisor gerencia 4 processos de queue worker
Padrão de logs
Configuração
O sistema utiliza Laravel Logging com Monolog. Configuração:
- Canal padrão:
stack(configurável viaLOG_CHANNEL) - Stack: Composto por canais definidos em
LOG_STACK(padrão:single) - Nível: Configurável via
LOG_LEVEL(padrão:debug)
Canais disponíveis
- single: Arquivo único
storage/logs/laravel.log - daily: Arquivos diários em
storage/logs/laravel-YYYY-MM-DD.log(retenção: 14 dias) - stack: Agregação de múltiplos canais
- slack: Envio para Slack (configurável via
LOG_SLACK_WEBHOOK_URL) - papertrail: Envio para Papertrail (configurável via
PAPERTRAIL_URLePAPERTRAIL_PORT) - syslog: Logs do sistema
- errorlog: PHP error log
- stderr: Standard error output
Localização dos logs
Aplicação:
storage/logs/laravel.log- Log principal da aplicaçãostorage/logs/laravel-YYYY-MM-DD.log- Logs diários (se configurado)storage/logs/laravel-supervisor-worker.log- Logs dos workers do Supervisor
Visualização:
- Interface web:
/admin/logs(via opcodesio/log-viewer) - Linha de comando:
tail -f storage/logs/laravel.log
Campos mínimos
Logs seguem formato padrão do Laravel/Monolog com:
- Timestamp
- Nível (debug, info, warning, error, critical)
- Mensagem
- Contexto (quando aplicável)
Exemplo de log estruturado:
{
"message": "Processamento de cache de inscricoes concluído",
"context": {
"job": "RefreshData",
"items": 1500
},
"level": "info",
"timestamp": "2026-03-09T10:30:00.000000Z"
}
Logs de integração
Integrações externas registram logs de erro quando falham:
- WordPress API: Logs de erro em
EnrollmentStatsServicequando requisições falham - AoVivo API: Erros capturados mas não logados explicitamente (apenas retornados)
- Gemini API: Erros de processamento são retornados na resposta, não logados
Healthchecks
Endpoint principal
GET /up
Endpoint nativo do Laravel configurado em bootstrap/app.php. Retorna status básico da aplicação.
Resposta:
- 200 OK: Aplicação está operacional
- 503 Service Unavailable: Aplicação em modo de manutenção ou com problemas
Uso:
- Kubernetes liveness/readiness probes
- Load balancers
- Monitoramento externo
Endpoint de API
GET /api/v1/health-check
Endpoint customizado que retorna status e timestamp:
{
"status": "OK",
"timestamp": "2026-03-09T10:30:00.000000Z"
}
Uso:
- Verificação de saúde da API
- Monitoramento de uptime
- Integração com sistemas externos
Verificação de dependências
O health check não verifica dependências externas (banco de dados, cache, filas). Para verificação completa:
# Verificar conexão com banco
docker compose exec laravel php artisan tinker
# DB::connection()->getPdo();
# Verificar cache
docker compose exec laravel php artisan tinker
# Cache::get('test-key');
# Verificar queue
docker compose exec laravel php artisan queue:work --once
Métricas importantes
Latência (p50/p95/p99)
Não há métricas de latência configuradas nativamente. Recomendações:
- Endpoints críticos:
/api/v1/inscricoes,/api/v1/ao-vivo/* - TTL de cache: 30 segundos (AoVivo), 1 minuto a 4 horas (WordPress)
- Timeout de jobs: 900 segundos (15 minutos) configurado em
laravel-worker.conf
Erros (4xx/5xx)
Monitoramento via logs:
- Erros 4xx: Validação, autenticação, autorização
- Erros 5xx: Erros de servidor, timeouts, falhas de integração
Endpoints que retornam 5xx:
/api/v1/ao-vivo/*- Quando WordPress API falha/api/v1/sentiment- Quando Gemini API falha
Throughput
Não há métricas de throughput configuradas. Monitorar via:
- Logs de acesso (se configurado)
- Métricas do servidor web (FrankenPHP/Octane)
- Métricas do Kubernetes (se em produção)
Fila/cron backlog
Monitoramento de fila:
# Ver jobs pendentes
docker compose exec laravel php artisan queue:work --once
# Ver jobs falhados
docker compose exec laravel php artisan queue:failed
# Verificar status do Supervisor (workers)
docker compose exec laravel supervisorctl status
Configuração de workers:
- 4 processos configurados em
laravel-worker.conf - Timeout: 900 segundos
- Tries: 3 tentativas
- Sleep: 3 segundos entre jobs
Saturação DB/cache
Banco de dados:
- Monitorar conexões ativas
- Verificar slow queries
- Monitorar uso de memória do MySQL
Cache:
- Verificar uso de memória do Redis (se configurado)
- Monitorar hit rate do cache
- Verificar TTL dos caches
Onde olhar logs
Local (Desenvolvimento)
# Log principal
docker compose exec laravel tail -f storage/logs/laravel.log
# Logs diários
docker compose exec laravel tail -f storage/logs/laravel-$(date +%Y-%m-%d).log
# Logs do worker
docker compose exec laravel tail -f storage/logs/laravel-supervisor-worker.log
# Todos os logs
docker compose logs -f laravel
Produção (Kubernetes)
# Logs do pod principal
kubectl logs -f <pod-name>
# Logs do container de worker
kubectl logs -f <pod-name> -c laravel-worker
# Logs de todos os pods
kubectl logs -f -l app=dhedalos-app-dashboard-laravel
# Logs com filtro de tempo
kubectl logs --since=1h <pod-name>
Interface web
Acessar /admin/logs para visualização via opcodesio/log-viewer (requer permissão de administração).
Alertas recomendados
Erro 5xx acima de limiar
Critério: Taxa de erros 5xx > 1% em 5 minutos
Ações:
- Verificar logs de erro
- Verificar saúde de integrações externas (WordPress, AoVivo, Gemini)
- Verificar recursos do servidor (CPU, memória)
- Verificar status do banco de dados
Latência p95 acima de limiar
Critério: Latência p95 > 2 segundos em 5 minutos
Ações:
- Verificar cache hit rate
- Verificar queries lentas no banco
- Verificar saturação de workers
- Verificar integrações externas (timeouts)
Falha de job recorrente
Critério: Mesmo job falha 3 vezes consecutivas
Ações:
- Verificar logs do job específico
- Verificar recursos disponíveis (memória, timeout)
- Verificar dependências do job (banco, cache, APIs externas)
- Verificar configuração do queue driver
Falha de healthcheck
Critério: Health check retorna 503 ou timeout
Ações:
- Verificar se aplicação está rodando
- Verificar modo de manutenção ativo
- Verificar recursos do container/pod
- Verificar conectividade de rede
Queue backlog crescente
Critério: Número de jobs pendentes > 1000 por mais de 10 minutos
Ações:
- Verificar se workers estão rodando
- Verificar performance dos workers
- Verificar se jobs estão falhando
- Considerar escalar número de workers
Monitoramento de integrações
WordPress API
Métricas:
- Taxa de sucesso de requisições
- Tempo de resposta
- Erros de autenticação
Logs:
- Erros logados em
EnrollmentStatsServicequando requisições falham - Status HTTP e body da resposta são logados em caso de erro
AoVivo API
Métricas:
- Taxa de sucesso de requisições
- Tempo de resposta (cache de 30 segundos)
Logs:
- Erros não são explicitamente logados, apenas retornados na resposta
Google Gemini API
Métricas:
- Taxa de sucesso de requisições
- Tempo de resposta
- Uso de tokens/quotas
Logs:
- Erros não são explicitamente logados, apenas retornados na resposta