QrRapido/INSTRUMENTATION_SETUP.md
2025-07-28 18:22:47 -03:00

318 lines
9.0 KiB
Markdown

# QRRapido - Instrumentação Completa com Serilog + Seq + Monitoramento
Este documento descreve a implementação completa de observabilidade para a aplicação QRRapido, incluindo logging estruturado, monitoramento de recursos e health checks.
## 📋 Resumo da Implementação
**Serilog com múltiplos sinks** (Console + Seq com fallback resiliente)
**Monitoramento de recursos** (CPU, Memória, GC)
**Monitoramento MongoDB** (Tamanho, crescimento, collections)
**Health checks completos** (MongoDB, Seq, Resources, External Services)
**Logging estruturado** nos controllers críticos
**Configuração multi-ambiente** (Development, Production)
## 🚀 Instalação dos Pacotes
Execute o comando completo para instalar todos os pacotes necessários:
```bash
cd /mnt/c/vscode/qrrapido
dotnet add package Serilog.AspNetCore --version 8.0.0 && \
dotnet add package Serilog.Sinks.Console --version 5.0.1 && \
dotnet add package Serilog.Sinks.Seq --version 6.0.0 && \
dotnet add package Serilog.Sinks.Async --version 1.5.0 && \
dotnet add package Serilog.Enrichers.Environment --version 2.3.0 && \
dotnet add package Serilog.Enrichers.Thread --version 3.1.0 && \
dotnet add package Serilog.Enrichers.Process --version 2.0.2 && \
dotnet add package Serilog.Enrichers.AssemblyName --version 1.0.9 && \
dotnet add package Microsoft.Extensions.Diagnostics.HealthChecks --version 8.0.0 && \
dotnet add package AspNetCore.HealthChecks.MongoDb --version 7.0.0 && \
dotnet add package System.Diagnostics.PerformanceCounter --version 8.0.0
```
Depois verifique a instalação:
```bash
dotnet build
dotnet list package
```
## 🔧 Configuração do Seq
### Instalação Local (Desenvolvimento)
```bash
# Via Docker
docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest
# Via Chocolatey (Windows)
choco install seq
# Via HomeBrew (macOS)
brew install --cask seq
```
### Configuração de Produção
1. Configure o Seq em um servidor dedicado
2. Configure túnel SSH se necessário:
```bash
ssh -L 5341:localhost:5341 user@seq-server
```
3. Atualize `appsettings.Production.json` com a URL e API Key do Seq
## 📊 Endpoints de Health Check
A aplicação agora possui vários endpoints para monitoramento:
### 🔍 Health Check Detalhado (Uptime Kuma)
```
GET /health/detailed
```
**Resposta estruturada:**
```json
{
"applicationName": "QRRapido",
"status": "healthy|degraded|unhealthy",
"timestamp": "2025-07-28T10:30:00Z",
"uptime": "2d 4h 15m",
"checks": {
"mongodb": {
"status": "ok",
"latency": "45ms",
"databaseSizeMB": 245.7,
"documentCount": 15420,
"version": "7.0.5"
},
"seq": {
"status": "ok",
"reachable": true,
"lastLog": "2025-07-28T10:29:45Z"
},
"resources": {
"status": "ok",
"cpu": "23%",
"memory": "245MB",
"gcPressure": "low"
},
"externalServices": {
"status": "ok",
"services": [
{"service": "stripe", "status": "ok", "latencyMs": 250},
{"service": "google_auth", "status": "ok", "latencyMs": 150}
]
}
},
"version": "1.0.0"
}
```
### 🎯 Endpoints Específicos
```
GET /health/mongodb - MongoDB específico
GET /health/seq - Seq específico
GET /health/resources - Recursos do sistema
GET /health/external - Serviços externos
GET /health/simple - Status geral simples
GET /health/uptime-kuma - Otimizado para Uptime Kuma
```
## 📈 Configuração do Uptime Kuma
1. **Criar Monitor HTTP(s)**:
- URL: `https://seu-dominio.com/health/detailed`
- Method: `GET`
- Interval: `60 segundos`
2. **Configurar JSON Query** (opcional):
- JSON Path: `$.status`
- Expected Value: `healthy`
3. **Alertas Avançados**:
- JSON Path para CPU: `$.checks.resources.cpu`
- JSON Path para DB Size: `$.checks.mongodb.databaseSizeMB`
## 🎛️ Dashboard do Seq
### Queries Essenciais para Dashboards
#### 1. QR Generation Performance
```sql
ApplicationName = 'QRRapido'
and QRGeneration = true
and @Level = 'Information'
| summarize AvgTime = avg(TotalRequestTimeMs),
Count = count() by bin(@Timestamp, 5m)
```
#### 2. MongoDB Growth Monitoring
```sql
ApplicationName = 'QRRapido'
and MongoDbMonitoring = true
| project @Timestamp, DatabaseSizeMB, GrowthRateMBPerHour
```
#### 3. Resource Alerts
```sql
ApplicationName = 'QRRapido'
and (CpuUsagePercent > 80 or WorkingSetMB > 512)
and @Level in ['Warning', 'Error']
```
#### 4. Error Analysis
```sql
ApplicationName = 'QRRapido'
and @Level = 'Error'
| summarize Count = count()
by @Message, bin(@Timestamp, 1h)
```
## 🔔 Alertas Configurados
### MongoDB
- **Database > 1GB**: Warning
- **Database > 5GB**: Error
- **Growth > 100MB/hour**: Warning
- **Collections > 100MB**: Information
### Recursos do Sistema
- **CPU > 80% por 2 minutos**: Warning
- **CPU > 80% por 4+ minutos**: Error
- **Memory > 512MB**: Warning
- **Memory > 768MB**: Error
- **GC Pressure alta**: Warning
### QR Generation
- **Response time > 2s**: Warning
- **Rate limiting ativado**: Information
- **Generation failures**: Error
- **Cache miss ratio > 50%**: Warning
## 📁 Estrutura de Arquivos Criados
```
QRRapidoApp/
├── Services/
│ ├── Monitoring/
│ │ ├── ResourceMonitoringService.cs # Monitor CPU/Memory/GC
│ │ └── MongoDbMonitoringService.cs # Monitor MongoDB
│ └── HealthChecks/
│ ├── MongoDbHealthCheck.cs # Health check MongoDB
│ ├── SeqHealthCheck.cs # Health check Seq
│ ├── ResourceHealthCheck.cs # Health check Recursos
│ └── ExternalServicesHealthCheck.cs # Health check APIs
├── Controllers/
│ └── HealthController.cs # Endpoints health check
├── appsettings.json # Config base
├── appsettings.Development.json # Config desenvolvimento
├── appsettings.Production.json # Config produção
├── Program.cs # Serilog + Services
├── PACKAGES_TO_INSTALL.md # Lista de pacotes
└── INSTRUMENTATION_SETUP.md # Esta documentação
```
## 🛠️ Personalização por Ambiente
### Development
- Logs mais verbosos (Debug level)
- Thresholds mais relaxados
- Intervalos de monitoramento maiores
- Health checks com timeout maior
### Production
- Logs otimizados (Information level)
- Thresholds rigorosos para alertas
- Intervalos de monitoramento menores
- Health checks com timeout menor
- Integração com serviços externos habilitada
## 🔍 Logs Estruturados Implementados
### QR Generation (Controller mais crítico)
```json
{
"@t": "2025-07-28T10:30:00.123Z",
"@l": "Information",
"@m": "QR generation completed",
"ApplicationName": "QRRapido",
"RequestId": "abc12345",
"UserId": "user123",
"QRType": "url",
"TotalRequestTimeMs": 450,
"QRGenerationTimeMs": 320,
"FromCache": false,
"UserType": "premium",
"Success": true
}
```
### Resource Monitoring
```json
{
"@t": "2025-07-28T10:30:00.123Z",
"@l": "Information",
"@m": "Resource monitoring",
"ApplicationName": "QRRapido",
"ResourceMonitoring": true,
"CpuUsagePercent": 23.5,
"WorkingSetMB": 245,
"GcPressure": 3,
"ThreadCount": 45,
"Status": "Healthy"
}
```
### MongoDB Monitoring
```json
{
"@t": "2025-07-28T10:30:00.123Z",
"@l": "Information",
"@m": "MongoDB monitoring",
"ApplicationName": "QRRapido",
"MongoDbMonitoring": true,
"DatabaseName": "qrrapido",
"DatabaseSizeMB": 245.7,
"GrowthRateMBPerHour": 12.3,
"DocumentCount": 15420,
"Collections": [
{"name": "Users", "documentCount": 1250, "sizeMB": 15.4},
{"name": "QRCodeHistory", "documentCount": 14000, "sizeMB": 215.2}
],
"Status": "Healthy"
}
```
## 🚦 Próximos Passos
1. **Instalar os pacotes** usando o comando fornecido
2. **Configurar o Seq** localmente ou em produção
3. **Compilar a aplicação** com `dotnet build`
4. **Testar os health checks** acessando `/health/detailed`
5. **Configurar o Uptime Kuma** com os endpoints fornecidos
6. **Criar dashboards no Seq** usando as queries sugeridas
7. **Configurar alertas** baseados nos logs estruturados
## 🔧 Troubleshooting
### Seq não conecta
- Verificar se Seq está rodando: `http://localhost:5341`
- Verificar firewall/portas
- Aplicação continua funcionando (logs só no console)
### MongoDB health check falha
- Verificar connection string
- Verificar permissões de banco
- Health check retorna "degraded" mas aplicação continua
### Performance degradada
- Verificar logs de resource monitoring
- Ajustar intervalos nos `appsettings.json`
- Monitorar CPU/Memory via health checks
### Alertas muito frequentes
- Ajustar thresholds em `appsettings.json`
- Aumentar `ConsecutiveAlertsBeforeError`
- Configurar níveis de log apropriados
---
A aplicação QRRapido agora possui observabilidade completa, mantendo toda a funcionalidade existente intacta! 🎉