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 personalizadas y atributos personalizados a los datos de telemetría. Esta funcionalidad 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 verlos 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 se crea una métrica personalizada.

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

  2. En el campo Nombre de archivo , escriba 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. Seleccione Ctrl+S para guardar el archivo.

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

  6. Reemplace el AddObservability código 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 ProductsMetrics clase al contenedor de inserción de dependencias.

  7. Seleccione 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 de existencias existente MapPut 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();
    })      
    

    Usa la inyecció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 stock.

  10. Seleccione Ctrl+S para guardar el archivo.

Adición de la métrica a OpenTelemetry

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

  1. En el panel EXPLORADOR , en la carpeta Diagnostics , seleccione DiagnosticServiceCollectionExtensions.

  2. Cambie el AddObservability método 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. Seleccione 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 eShopLite aplicación 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 laeshoplite_products_stock_change_total métrica y seleccione Ejecutar.

    Deberías verlo listado en una tabla.

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

    Captura de pantalla que muestra Prometheus en la que se muestra la nueva métrica personalizada en un gráfico.

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