Jaeger e Opentelemetry no .NET 6.0

OpenTelemetry é um framework de observabilidade para aplicações cloud-native agnóstico de fornecedores, com uma coleção de ferramentas para instrumentar, gerar, coletar e exportar dados de telemetria (metrics, logs e traces) que visa simplificar e a analisar o desempenho e o comportamento das suas aplicações.

Para visualização dos dados utilizaremos o Jaeger, um software open source para rastreamento de transações entre serviços distribuídos, utilizado para monitorar e fazer troubleshooting em aplicações baseados em microservices, além de analisar:

  • Propagação de contexto distribuídos
  • Causa raiz (de um incidente)
  • Dependências de serviços
  • Desempenho e latência

Neste exemplo, será configurado o OpenTelemetry no .NET 6.0 exportando dados para o Jaeger.

Pré-requisitos

API

Na aplicação, comece configurando o docker compose com a imagem do Jaeger:

version: '3.4'

services:
  jaeger: 
        image: jaegertracing/all-in-one:latest
        ports:
          - "5775:5775/udp"
          - "6831:6831/udp"
          - "6832:6832/udp"
          - "5778:5778"
          - "16686:16686"
          - "14268:14268"
          - "9411:9411"

Onde cada porta é utilizada em uma ação específica no Jaeger:

Depois é preciso configurar o appsettings.json com os dados para coleta dos logs:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "DistributedTracing": {
    "IsEnabled": true,
    "Jaeger": {
      "ServiceName": "Sample.OpenTelemetry.WebApi",
      "Host": "localhost",
      "Port": 6831
    }
  }
}

O próximo passo é configurar a classe Program.cs exportando a coleta de dados para o Jaeger:

A extensão AddOpenTelemetry contém o seguinte código:

Solução Completa

No final, temos a seguinte solução:

  • Sample.OpenTelemetry.WebAPI: API de exemplo com operações para coleta de logs.
  • Sample.OpenTelemetry.WebApi.Core: Abstrações genéricas utilizado pela API.
  • Docker: Docker compose com a imagem do Jaeger

Para realizar os testes é preciso executar o comando docker compose na pasta raiz do projeto:

docker-compose up

Em seguida, execute o projeto WebApi e realize operações com os endpoints para gerar telemetria no Jaeger:

Abra o navegador e digite http://localhost:16686 para acessar a aplicação Jaeger e verificar a telemetria gerada:

Analisando traces específicos, é possível entender toda stack executada com detalhes, como é o caso do rota logs/cidades, onde é feito uma requisição para outra API.

Finalizando

Neste post, apresentei de forma simples, como é possível configurar o OpenTelemetry no .NET 6.0 com o Jaeger, utilizado principalmente em ambientes distribuídos para acompanhamento e monitoramento de transações, sendo a opção mais fácil e acessível para iniciar a coleta de comportamentos das aplicações.

Mais informações em:

Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/sample-opentelemetry

3 comentários

  1. Excelente!

  2. Nao cosnigo fazer para um servidor que nao seja localhost, tem alguma dica?

    1. Olá Fabio

      Você pode subir a imagem do Jaeger em uma aplicação docker no Azure por exemplo, dessa forma consegue utilizar em aplicações distribuídas.

Deixe uma resposta