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

Завершено

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

Откройте среду разработки и создайте ресурсы 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. В раскрывающемся списке Project выберите каталог по умолчанию.

Добавление пакетов 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. В области обозревателя разверните папку диагностики и выберите Diagnostics.csproj.

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

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

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

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

    <OutputType>Library</OutputType>
    

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

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

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

  1. В области обозревателя щелкните правой кнопкой мыши файл 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. В области обозревателя решений щелкните правой кнопкой мыши проект "Продукты" и выберите "Добавить ссылку на проект".

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

  8. В области обозревателя разверните папку "Продукты", а затем выберите Program.cs.

  9. В примечании // Add observability code hereкода добавьте вызов метода диагностики:

    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 ). Затем приложение запускается.

  3. Если вы выполняете это упражнение в пространстве кода, выберите вкладку PORTS в нижней части окна 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 в службу продуктов . В следующем уроке вы узнаете, как лучше использовать данные телеметрии, просматривая их на таких средствах, как Prometheus и Grafana.