Logs e Monitoramento - Arquitetura Monolito e Multicluster
Data: 2026-01-28 Status: 📋 Documentação Atualizada Objetivo: Documentar estratégia de logs e monitoramento considerando arquitetura monolito e evolução para multicluster, incluindo interface web para produção
📊 Padrão de Diagramas: Este documento utiliza Mermaid como padrão para todos os diagramas arquiteturais. Mermaid oferece melhor performance de renderização, suporte nativo em editores modernos (GitHub, GitLab, VS Code, Cursor) e facilita manutenção.
Definir estratégia completa de logs e monitoramento que:
✅ Funciona em arquitetura monolito (Fase 1)
✅ Escala para APIs Modulares (Fase 2)
✅ Prepara para Microserviços (Fase 3)
✅ Fornece interface web para verificação de logs e auxílio à produção
✅ Centraliza observabilidade independente da arquitetura
📊 Arquitetura de Observabilidade
graph TB
subgraph API["Arah.Api (Monolito)"]
Serilog["Serilog (Logging)<br/>- Console Sink<br/>- File Sink (logs/Arah-.log)<br/>- Seq Sink (opcional)"]
Prometheus["Prometheus Metrics<br/>- Endpoint: /metrics<br/>- Métricas HTTP automáticas<br/>- Métricas de negócio"]
OpenTelemetry["OpenTelemetry Tracing<br/>- HTTP requests<br/>- Database queries<br/>- Eventos"]
HealthChecks["Health Checks<br/>- /health (liveness)<br/>- /health/ready (readiness)<br/>- /health/live (liveness)"]
WebInterface["Interface Web de Monitoramento<br/>- /admin/monitoring<br/>- Visualização de logs em tempo real<br/>- Métricas e dashboards<br/>- Health checks visuais"]
end
API --> Seq["Seq<br/>(Logs)"]
API --> PrometheusService["Prometheus<br/>(Métricas)"]
style API fill:#e1f5ff
style Seq fill:#fff4e1
style PrometheusService fill:#fff4e1
Health Checks: Status de dependências (banco, cache, storage)
Alertas Ativos: Lista de alertas e notificações
Atividade Recente: Últimos logs importantes
URL: /admin/monitoring/logs
Funcionalidades:
✅ Filtros:
Por nível (Error, Warning, Information, Debug)
Por componente/módulo
Por Correlation ID
Por período (última hora, últimas 24h, etc.)
Por texto (busca)
✅ Visualização:
Lista de logs em tempo real (WebSocket/SSE)
Formatação colorida por nível
Detalhes expandíveis (stack trace, contexto)
Exportação (JSON, CSV)
✅ Agregação:
Contagem de erros por tipo
Top 10 erros mais frequentes
Timeline de eventos
URL: /admin/monitoring/metrics
Funcionalidades:
✅ Gráficos em Tempo Real:
Request rate (req/s)
Error rate (%)
Latência (P50, P95, P99)
Cache hit rate
Database connections
✅ Métricas de Negócio:
Posts criados (última hora/dia)
Eventos criados
Membros criados
Transações processadas
✅ Métricas de Sistema:
CPU usage
Memory usage
Disk I/O
Network I/O
4. Health Checks Visuais
URL: /admin/monitoring/health
Funcionalidades:
✅ Status de Dependências:
Database (PostgreSQL)
Cache (Redis/IMemoryCache)
Storage (S3/Local)
Event Bus
External APIs (se aplicável)
✅ Detalhes:
Tempo de resposta
Última verificação
Histórico de falhas
Ações recomendadas
URL: /admin/monitoring/troubleshooting
Funcionalidades:
✅ Diagnóstico Automático:
Verificação de problemas comuns
Sugestões de solução
Links para documentação
✅ Comandos Úteis:
Verificar health
Verificar métricas
Verificar logs
Verificar cache
Verificar banco de dados
✅ Guia de Resolução:
Problemas comuns e soluções
Procedimentos de emergência
Contatos de escalação
📋 Implementação da Interface Web
backend/Arah.Api/
├── Controllers/
│ └── Admin/
│ ├── MonitoringController.cs # Endpoints de monitoramento
│ ├── LogsController.cs # API de logs
│ └── MetricsController.cs # API de métricas
├── Services/
│ └── Monitoring/
│ ├── ILogViewerService.cs # Serviço de visualização de logs
│ ├── LogViewerService.cs # Implementação
│ ├── IMetricsAggregatorService.cs # Agregação de métricas
│ └── MetricsAggregatorService.cs # Implementação
├── wwwroot/
│ └── admin/
│ └── monitoring/
│ ├── index.html # Dashboard principal
│ ├── logs.html # Visualizador de logs
│ ├── metrics.html # Métricas e dashboards
│ ├── health.html # Health checks
│ ├── troubleshooting.html # Troubleshooting
│ └── assets/
│ ├── monitoring.js # JavaScript
│ └── monitoring.css # Estilos
└── Hubs/
└── LogsHub.cs # SignalR para logs em tempo real
Endpoints da API
[ApiController]
[Route("api/v1/admin/monitoring/logs")]
[Authorize(Policy = "SystemAdmin")]
public sealed class LogsController : ControllerBase
{
/// <summary>
/// Lista logs com filtros.
/// </summary>
[HttpGet]
public async Task<ActionResult<PagedLogsResponse>> GetLogs(
[FromQuery] LogLevel? level,
[FromQuery] string? component,
[FromQuery] string? correlationId,
[FromQuery] DateTime? from,
[FromQuery] DateTime? to,
[FromQuery] string? search,
[FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 100)
{
// Buscar logs do arquivo ou Seq
// Aplicar filtros
// Retornar página de logs
}
/// <summary>
/// Obtém estatísticas de logs.
/// </summary>
[HttpGet("stats")]
public async Task<ActionResult<LogStatsResponse>> GetLogStats(
[FromQuery] DateTime? from,
[FromQuery] DateTime? to)
{
// Contar logs por nível
// Top 10 erros mais frequentes
// Timeline de eventos
}
/// <summary>
/// Exporta logs.
/// </summary>
[HttpGet("export")]
public async Task<IActionResult> ExportLogs(
[FromQuery] LogLevel? level,
[FromQuery] DateTime? from,
[FromQuery] DateTime? to,
[FromQuery] string format = "json")
{
// Exportar logs em formato JSON ou CSV
}
}
[ApiController]
[Route("api/v1/admin/monitoring/metrics")]
[Authorize(Policy = "SystemAdmin")]
public sealed class MetricsController : ControllerBase
{
/// <summary>
/// Obtém métricas agregadas.
/// </summary>
[HttpGet]
public async Task<ActionResult<MetricsResponse>> GetMetrics(
[FromQuery] string? metric,
[FromQuery] DateTime? from,
[FromQuery] DateTime? to)
{
// Buscar métricas do Prometheus ou cache
// Agregar se necessário
// Retornar métricas
}
/// <summary>
/// Obtém métricas em tempo real (últimos 5 minutos).
/// </summary>
[HttpGet("realtime")]
public async Task<ActionResult<RealtimeMetricsResponse>> GetRealtimeMetrics()
{
// Métricas dos últimos 5 minutos
// Atualização a cada 10 segundos
}
}
[ApiController]
[Route("api/v1/admin/monitoring/health")]
[Authorize(Policy = "SystemAdmin")]
public sealed class HealthController : ControllerBase
{
/// <summary>
/// Obtém status detalhado de health checks.
/// </summary>
[HttpGet("detailed")]
public async Task<ActionResult<DetailedHealthResponse>> GetDetailedHealth()
{
// Executar todos os health checks
// Retornar status detalhado
// Incluir tempo de resposta
// Incluir histórico de falhas
}
}
// Arah.Api/Hubs/LogsHub.cs
public sealed class LogsHub : Hub
{
private readonly ILogViewerService _logViewerService;
public async Task SubscribeToLogs(string? level, string? component)
{
await Groups.AddToGroupAsync(Context.ConnectionId, "logs");
// Enviar logs recentes
var recentLogs = await _logViewerService.GetRecentLogsAsync(level, component);
await Clients.Caller.SendAsync("LogsReceived", recentLogs);
}
public async Task UnsubscribeFromLogs()
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "logs");
}
}