Exercício - Estenda 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. Esse recurso permite adicionar mais contexto aos dados de telemetria e criar consultas mais poderosas no Application Insights.

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

Criar uma métrica personalizada

Você deseja ter maior visibilidade de como uma ação muda ao longo do tempo, para criar uma métrica personalizada.

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

  2. No campo Nome do arquivo , digite 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 guardar o ficheiro.

  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 guardar o ficheiro.

  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 MapPut de estoque existente por este 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 a injeção de dependência para adicionar a ProductsMetrics classe ao ponto de extremidade. Em seguida, você está chamando o StockChange método para incrementar a métrica com o novo valor de estoque.

  10. Selecione Ctrl+S para guardar o ficheiro.

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 Diagnostics, 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 guardar o ficheiro.

Veja a nova métrica em Prometheus

  1. No painel TERMINAL na parte inferior, vá para 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 eShopLite aplicativo em um navegador em http://localhost:32000.

  5. Vá para a página Produtos e altere o valor do estoque de 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 Gráfico . Você deve ver o valor do estoque mudar ao longo do tempo.

    Screenshot that shows Prometheus showing the new custom metric on a graph.

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