Exercício - Estender a telemetria no .NET 8

Concluído

O aplicativo eShopLite atual 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 adicionar mais contexto aos dados de telemetria e criar consultas mais avançadas no Application Insights.

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

Criar uma métrica personalizada

Você deseja ter maior visibilidade de como um estoque muda ao longo do tempo, para poder 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, 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 acima cria uma 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 código AddObservability pelo código a seguir:

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

    Este código adiciona a classe ProductsMetrics no 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 MapPut de atualização 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 classe ProductsMetrics ao ponto de extremidade. Em seguida, você está chamando o método StockChange para incrementar a métrica com o novo valor de estoque.

  10. Selecione Ctrl+S para salvar o arquivo.

Adicionar a métrica ao OpenTelemetry

Agora você adicionará 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 método AddObservability 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. Na parte inferior do painel TERMINAL, 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 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 a métrica eshoplite_products_stock_change_total e selecione Executar.

    Ela deve aparecer listada em uma tabela.

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

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

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