Exercício - Estenda 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. 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, e cria uma métrica personalizada.

  1. No painel EXPLORER , clique com o botão direito do rato na pasta Produtos e, em seguida, selecione Novo Ficheiro.

  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 stock que está a ser alterada através do serviço de produto.

  4. Selecione Ctrl+S para salvar o arquivo.

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

  6. Substitua o código AddObservability 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 classe ProductsMetrics 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 MapPut da atualização de stock 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();
    })      
    

    Utiliza-se a injeção de dependência para adicionar a classe ProductsMetrics ao endpoint. Em seguida, estás a chamar o método StockChange para incrementar a métrica com a nova quantidade de stock.

  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 Diagnostics, 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 em Prometheus

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

    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 a aplicação eShopLite num navegador em http://localhost:32000.

  5. Vá para a página Produtos e altere a quantidade em stock de vários produtos.

  6. Abra o painel 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 Graph. Deve observar a quantidade de estoque mudar ao longo do tempo.

    Captura de tela que mostra Prometheus mostrando a nova métrica personalizada em um gráfico.

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