Exercício – Estender a telemetria no .NET 8

Concluído

O aplicativo atual eShopLite está usando a telemetria padrão fornecida pelo OpenTelemetry. Você pode estender a telemetria adicionando métricas personalizadas e atributos personalizados aos dados de telemetria. Essa funcionalidade permite que você adicione mais contexto aos dados de telemetria e crie consultas mais avançadas no Application Insights.

Neste exercício, você adiciona novas métricas aos aplicativos e vê como exibi-las em seus aplicativos de observabilidade.

Criar uma métrica personalizada

Você quer ter maior visibilidade de como uma ação muda ao longo do tempo, então cria uma métrica personalizada.

  1. No painel EXPLORER , clique com o botão direito do mouse na pasta Produtos e selecione Novo Arquivo.

  2. No campo Nome do arquivo , insira ProductsMetrics.cs.

  3. No editor de texto, substitua o código por este exemplo:

    using System;
    using System.Diagnostics.Metrics;
    
    public class ProductsMetrics
    {
        private readonly Counter<int> _serviceCalls;
        private readonly Counter<int> _stockChange;
    
        public ProductsMetrics(IMeterFactory meterFactory)
        {
            var meter = meterFactory.Create("eShopLite.Products");
            _stockChange = meter.CreateCounter<int>("eshoplite.products.stock_change", unit: "{stock}", description: "Amount of stock being changed through the product service.");
        }
    
        public void StockChange(int quantity)
        {
            _stockChange.Add(quantity);
        }
    }
    

    O código anterior cria uma nova métrica chamada eshoplite.products.stock_change. Essa métrica rastreia a quantidade de estoque que está sendo alterada por meio do serviço do produto.

  4. Selecione Ctrl+S para salvar o arquivo.

  5. No painel EXPLORER , na pasta Produtos , selecione Program.cs.

  6. Substitua o AddObservability código por este código:

    builder.Services.AddObservability("Products", builder.Configuration, ["eShopLite.Products"]);
    
    // Register the metrics service.
    builder.Services.AddSingleton<ProductsMetrics>();
    

    Esse código adiciona a ProductsMetrics classe ao contêiner de injeção de dependência.

  7. Selecione Ctrl+S para salvar o arquivo.

  8. No painel EXPLORER , na pasta Produtos , expanda a pasta Ponto de Extremidade e selecione ProductEndpoints.cs.

  9. Substitua o ponto de extremidade de atualização de estoque existente MapPut por esse código:

    stock.MapPut("/{id}", async  (int id, int stockAmount, ProductDataContext db, ProductsMetrics metrics) =>
    {
        // Increment the stock change metric.
        metrics.StockChange(stockAmount);
    
        var affected = await db.Product
            .Where(model => model.Id == id)
            .ExecuteUpdateAsync(setters => setters
              .SetProperty(m => m.Stock, stockAmount)
            );
    
        return affected == 1 ? Results.Ok() : Results.NotFound();
    })      
    

    Use injeção de dependência para adicionar a classe ProductsMetrics ao ponto de extremidade. Em seguida, você está chamando o método StockChange para incrementar a métrica com a nova quantidade de estoque.

  10. Selecione Ctrl+S para salvar o arquivo.

Adicionar a métrica ao OpenTelemetry

Agora você adiciona a métrica ao OpenTelemetry para que ela possa ser exportada para suas ferramentas de observabilidade.

  1. No painel EXPLORER , na pasta Diagnóstico , selecione DiagnosticServiceCollectionExtensions.

  2. Altere o AddObservability método para aceitar um novo parâmetro:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Abaixo da linha do exportador Prometheus, adicione este código:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Selecione Ctrl+S para salvar o arquivo.

Veja a nova métrica no Prometheus

  1. No painel TERMINAL na parte inferior, acesse a pasta dotnet-observability/eShopLite.

    cd ..
    
  2. Atualize os contêineres de aplicativos.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Vá para a pasta dotnet-observability e inicie o aplicativo com o Docker:

    cd ..
    docker compose up
    
  4. Abra o aplicativo eShopLite no navegador em http://localhost:32000.

  5. Vá para a página Produtos e altere o valor do estoque em vários produtos.

  6. Abra o painel do Prometheus em http://localhost:9090.

  7. Na caixa de pesquisa, insira aeshoplite_products_stock_change_total métrica e selecione Executar.

    Você deve vê-lo listado em uma tabela.

  8. Selecione a guia Grafo . Você deve ver a alteração do valor das ações ao longo do tempo.

    Captura de tela que mostra o Prometheus mostrando a nova métrica personalizada em um grafo.

  9. No painel TERMINAL , pressione Ctrl+C para interromper o aplicativo.