Separe instrumentação, transporte e análise

OpenTelemetry fornece APIs, SDKs e convenções para gerar traces, métricas e logs. OTLP é um protocolo para transportar telemetria a um collector ou backend. Dynatrace pode receber e analisar dados de OpenTelemetry; o endpoint, protocolo, autenticação e suporte variam conforme o ambiente e devem seguir a configuração atual da plataforma.

Instrumentação consistente reduz dependência de um fornecedor, mas não elimina decisões sobre amostragem, retenção, custo, acesso e responsabilidade operacional. Para os conceitos de cada sinal, veja observabilidade em sistemas distribuídos.

Instrumente as fronteiras de entrada e saída

Em ASP.NET Core, instrumentações para servidor e cliente HTTP capturam requisições e chamadas externas. Adicione spans manuais somente quando o contexto de negócio não estiver visível de outra forma. Defina um nome de serviço estável, ambiente e versão de release para distinguir instâncias e comparar implantações.

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing => tracing
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddOtlpExporter())
    .WithMetrics(metrics => metrics
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddOtlpExporter());

O exemplo pressupõe os pacotes de instrumentação e exportação correspondentes, e que o endpoint OTLP seja configurado para o ambiente. Em produção, use o endpoint e o protocolo suportados pelo seu tenant ou collector, mantenha tokens em armazenamento de segredos e confirme conectividade TLS. Evite embutir credenciais no código.

Logs estruturados com Serilog

Serilog facilita a emissão de eventos estruturados em .NET. Preserve propriedades como nome da operação, ambiente e identificador de correlação, em vez de concatenar tudo numa mensagem textual. Integre o contexto de log com traces quando o pipeline escolhido suportar essa correlação:

builder.Host.UseSerilog((context, services, configuration) =>
    configuration
        .ReadFrom.Configuration(context.Configuration)
        .ReadFrom.Services(services)
        .Enrich.FromLogContext());

Escolha conscientemente como os logs chegam ao Dynatrace — por agente, collector ou exportador/sink compatível com a configuração adotada. Evite enviar o mesmo evento por vários caminhos sem necessidade, pois isso duplica ingestão e custo. Não registre tokens, dados pessoais sem justificativa, cabeçalhos completos ou payloads financeiros.

Cardinalidade, sampling e custos

Não use identificadores de usuário, pedido ou trace como labels de métricas: cada valor único aumenta séries e custo. Identificadores podem fazer sentido em logs ou traces sob política de acesso e retenção. Em alto volume, defina amostragem alinhada ao objetivo e preserve sinais de erros e latência conforme as capacidades do pipeline, reconhecendo que sampling pode omitir eventos.

Estabeleça limites de retenção e acesso por ambiente, aplique filtros antes da exportação quando necessário e valide que dados sensíveis não saem do perímetro aprovado. Instrumentação não deve degradar a aplicação quando o backend de telemetria fica indisponível.

Investigue com uma pergunta concreta

Comece pelo impacto: endpoint afetado, período, versão implantada e percentis de latência. Use métricas para localizar a mudança, trace para seguir a jornada entre serviços e logs para examinar eventos contextuais. Confirme se amostragem, relógios e propagação de contexto permitem relacionar os sinais; um correlation ID de negócio não substitui autenticação nem autorização.

Para chamadas instáveis, correlacione falhas e tentativas com as políticas Polly. Acompanhe também o pipeline e o rollout Kubernetes associados à versão investigada.

Documentação e leituras relacionadas