Skip to content

Sistemas de Logs e Monitoramento para .NET Senior

📋 Visão Geral

Sistemas de logs e monitoramento são fundamentais para observabilidade em aplicações modernas. Eles permitem coletar, analisar e visualizar dados de performance, logs e métricas para garantir a saúde e performance dos sistemas.

🏗️ Tipos de Sistemas

1. Sistemas de Monitoramento de Infraestrutura

Zabbix

O que é: Sistema de monitoramento de infraestrutura open-source.

Características:

  • Monitoramento: Servidores, redes, aplicações
  • Coleta: SNMP, agentes, HTTP checks
  • Alertas: Email, SMS, webhooks
  • Dashboards: Personalizáveis
  • Escalabilidade: Alta com proxy

Funcionalidades:

  • Auto-discovery: Descoberta automática de dispositivos
  • Templates: Configurações reutilizáveis
  • Triggers: Condições para alertas
  • Actions: Ações automáticas
  • Reports: Relatórios detalhados

Quando usar:

  • Monitoramento de infraestrutura on-premise
  • Quando precisa de controle total
  • Sistemas com orçamento limitado
  • Monitoramento de redes complexas
csharp
// Exemplo: Integração com Zabbix via API
public class ZabbixClient
{
    private readonly HttpClient _httpClient;
    private readonly string _apiUrl;
    private readonly string _authToken;
    
    public ZabbixClient(string apiUrl, string username, string password)
    {
        _httpClient = new HttpClient();
        _apiUrl = apiUrl;
        _authToken = Authenticate(username, password);
    }
    
    public async Task SendMetricAsync(string host, string key, string value)
    {
        var request = new
        {
            jsonrpc = "2.0",
            method = "item.create",
            params = new
            {
                name = key,
                key_ = key,
                hostid = await GetHostIdAsync(host),
                type = 2, // Zabbix agent
                value_type = 3, // Numeric unsigned
                interfaceid = await GetInterfaceIdAsync(host)
            },
            auth = _authToken,
            id = 1
        };
        
        var response = await _httpClient.PostAsJsonAsync($"{_apiUrl}/api_jsonrpc.php", request);
        response.EnsureSuccessStatusCode();
    }
}

Nagios

O que é: Sistema de monitoramento de infraestrutura clássico.

Características:

  • Plugin-based: Extensível via plugins
  • Configuração: Baseada em arquivos
  • Alertas: Flexíveis e customizáveis
  • Escalabilidade: Média

Quando usar:

  • Sistemas legacy
  • Quando precisa de controle granular
  • Monitoramento simples

2. Sistemas de Visualização e Dashboards

Grafana

O que é: Plataforma de visualização e analytics de dados.

Características:

  • Data Sources: Múltiplas fontes de dados
  • Dashboards: Altamente customizáveis
  • Alerting: Sistema de alertas integrado
  • Plugins: Extensível via plugins
  • Templates: Dashboards reutilizáveis

Funcionalidades:

  • Queries: Linguagem de consulta por data source
  • Variables: Variáveis dinâmicas
  • Annotations: Marcações temporais
  • Export: Exportação de dashboards
  • Sharing: Compartilhamento de dashboards

Quando usar:

  • Visualização de métricas de qualquer fonte
  • Dashboards operacionais
  • Analytics de dados temporais
  • Monitoramento de aplicações
csharp
// Exemplo: Enviando métricas para Grafana via Prometheus
public class PrometheusMetrics
{
    private readonly Counter _requestCounter;
    private readonly Histogram _responseTimeHistogram;
    private readonly Gauge _activeConnections;
    
    public PrometheusMetrics()
    {
        _requestCounter = Metrics.CreateCounter("http_requests_total", "Total HTTP requests", 
            new CounterConfiguration
            {
                LabelNames = new[] { "method", "endpoint", "status" }
            });
            
        _responseTimeHistogram = Metrics.CreateHistogram("http_request_duration_seconds", 
            "HTTP request duration", new HistogramConfiguration
            {
                LabelNames = new[] { "method", "endpoint" }
            });
            
        _activeConnections = Metrics.CreateGauge("active_connections", "Active connections");
    }
    
    public void RecordRequest(string method, string endpoint, int statusCode)
    {
        _requestCounter.WithLabels(method, endpoint, statusCode.ToString()).Inc();
    }
    
    public IDisposable MeasureRequestDuration(string method, string endpoint)
    {
        return _responseTimeHistogram.WithLabels(method, endpoint).NewTimer();
    }
    
    public void SetActiveConnections(int count)
    {
        _activeConnections.Set(count);
    }
}

3. APM (Application Performance Monitoring)

Datadog

O que é: Plataforma de observabilidade em nuvem.

Características:

  • APM: Distributed tracing automático
  • Infrastructure: Monitoramento de infraestrutura
  • Logs: Centralização e análise de logs
  • Synthetic: Testes sintéticos
  • Real User Monitoring: Performance do usuário final

Funcionalidades:

  • Auto-instrumentation: Instrumentação automática
  • Service Map: Mapa de serviços
  • Anomaly Detection: Detecção de anomalias
  • Correlation: Correlação entre logs, traces e métricas
  • Machine Learning: Insights automáticos

Quando usar:

  • Aplicações em nuvem
  • Microservices complexos
  • Quando precisa de observabilidade completa
  • Sistemas distribuídos
csharp
// Exemplo: Integração com Datadog APM
public class DatadogTracing
{
    private readonly IDatadogTracer _tracer;
    
    public DatadogTracing(IDatadogTracer tracer)
    {
        _tracer = tracer;
    }
    
    public async Task<Order> CreateOrderAsync(CreateOrderRequest request)
    {
        using var scope = _tracer.StartActiveSpan("order.create");
        
        try
        {
            scope.Span.SetTag("customer.id", request.CustomerId);
            scope.Span.SetTag("order.total", request.Total);
            
            var order = await _orderService.CreateAsync(request);
            
            scope.Span.SetTag("order.id", order.Id);
            return order;
        }
        catch (Exception ex)
        {
            scope.Span.SetTag("error", true);
            scope.Span.SetTag("error.message", ex.Message);
            throw;
        }
    }
}

Dynatrace

O que é: Plataforma de observabilidade enterprise.

Características:

  • AI-powered: Inteligência artificial integrada
  • Full-stack: Monitoramento completo da stack
  • Auto-discovery: Descoberta automática de dependências
  • Root Cause Analysis: Análise automática de causa raiz
  • Cloud-native: Otimizado para cloud

Funcionalidades:

  • OneAgent: Agente único para toda a stack
  • Davis AI: IA para análise de problemas
  • Service Flow: Visualização de fluxo de serviços
  • Smartscape: Mapa dinâmico da infraestrutura
  • Session Replay: Reprodução de sessões

Quando usar:

  • Aplicações enterprise
  • Quando precisa de análise automática
  • Sistemas complexos
  • Quando orçamento não é limitante
csharp
// Exemplo: Custom metrics com Dynatrace
public class DynatraceMetrics
{
    private readonly IDynatraceClient _dynatraceClient;
    
    public DynatraceMetrics(IDynatraceClient dynatraceClient)
    {
        _dynatraceClient = dynatraceClient;
    }
    
    public async Task SendCustomMetricAsync(string metricName, double value, Dictionary<string, string> dimensions = null)
    {
        var metric = new CustomMetric
        {
            Name = metricName,
            Value = value,
            Timestamp = DateTimeOffset.UtcNow,
            Dimensions = dimensions ?? new Dictionary<string, string>()
        };
        
        await _dynatraceClient.SendCustomMetricAsync(metric);
    }
    
    public async Task RecordBusinessTransactionAsync(string transactionName, TimeSpan duration)
    {
        await SendCustomMetricAsync("business.transaction.duration", duration.TotalMilliseconds, 
            new Dictionary<string, string> { ["transaction"] = transactionName });
    }
}

4. Sistemas de Logs

ELK Stack (Elasticsearch, Logstash, Kibana)

O que é: Stack completo para coleta, processamento e visualização de logs.

Componentes:

  • Elasticsearch: Motor de busca e armazenamento
  • Logstash: Processamento e transformação de logs
  • Kibana: Visualização e análise
  • Beats: Agentes de coleta de dados

Características:

  • Scalability: Altamente escalável
  • Search: Busca poderosa
  • Analytics: Análise avançada de logs
  • Visualization: Dashboards ricos
  • Alerting: Sistema de alertas

Quando usar:

  • Logs de alta volume
  • Análise complexa de logs
  • Quando precisa de busca avançada
  • Centralização de logs
csharp
// Exemplo: Structured logging para ELK
public class ElasticsearchLogger
{
    private readonly ILogger<ElasticsearchLogger> _logger;
    
    public ElasticsearchLogger(ILogger<ElasticsearchLogger> logger)
    {
        _logger = logger;
    }
    
    public void LogOrderCreated(Order order)
    {
        _logger.LogInformation("Order created {@Order}", new
        {
            order.Id,
            order.CustomerId,
            order.Total,
            order.Status,
            order.CreatedAt,
            Environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"),
            Service = "OrderService"
        });
    }
    
    public void LogError(Exception ex, string operation, object context = null)
    {
        _logger.LogError(ex, "Error in {Operation} {@Context}", operation, context);
    }
}

Seq

O que é: Sistema de logs estruturados para .NET.

Características:

  • Structured Logging: Logs estruturados nativos
  • .NET Native: Otimizado para .NET
  • Query Language: Linguagem de consulta SQL-like
  • Real-time: Visualização em tempo real
  • Alerts: Sistema de alertas integrado

Funcionalidades:

  • Live Tail: Visualização em tempo real
  • Dashboards: Dashboards customizáveis
  • API: API REST para integração
  • Plugins: Extensível via plugins
  • Multi-tenancy: Suporte a múltiplos tenants

Quando usar:

  • Aplicações .NET
  • Quando precisa de logs estruturados
  • Desenvolvimento local
  • Sistemas pequenos a médios
csharp
// Exemplo: Structured logging com Seq
public class SeqLogger
{
    private readonly ILogger<SeqLogger> _logger;
    
    public SeqLogger(ILogger<SeqLogger> logger)
    {
        _logger = logger;
    }
    
    public void LogUserAction(string userId, string action, object data)
    {
        _logger.LogInformation("User {UserId} performed {Action} {@Data}", 
            userId, action, data);
    }
    
    public void LogPerformance(string operation, TimeSpan duration, object context = null)
    {
        _logger.LogInformation("Performance: {Operation} took {Duration}ms {@Context}", 
            operation, duration.TotalMilliseconds, context);
    }
}

5. Sistemas de Métricas

Prometheus

O que é: Sistema de coleta e armazenamento de métricas.

Características:

  • Pull-based: Coleta por pull
  • Time Series: Banco de dados de séries temporais
  • PromQL: Linguagem de consulta
  • Alertmanager: Sistema de alertas
  • Service Discovery: Descoberta automática de serviços

Funcionalidades:

  • Scraping: Coleta automática de métricas
  • Recording Rules: Regras de agregação
  • Grafana Integration: Integração com Grafana
  • Exporters: Exportadores para diversos sistemas
  • High Availability: Alta disponibilidade

Quando usar:

  • Monitoramento de containers
  • Kubernetes
  • Microservices
  • Métricas de infraestrutura
csharp
// Exemplo: Métricas customizadas com Prometheus
public class PrometheusMetrics
{
    private readonly Counter _orderCounter;
    private readonly Histogram _orderValueHistogram;
    private readonly Gauge _activeUsers;
    
    public PrometheusMetrics()
    {
        _orderCounter = Metrics.CreateCounter("orders_total", "Total orders", 
            new CounterConfiguration
            {
                LabelNames = new[] { "status", "customer_type" }
            });
            
        _orderValueHistogram = Metrics.CreateHistogram("order_value", "Order values", 
            new HistogramConfiguration
            {
                LabelNames = new[] { "customer_type" }
            });
            
        _activeUsers = Metrics.CreateGauge("active_users", "Active users");
    }
    
    public void RecordOrder(Order order)
    {
        _orderCounter.WithLabels(order.Status, order.CustomerType).Inc();
        _orderValueHistogram.WithLabels(order.CustomerType).Observe(order.Total);
    }
    
    public void SetActiveUsers(int count)
    {
        _activeUsers.Set(count);
    }
}

📊 Comparação de Sistemas

SistemaTipoEscalabilidadeComplexidadeCustoMelhor Para
ZabbixInfrastructure MonitoringAltaMédiaBaixoInfraestrutura on-premise
GrafanaVisualizationAltaBaixaBaixoDashboards e visualização
DatadogAPMMuito AltaBaixaAltoCloud e microservices
DynatraceAPMMuito AltaBaixaMuito AltoEnterprise
ELK StackLoggingMuito AltaAltaMédioLogs complexos
SeqLoggingMédiaBaixaBaixoAplicações .NET
PrometheusMetricsAltaMédiaBaixoContainers e microservices

🔧 Implementação em .NET

Configuração de Logging Estruturado

csharp
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging(builder =>
        {
            builder.AddSeq(Configuration.GetSection("Seq"));
            builder.AddElasticsearch(Configuration.GetSection("Elasticsearch"));
            builder.AddConsole();
        });
    }
}

Middleware de Logging

csharp
public class RequestLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestLoggingMiddleware> _logger;
    
    public RequestLoggingMiddleware(RequestDelegate next, ILogger<RequestLoggingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }
    
    public async Task InvokeAsync(HttpContext context)
    {
        var sw = Stopwatch.StartNew();
        
        try
        {
            await _next(context);
        }
        finally
        {
            sw.Stop();
            
            _logger.LogInformation(
                "Request {Method} {Path} => {StatusCode} in {Elapsed}ms",
                context.Request.Method,
                context.Request.Path,
                context.Response.StatusCode,
                sw.ElapsedMilliseconds);
        }
    }
}

Health Checks

csharp
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHealthChecks()
            .AddCheck("database", () => CheckDatabase())
            .AddCheck("external-api", () => CheckExternalApi())
            .AddPrometheusGatewayPublisher();
    }
    
    private HealthCheckResult CheckDatabase()
    {
        try
        {
            // Verificar conexão com banco
            return HealthCheckResult.Healthy();
        }
        catch (Exception ex)
        {
            return HealthCheckResult.Unhealthy(ex.Message);
        }
    }
}

⚠️ Considerações Importantes

Performance

  • Sampling: Use sampling para logs de alta frequência
  • Buffering: Implemente buffering para métricas
  • Compression: Comprima logs para economizar espaço
  • Retention: Configure políticas de retenção

Segurança

  • Encryption: Criptografe dados sensíveis
  • Authentication: Implemente autenticação
  • Authorization: Controle de acesso granular
  • Audit: Logs de auditoria

Operacional

  • Alerting: Configure alertas adequados
  • Escalation: Políticas de escalação
  • Documentation: Documente dashboards e alertas
  • Training: Treine equipe no uso das ferramentas

📚 Recursos Adicionais

Ferramentas

  • Jaeger: Distributed tracing
  • Zipkin: Distributed tracing
  • Fluentd: Coleta de logs
  • Telegraf: Coleta de métricas
  • Alertmanager: Gerenciamento de alertas

Libraries .NET

  • Serilog: Structured logging
  • NLog: Logging framework
  • OpenTelemetry: Observability
  • Prometheus.NET: Métricas Prometheus
  • Datadog.Trace: APM Datadog

Livros Recomendados

  • "Observability Engineering"
  • "The Site Reliability Workbook"
  • "Monitoring Distributed Systems"
  • "Effective Monitoring and Alerting"