Ejercicio: extensión de la telemetría en .NET 8

Completado

La aplicación actual eShopLite usa la telemetría predeterminada proporcionada por OpenTelemetry. Puede ampliar la telemetría agregando métricas y atributos personalizados a los datos de telemetría. Esta capacidad o le permite agregar más contexto a los datos de telemetría y crear consultas más eficaces en Application Insights.

En este ejercicio, agregará nuevas métricas a las aplicaciones y verá cómo verlas en las aplicaciones de observabilidad.

Creación de una métrica personalizada

Quiere tener una mayor visibilidad de cómo cambia un stock a lo largo del tiempo, por lo que crea una métrica personalizada.

  1. En Visual Studio Code, en el panel EXPLORADOR, haga clic con el botón derecho en la carpeta Productos y seleccione Nuevo archivo.

  2. En el campo Nombre de archivo, introduzca ProductsMetrics.cs.

  3. En el editor de texto, reemplace el código por este ejemplo:

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

    El código anterior crea una nueva métrica denominada eshoplite.products.stock_change. Esta métrica realiza un seguimiento de la cantidad de existencias que se cambian a través del servicio de producto.

  4. Presione Ctrl+S para guardar el archivo.

  5. En el panel EXPLORADOR, en la carpeta Productos, seleccione Program.cs.

  6. Reemplace el código AddObservability por este código:

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

    Este código agrega la clase ProductsMetrics al contenedor de inserción de dependencias.

  7. Presione Ctrl+S para guardar el archivo.

  8. En el panel EXPLORADOR, en la carpeta Productos, expanda la carpeta Punto de conexión y, a continuación, seleccione ProductEndpoints.cs.

  9. Reemplace el punto de conexión de actualización MapPut de existencias 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 la inserción de dependencias para agregar la clase ProductsMetrics al punto de conexión. A continuación, va a llamar al método StockChange para incrementar la métrica con la nueva cantidad de existencias.

  10. Presione Ctrl+S para guardar el archivo.

Adición de la métrica a OpenTelemetry

Ahora agregará la métrica a OpenTelemetry para que se pueda exportar a las herramientas de observabilidad.

  1. En el panel EXPLORADOR, en la carpeta Diagnósticos, seleccione DiagnosticServiceCollectionExtensions.

  2. Cambie el método AddObservability para aceptar un nuevo parámetro:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Debajo de la línea exportadora de Prometheus, agregue este código:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Presione Ctrl+S para guardar el archivo.

Visualización de la nueva métrica en Prometheus

  1. En el panel TERMINAL de la parte inferior, vaya a la carpeta dotnet-observability/eShopLite.

    cd ..
    
  2. Actualice los contenedores de aplicaciones.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Vaya a la carpeta dotnet-observability e inicie la aplicación con Docker:

    cd ..
    docker compose up
    
  4. Abra la aplicación eShopLite en un explorador en http://localhost:32000.

  5. Vaya a la página Productos y cambie la cantidad de existencias en varios productos.

  6. Abra el panel de Prometheus en http://localhost:9090.

  7. En el cuadro de búsqueda, escriba la métrica eshoplite_products_stock_change_total y seleccione Ejecutar.

    Debería verlo en una tabla.

  8. Seleccione la pestaña Graph. Debería ver el cambio de la cantidad de existencias a lo largo del tiempo.

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

  9. En el panel TERMINAL, presione Ctrl+C para detener la aplicación.