Adición de observabilidad a una aplicación nativa de la nube

Completado

Ahora que comprende la importancia de la observabilidad, verá cómo puede incluirla en la aplicación nativa de la nube. Para realizar este paso, agregue OpenTelemetry a la aplicación.

Incorporación de OpenTelemetry a la aplicación

.NET tiene un amplio ecosistema de herramientas de observabilidad integradas que producen datos de registro, métricas y seguimiento. Puede usar estas herramientas para agregar observabilidad a la aplicación nativa de la nube. Estas bibliotecas son:

  • Registro: Microsoft.Extensions.Logging.ILogger
  • Métricas: System.Diagnostics.Metrics.Meter
  • Seguimiento: System.Diagnostics.Activity y System.Diagnostics.ActivitySource

OpenTelemetry consume todos los datos de telemetría anteriores, pero primero la aplicación nativa de la nube debe agregar compatibilidad con OpenTelemetry a través de paquetes NuGet. Estos paquetes se pueden clasificar en tres grupos:

Category Paquete Descripción
Core API OpenTelemetry La biblioteca principal que proporciona la funcionalidad principal de OpenTelemetry.
Core API OpenTelemetry.Extensions.Hosting Proporciona métodos de extensión para iniciar y detener automáticamente el seguimiento de OpenTelemetry en hosts de ASP.NET Core.
Instrumentación OpenTelemetry.Instrumentation.AspNetCore Instrumentación para aplicaciones ASP.NET Core. Este paquete recopila un gran número de métricas sobre la aplicación sin tener que escribir ningún código.
Exportador OpenTelemetry.Exporter.Console El exportador de la consola permite a la aplicación escribir datos de telemetría en la consola.

Hay muchos más paquetes de instrumentación y exportador disponibles para incluirlos en la aplicación nativa de la nube. Para más información, consulte Observabilidad de .NET con OpenTelemetry. Dependiendo del tipo de aplicación que esté compilando, puede agregar los paquetes más relevantes para usted.

Este módulo se centra en el uso de OpenTelemetry con la aplicación nativa de nube eShopLite. Esta aplicación se compila con .NET Core y Blazor WebAssembly, por lo que todos los ejemplos de código se basan en aprovechar la inserción de dependencias.

A diagram that shows the different OpenTelemetry components of the app.

Puede elegir incluir todos los paquetes OpenTelemetry en los servicios Productos y Store en la aplicación de microservicios. Sin embargo, en una aplicación real, tiene muchos más servicios. Agregar todos estos paquetes a cada uno implica una duplicación innecesaria. Un enfoque mejor consiste en agregar un nuevo proyecto de diagnóstico a la solución a la que cualquier microservicio pueda hacer referencia para que se pueda observar.

Este es un código de ejemplo que crea un método AddObservability al que un microservicio puede llamar para usar OpenTelemetry:

using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace Microsoft.Extensions.DependencyInjection;

public static class DiagnosticServiceCollectionExtensions
{
  public static IServiceCollection AddObservability(this IServiceCollection services,
      string serviceName,
      IConfiguration configuration)
  {
    // create the resource that references the service name passed in
    var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");

    // add the OpenTelemetry services
    var otelBuilder = services.AddOpenTelemetry();

    otelBuilder
        // add the metrics providers
        .WithMetrics(metrics =>
        {
          metrics
            .SetResourceBuilder(resource)
            .AddRuntimeInstrumentation()
            .AddAspNetCoreInstrumentation()
            .AddHttpClientInstrumentation()
            .AddEventCountersInstrumentation(c =>
            {
              c.AddEventSources(
                      "Microsoft.AspNetCore.Hosting",
                      "Microsoft-AspNetCore-Server-Kestrel",
                      "System.Net.Http",
                      "System.Net.Sockets");
            })
            .AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
            .AddConsoleExporter();

        })
        // add the tracing providers
        .WithTracing(tracing =>
        {
          tracing.SetResourceBuilder(resource)
                      .AddAspNetCoreInstrumentation()
                      .AddHttpClientInstrumentation()
                      .AddSqlClientInstrumentation();
        });

    return services;
  }

  // Add the Prometheus endpoints to your service, this will expose the metrics at http://service/metrics
  public static void MapObservability(this IEndpointRouteBuilder routes)
  {
    routes.MapPrometheusScrapingEndpoint();
  }
}

El método devuelve una clase IServiceCollection que se puede agregar como servicio a un ASP.NET Core WebApplicationBuilder.

A continuación, esta acción crea una variable var otelBuilder = services.AddOpenTelemetry() para almacenar el generador de OpenTelemetry. Después, el código puede agregar métricas y seguimientos a otelBuilder.

Por ejemplo, esta configuración agrega instrumentación para:

  • ASP.NET Core
  • C# Runtime
  • HttpClient
  • Servidor web Kestrel

Estas métricas se muestran en la consola. El método .AddConsoleExporter() agrega el exportador al generador.

También agrega seguimiento a la consola para:

  • ASP.NET Core
  • HttpClient
  • Cliente SQL

La última línea devuelve la clase IServiceCollection.

Una vez completado el proyecto de diagnóstico, es tan sencillo como agregar una referencia al proyecto y una sola línea de código al servicio. Por ejemplo, para incluir OpenTelemetry en el servicio Productos, agregue la referencia del proyecto en su archivo Product.csproj:

<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />

A continuación, agregue la siguiente línea al archivo Program.cs en la declaración de builder:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddObservability("Products", builder.Configuration);

Vamos a agregar este código a los servicios Productos en la aplicación eShopLite.