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

Завершено

В этом упражнении вы добавите новый диагностический проект в решение eShopLite. Вы увидите, как добавить пакеты NuGet OpenTelemetry, а затем добавить наблюдаемость в сервис Products.

Откройте среду разработки и создайте ресурсы Azure

Вы можете использовать пространство кода GitHub, в котором размещено упражнение или выполнить упражнение локально в Visual Studio Code.

Чтобы использовать пространство кода, создайте предварительно настроенное пространство кода GitHub с помощью этого шаблона создания Codespace.

Этот шаг занимает несколько минут, пока GitHub создает и настраивает пространство кода. После завершения процесса вы увидите файлы кода для упражнения. Код, используемый для остальной части этого модуля, находится в каталоге /dotnet-observability.

Чтобы использовать Visual Studio Code, клонируйте репозиторий https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative на локальный компьютер. Тогда:

  1. Установите все системные требования для запуска контейнера разработки в Visual Studio Code.
  2. Убедитесь, что Docker запущен.
  3. В новом окне Visual Studio Code откройте папку клонированного репозитория
  4. Нажмите клавиши Ctrl+Shift+P, чтобы открыть палитру команд.
  5. Поиск: контейнеры разработки: перестроение и повторное открытие в контейнере >
  6. Выберите eShopLite — dotnet-observability из раскрывающегося списка. Visual Studio Code создает контейнер разработки локально.

Добавление диагностического проекта в решение

Первым шагом к добавлению наблюдаемости в приложение eShopLite является введение нового диагностического проекта в решение. Этот проект содержит все пакеты и конфигурации OpenTelemetry, которые будут использоваться для добавления наблюдаемости в приложение.

  1. В палитре команд Visual Studio Code введите >.NET: open Solution.
  2. Выберите dotnet-observability/eShopLite/eShopLite.sln.
  3. В обозревателя решенийв нижней части области обозревателя щелкните правой кнопкой мыши решение eShopLite, а затем выберите Новый проект.
  4. В диалоговом окне "Выбор шаблона для создания нового проекта .NET" выберите "Библиотека классов (Common, Library)".
  5. В поле Имя введите диагностика.
  6. В раскрывающемся списке выберите "Создать проект", а затем выберите "Каталог по умолчанию ".

Добавление пакетов OpenTelemetry

Теперь добавьте пакеты OpenTelemetry в новый проект диагностики.

  1. С помощью области терминала, расположенной в нижней части Visual Studio Code, перейдите в папку проекта Диагностика.

    cd dotnet-observability/eShopLite/Diagnostics
    
  2. Выполните следующие команды dotnet add:

    dotnet add package OpenTelemetry.Exporter.Console
    dotnet add package OpenTelemetry.Extensions.Hosting
    dotnet add package OpenTelemetry.Instrumentation.AspNetCore
    dotnet add package OpenTelemetry.Instrumentation.EventCounters --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Runtime
    dotnet add package OpenTelemetry.Instrumentation.SqlClient --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Http
    
  3. В области EXPLORER разверните папку Diagnostics, а затем выберите Diagnostics.csproj.

  4. Измените Project Sdk в верхней части на:

    <Project Sdk="Microsoft.NET.Sdk.Web">
    

    Приведенный выше код позволяет использовать класс IConfiguration в коде.

  5. Добавьте выходной тип в <PropertyGroup>:

    <OutputType>Library</OutputType>
    

    Приведенный выше код гарантирует, что проект выполняет сборку в виде библиотеки. В противном случае компилятор ожидает файл Program.cs с методом main.

Добавление кода для использования OpenTelemetry

При добавлении пакетов OpenTelemetry теперь вы вводите код для их использования.

  1. В области EXPLORER щелкните правой кнопкой мыши файл Class1.cs и выберите Переименовать.

  2. Переименуйте файл в DiagnosticServiceCollectionExtensions.cs.

  3. Замените код в файле следующим кодом:

    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;
      }
    }
    
  4. В области терминала выполните следующую команду, чтобы создать проект:

    dotnet build
    

    Вы должны увидеть выходные данные, аналогичные этому примеру:

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
  5. Проект диагностики теперь готов к использованию сервисом продуктов.

  6. На панели EXPLORER, в окне SOLUTION EXPLORER, щелкните правой кнопкой мыши на проекте Продукты и выберите Добавить ссылку на проект.

  7. Выберите Диагностика.

  8. В области обозревателя разверните папку Products и выберите Program.cs.

  9. Под комментарием к коду // Add observability code hereдобавьте вызов метода Diagnostics:

    builder.Services.AddObservability("Products", builder.Configuration);
    
  10. В панели ТЕРМИНАЛ перейдите в папку Продукты:

    cd ../Products
    
  11. Выполните следующую команду, чтобы создать проект:

    dotnet build
    

    Вы должны увидеть выходные данные, аналогичные этому примеру:

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    

Обновление параметров Docker и запуск приложения

  1. В области ТЕРМИНАЛ перейдите к корню папки dotnet-observability.

    cd ..
    dotnet publish /p:PublishProfile=DefaultContainer
    
  2. Выполните следующие команды Docker:

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/
    docker compose up 
    

    Должны создаваться серверные контейнеры (продукты службы) и внешний (store service). Затем приложение запускается.

  3. Если вы выполняете это упражнение в пространстве кода, выберите вкладку ПОРТЫ в нижней части окна Visual Studio Code. Щелкните ссылку Открыть в браузере рядом со службой Фронтенд.

  4. Если вы выполняете это упражнение локально в Visual Studio Code, в новой вкладке браузера откройте приложение по адресу http://localhost:32000.

  5. В приложении выберите Продукты на панели навигации.

    Снимок экрана, на котором показана страница

  6. Выберите обновить запасы для нескольких товаров. Затем в диалоговом окне измените стоимость акций и выберите Обновить.

  7. Перейдите на вкладку терминала и прокрутите сообщения. Обратите внимание, что есть сообщения из OpenTelemetry, такие как:

    backend-1   | Export ec.Microsoft-AspNetCore-Server-Kestrel.connection-queue-length, Meter: OpenTelemetry.Instrumentation.EventCounters/1.5.1.1
    backend-1   | (2023-11-09T19:55:14.8933518Z, 2023-11-09T20:04:44.8596671Z] http.request.method: PUT http.response.status_code: 200 http.route: /api/Stock/{id} network.protocol.name: http network.protocol.version: 1.1 url.scheme: http Histogram      
    backend-1   | Value: Sum: 0.05144170000000001 Count: 4 Min: 0.0039736 Max: 0.0359739
    
  8. Чтобы остановить приложение, нажмите клавиши CTRL+C.

Вы успешно добавили OpenTelemetry в службу Products. В следующем уроке вы узнаете, как лучше использовать данные телеметрии, просматривая их на таких средствах, как Prometheus и Grafana.