Упражнение. Расширение телеметрии в .NET 8

Завершено

Текущее eShopLite приложение использует телеметрию по умолчанию, предоставляемую OpenTelemetry. Вы можете расширить данные телеметрии, добавив пользовательские метрики и настраиваемые атрибуты в данные телеметрии. Эта возможность позволяет добавлять дополнительные контексты в данные телеметрии и создавать более мощные запросы в приложении Аналитика.

В этом упражнении вы добавите новые метрики в приложения и узнаете, как просматривать их в приложениях для наблюдения.

Создание пользовательской метрики

Вы хотите иметь большую видимость того, как акции изменяются со временем, поэтому вы создаете пользовательскую метрику.

  1. В Visual Studio Code в области обозревателя щелкните правой кнопкой мыши папку "Продукты " и выберите "Создать файл".

  2. В поле "Имя файла" введите ProductsMetrics.cs.

  3. В текстовом редакторе замените код следующим примером:

    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);
        }
    }
    

    Предыдущий код создает новую метрику с именем eshoplite.products.stock_change. Эта метрика отслеживает объем акций, изменяемых через службу продуктов.

  4. Нажмите клавиши CTRL+S, чтобы сохранить файл.

  5. В области обозревателя в папке "Продукты" выберите Program.cs.

  6. Замените AddObservability код следующим кодом:

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

    Этот код добавляет класс в ProductsMetrics контейнер внедрения зависимостей.

  7. Нажмите клавиши CTRL+S, чтобы сохранить файл.

  8. В области обозревателя в папке "Продукты" разверните папку Endpoint и выберите ProductEndpoints.cs.

  9. Замените существующую конечную точку обновления MapPut акций следующим кодом:

    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();
    })      
    

    Внедрение зависимостей используется для добавления ProductsMetrics класса в конечную точку. Затем вы вызываете StockChange метод для увеличения метрики с новой суммой акций.

  10. Нажмите клавиши CTRL+S, чтобы сохранить файл.

Добавление метрики в OpenTelemetry

Теперь вы добавите метрику в OpenTelemetry, чтобы ее можно было экспортировать в средства наблюдаемости.

  1. В области обозревателя в папке диагностики выберите DiagnosticsServiceCollectionExtensions.

  2. Измените метод, AddObservability чтобы принять новый параметр:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Под строкой экспортера Prometheus добавьте следующий код:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Нажмите клавиши CTRL+S, чтобы сохранить файл.

Просмотр новой метрики в Prometheus

  1. В области терминала в нижней части перейдите в папку dotnet-observability/eShopLite.

    cd ..
    
  2. Обновите контейнеры приложений.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Перейдите в папку dotnet-observability и запустите приложение с помощью Docker:

    cd ..
    docker compose up
    
  4. eShopLite Откройте приложение в браузереhttp://localhost:32000.

  5. Перейдите на страницу "Продукты" и измените сумму акций на несколько продуктов.

  6. Откройте панель мониторинга Prometheus по адресуhttp://localhost:9090.

  7. В поле поиска введите метрикуeshoplite_products_stock_change_total и нажмите кнопку "Выполнить".

    Он должен отображаться в таблице.

  8. Перейдите на вкладку Graph . С течением времени вы увидите изменение суммы акций.

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

  9. В области ТЕРМИНАЛА нажмите клавиши CTRL+C, чтобы остановить приложение.