Ćwiczenie — rozszerzanie telemetrii na platformie .NET 8

Ukończone

Bieżąca eShopLite aplikacja używa domyślnej telemetrii udostępnianej przez bibliotekę OpenTelemetry. Dane telemetryczne można rozszerzyć, dodając metryki niestandardowe i atrybuty niestandardowe do danych telemetrycznych. Ta funkcja umożliwia dodanie większego kontekstu do danych telemetrycznych i utworzenie bardziej zaawansowanych zapytań w usłudze Application Szczegółowe informacje.

W tym ćwiczeniu dodasz nowe metryki do aplikacji i zobaczysz, jak wyświetlać je w aplikacjach do obserwacji.

Utwórz nową metrykę niestandardową

Chcesz mieć większy wgląd w zmianę zapasów w czasie, aby utworzyć niestandardową metrykę.

  1. W programie Visual Studio Code w okienku EKSPLORATOR kliknij prawym przyciskiem myszy folder Products , a następnie wybierz pozycję Nowy plik.

  2. W polu Nazwa pliku wprowadź ProductsMetrics.cs.

  3. W edytorze tekstów zastąp kod następującym przykładem:

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

    Powyższy kod tworzy nową metrykę o nazwie eshoplite.products.stock_change. Ta metryka śledzi ilość zapasów zmienianych przez usługę produktu.

  4. Naciśnij klawisze Ctrl+S, aby zapisać plik.

  5. W okienku EKSPLORATOR w folderze Products wybierz pozycję Program.cs.

  6. Zastąp AddObservability kod następującym kodem:

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

    Ten kod dodaje klasę ProductsMetrics do kontenera wstrzykiwania zależności.

  7. Naciśnij klawisze Ctrl+S, aby zapisać plik.

  8. W okienku EKSPLORATOR w folderze Products rozwiń folder Endpoint, a następnie wybierz pozycję ProductEndpoints.cs.

  9. Zastąp istniejący punkt końcowy aktualizacji MapPut zapasów następującym kodem:

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

    Wstrzykiwanie zależności służy do dodawania ProductsMetrics klasy do punktu końcowego. Następnie wywołujesz metodę StockChange w celu przyrostowania metryki przy użyciu nowej kwoty zapasów.

  10. Naciśnij klawisze Ctrl+S, aby zapisać plik.

Dodawanie metryki do elementu OpenTelemetry

Teraz dodasz metryki do usługi OpenTelemetry, aby można ją było wyeksportować do narzędzi do obserwacji.

  1. W okienku EKSPLORATOR w folderze Diagnostyka wybierz pozycję DiagnosticServiceCollectionExtensions.

  2. Zmień metodę tak, aby akceptowała AddObservability nowy parametr:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Poniżej linii eksportera Prometheus dodaj następujący kod:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Naciśnij klawisze Ctrl+S, aby zapisać plik.

Wyświetlanie nowej metryki w rozwiązaniu Prometheus

  1. W okienku TERMINAL w dolnej części przejdź do folderu dotnet-observability/eShopLite.

    cd ..
    
  2. Aktualizowanie kontenerów aplikacji.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Przejdź do folderu dotnet-observability i uruchom aplikację za pomocą platformy Docker:

    cd ..
    docker compose up
    
  4. Otwórz aplikację eShopLite w przeglądarce pod adresem http://localhost:32000.

  5. Przejdź do strony Produkty i zmień kwotę zapasów na kilku produktach.

  6. Otwórz pulpit nawigacyjny rozwiązania Prometheus pod adresem http://localhost:9090.

  7. W polu wyszukiwania wprowadź metrykęeshoplite_products_stock_change_total , a następnie wybierz pozycję Wykonaj.

    Powinna zostać wyświetlona w tabeli.

  8. Wybierz kartę Graf . Powinna zostać wyświetlona zmiana ilości akcji w czasie.

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

  9. W okienku TERMINAL naciśnij klawisze Ctrl+C , aby zatrzymać aplikację.