Добавление наблюдаемости в облачное приложение

Завершено

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

Добавление OpenTelemetry в приложение

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

  • Ведение журнала: Microsoft.Extensions.Logging.ILogger
  • Метрики: System.Diagnostics.Metrics.Meter
  • Трассировка: System.Diagnostics.Activity и System.Diagnostics.ActivitySource

OpenTelemetry использует все предыдущие данные телеметрии, но сначала ваше облачное приложение должно добавить поддержку OpenTelemetry через пакеты NuGet. Эти пакеты можно разделить на три группы:

Категория Пакет Description
Core API OpenTelemetry Основная библиотека, предоставляющая основные функции OpenTelemetry.
Core API OpenTelemetry.Extensions.Hosting Предоставляет методы расширения для автоматического запуска и остановки трассировки OpenTelemetry в ASP.NET узлах Core.
Инструментирование OpenTelemetry.Instrumentation.AspNetCore Инструментирование для приложений ASP.NET Core. Этот пакет собирает большое количество метрик о приложении без необходимости писать код.
Экспортер OpenTelemetry.Exporter.Console Экспортер консоли позволяет приложению записывать данные телеметрии в консоль.

Многие другие пакеты инструментирования и экспортера доступны для включения в облачное приложение. Дополнительные сведения см. в разделе о наблюдаемости .NET с помощью OpenTelemetry. В зависимости от типа создаваемого приложения можно добавить пакеты, наиболее важные для вас.

В этом модуле основное внимание уделяется использованию OpenTelemetry с приложением eShopLite для облака. Это приложение создано с помощью .NET Core и Blazor WebAssembly, поэтому это означает, что все примеры кода основаны на использовании внедрения зависимостей.

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

Вы можете включить все OpenTelemetry пакеты в службы "Продукты " и "Магазин " в приложение микрослужб. Однако в реальном приложении у вас есть много служб. Добавление всех этих пакетов к каждому из них включает в себя ненужное дублирование. Лучший подход заключается в добавлении нового проекта диагностика в решение, на которое может ссылаться любая микрослужба.

Ниже приведен пример кода, который создает метод AddObservability , который микрослужба может вызывать для использования 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();
  }
}

Метод возвращает IServiceCollection класс, который можно добавить как службу в ASP.NET Core WebApplicationBuilder.

Затем это действие создает переменную var otelBuilder = services.AddOpenTelemetry() для хранения построителя OpenTelemetry. Затем код может добавлять в нее метрики и трассировки otelBuilder.

Например, эта конфигурация добавляет инструментирование для:

  • ASP.NET Core
  • Среда выполнения C#
  • HttpCLient
  • Веб-сервер Kestrel

Эти метрики отображаются в консоли. Метод .AddConsoleExporter() добавляет экспортера в построитель.

Она также добавляет трассировку в консоль для:

  • ASP.NET Core
  • HttpClient
  • Клиент SQL

Последняя строка возвращает IServiceCollection класс.

После завершения диагностического проекта просто добавить ссылку на проект и одну строку кода в службу. Например, чтобы включить OpenTelemetry в службу продуктов , добавьте ссылку на проект в Product.csproj файл:

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

Затем добавьте следующую строку в Program.cs файл под объявлением builder:

var builder = WebApplication.CreateBuilder(args);

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

Давайте добавим этот код в службы Products в приложении eShopLite .