# 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! 🎉