Упражнение. Использование данных OpenTelemetry в облачном приложении

Завершено

В этом упражнении вы получите более высокую видимость всех данных, созданных OpenTelemetry в приложении. Вы завершите добавление диагностика возможности в службу Store. На этом месте вы добавите Prometheus и Grafana в eShopLite службы и посмотрите на некоторые метрики, которые фиксируются. Следующим шагом является добавление Zipkin и просмотр распределенных трассировок. Наконец, вы добавляете приложение Аналитика в приложение и используете его для просмотра данных.

Добавление Prometheus и Grafana

Prometheus и Grafana предоставляют образы Docker, которые упрощают их добавление в проекты. Вы включаете их в файл docker-compose.yml в корне решения.

  1. В Visual Studio Code на панели обозревателя выберите файл docker-compose.yml .

  2. Добавьте этот YAML в нижней части файла:

      prometheus:
        image: prom/prometheus
        container_name: prometheus
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
        ports:
          - 9090:9090
        restart: unless-stopped
        volumes:
          - ./prometheus:/etc/prometheus
    
      grafana:
        image: grafana/grafana
        container_name: grafana
        ports:
          - 3000:3000
        restart: unless-stopped
        environment:
          - GF_SECURITY_ADMIN_USER=admin
          - GF_SECURITY_ADMIN_PASSWORD=grafana
        volumes:
          - ./grafana/datasource:/etc/grafana/provisioning/datasources
    

Предыдущий yaml Docker добавляет две новые службы, Prometheus и Grafana. Раздел Prometheus настраивает контейнер для реагирования на порт 9090. Он сопоставляет папку prometheus , ожидающую prometheus.yml файла. Раздел Grafana настраивает контейнер для реагирования на порт 3000. Он сопоставляет три папки внутри папки grafana .

Настройка Prometheus

Prometheus необходимо настроить таким образом, чтобы он знал, где собирать метрики. Вы добавляете файл prometheus.yml в папку prometheus .

  1. В Visual Studio Code на панели обозревателя щелкните правой кнопкой мыши папку dotnet-observability и выберите "Создать папку".

  2. В поле имени введитеprometheus.

  3. В области обозревателя щелкните правой кнопкой мыши папку prometheus и выберите новый файл.

  4. В поле имени введите prometheus.yml.

  5. В редакторе файлов введите этот YAML:

    global:
      scrape_interval: 1s
    
    scrape_configs:
      - job_name: 'products'
        static_configs:
          - targets: ['backend:8080']
      - job_name: 'store'
        static_configs:
          - targets: ['frontend:8080']
    

    Предыдущий YAML настраивает Prometheus на удаление метрик из внутренних и интерфейсных служб. Так как приложение работает в Docker, имена узлов — это имена служб.

  6. Нажмите клавиши CTRL+S, чтобы сохранить файл.

Настройка Grafana

Grafana необходимо настроить таким образом, чтобы он знал, где собирать метрики.

  1. В Visual Studio Code на панели обозревателя щелкните правой кнопкой мыши папку dotnet-observability и выберите "Создать папку".

  2. В поле имени введите grafana.

  3. Щелкните правой кнопкой мыши папку grafana и выберите "Создать папку".

  4. В поле имени введите источник данных.

  5. Щелкните правой кнопкой мыши папку grafana и выберите "Создать папку".

  6. В поле имени введите панель мониторинга.

  7. Разверните папку grafana, щелкните правой кнопкой мыши папку источника данных и выберите новый файл.

  8. В поле имени введите datasource.yml.

  9. На вкладке редактора введите этот YAML:

    apiVersion: 1
    
    datasources:
    - name: Prometheus
      type: prometheus
      url: http://prometheus:9090 
      isDefault: true
      access: proxy
      editable: true
    

    Предыдущий YAML настраивает Grafana для использования Prometheus в качестве источника данных.

  10. Нажмите клавиши CTRL+S, чтобы сохранить файл.

Обновите приложение ASP.NET Core, чтобы предоставить метрики для Prometheus

Теперь проект диагностика настроен только для предоставления метрик консоли. Вместо этого вы обновите проект, чтобы предоставить метрики Prometheus.

  1. В Visual Studio Code в нижней части области терминала перейдите в папку диагностики.

  2. Выполните следующую команду:

    cd .\eShopLite\Diagnostics\ 
    
  3. OpenTelemetry.Exporter.Console Удалите пакет:

    dotnet remove package OpenTelemetry.Exporter.Console
    
  4. OpenTelemetry.Exporter.Prometheus.AspNetCore Добавьте пакет:

    dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore --prerelease
    
  5. В области обозревателя разверните папку диагностики и выберите DiagnosticServiceCollectionExtensions.cs.

  6. Замените экспортер .AddConsoleExporter(); консоли следующим кодом:

    .AddPrometheusExporter();
    
  7. В нижней части файла до последнего }добавьте следующий код:

    public static void MapObservability(this IEndpointRouteBuilder routes)
    {
      routes.MapPrometheusScrapingEndpoint();
    }
    

    Этот код добавляет конечную точку очистки Prometheus в каждую службу, которая включает это с приложением. Это позволяет Prometheus сломать метрики http://service/metrics.

  8. Нажмите клавиши CTRL+S, чтобы сохранить файл.

Предоставление метрик в службе Store

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

  1. В области обозревателя решений щелкните правой кнопкой мыши проект Магазина и выберите "Добавить ссылку на проект".

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

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

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

    builder.Services.AddObservability("Store", builder.Configuration);
    
  5. Перед методом app.Run() добавьте следующий код:

    app.MapObservability();
    

    Этот метод добавляет конечную точку очистки Prometheus в службу Store .

  6. Нажмите клавиши CTRL+S, чтобы сохранить файл.

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

  8. Перед методом app.Run() добавьте следующий код:

    app.MapObservability();
    

    Этот метод добавляет конечную точку очистки Prometheus в службу products .

  9. Нажмите клавиши CTRL+S, чтобы сохранить файл.

Тестирование новых функций наблюдаемости

Теперь вы протестируете новые функции наблюдаемости, добавленные в приложение.

  1. В области терминала в нижней части перейдите в папку dotnet-observability/eShopLite.

    cd ..
    
  2. Обновите контейнеры приложений.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Перейдите в папку dotnet-observability и запустите приложение с помощью Docker:

    cd ..
    docker compose up
    
  4. На вкладке "ПОРТЫ" выберите "Открыть в браузере для Prometheus" (9090). Если вы работаете локально в Visual Studio Code, откройте браузер и на новой вкладке перейдите в приложение http://localhost:9090Prometheus.

  5. В верхнем меню выберите "Состояние " и выберите "Целевые объекты".

    Screenshot that shows the configured Prometheus app showing the health of the eShopLite app.

    Вы увидите службы продуктов и магазинов , перечисленные как UP.

  6. На вкладке "ПОРТЫ" выберите "Открыть в браузере для Grafana" (3000). Если вы работаете локально в Visual Studio Code, откройте браузер и на новой вкладке перейдите в приложение http://localhost:3000Grafana.

  7. Введите администратора имени пользователя.

  8. Введите пароль grafana.

  9. Выберите " Создать первую панель мониторинга".

  10. Выберите " Импортировать панель мониторинга".

  11. На новой вкладке перейдите на GitHub и откройте файл json панели мониторинга ASP.NET Core.

  12. Скопируйте необработанный файл.

  13. Вставьте JSON в текстовое поле импорта с помощью текстового поля модели JSON панели мониторинга.

  14. Выберите Загрузить.

  15. В раскрывающемся списке источника данных Prometheus выберите Prometheus.

  16. Выберите Импорт.

    Screenshot that shows an ASP.NET dashboard in Grafana.

    Вы увидите панель мониторинга, на которой отображаются метрики для служб Продуктов и Магазинов . Выберите задание для изменения между двумя службами.

  17. В области ТЕРМИНАЛА нажмите клавиши CTRL+C, чтобы остановить приложение.

Добавление Zipkin

Теперь вы расширяете возможности трассировки приложения, добавив Zipkin. Как и раньше, вы добавите в приложение контейнер Zipkin и настройте его для подключения к сборщику OpenTelemetry. Затем вы добавите в приложение экспортера Zipkin OpenTelemetry.

  1. В Visual Studio Code на панели обозревателя выберите файл docker-compose.yml в папке dotnet-observability .

  2. Добавьте prometheus и zipkin в depends_on поле frontendдля .

    depends_on: 
      - backend
      - prometheus
      - zipkin 
    
  3. Добавьте prometheus в depends_on поле backendдля .

     depends_on: 
       - prometheus
    
  4. Добавьте переменные среды для Zipkin в ОБАfrontend и backend:

    environment: 
      - ZIPKIN_URL=http://zipkin:9411    
    

    Две службы должны выглядеть следующим образом:

    frontend:
      image: storeimage
      build:
        context: .
        dockerfile: ./eShopLite/Store/Dockerfile
      environment: 
        - ProductEndpoint=http://backend:8080
        - ZIPKIN_URL=http://zipkin:9411
      ports:
        - "32000:8080"
      depends_on: 
        - backend
        - prometheus
        - zipkin
    
    backend:
      image: productservice
      build: 
        context: .
        dockerfile: ./eShopLite/Products/Dockerfile
      environment: 
        - ZIPKIN_URL=http://zipkin:9411
    
      ports: 
        - "32001:8080"
      depends_on: 
        - prometheus    
    
  5. Добавьте этот YAML в нижней части файла:

      zipkin:
        image: openzipkin/zipkin
        ports:
          - 9411:9411
    

    Предыдущий YAML добавляет в приложение контейнер Zipkin. Он настраивает контейнер Zipkin для реагирования на порт 9411.

  6. Нажмите клавиши CTRL+S, чтобы сохранить файл.

  7. На панели терминала перейдите в папку диагностики.

    cd ./eShopLite/Diagnostics/
    
  8. Добавьте пакеты экспорта Zipkin.

    dotnet add package OpenTelemetry.Exporter.Zipkin --prerelease
    
  9. В области обозревателя разверните папку диагностики и выберите DiagnosticServiceCollectionExtensions.cs.

  10. В нижней части поставщиков трассировки добавьте Zipkin:

    // add the tracing providers
    .WithTracing(tracing =>
    {
      tracing.SetResourceBuilder(resource)
                  .AddAspNetCoreInstrumentation()
                  .AddHttpClientInstrumentation()
                  .AddSqlClientInstrumentation()
                  .AddZipkinExporter(zipkin =>
                  {
                    var zipkinUrl = configuration["ZIPKIN_URL"] ?? "http://zipkin:9411";
                    zipkin.Endpoint = new Uri($"{zipkinUrl}/api/v2/spans");
                  });
    });
    
  11. Нажмите клавиши CTRL+S, чтобы сохранить файл.

  12. В области терминала в нижней части перейдите в папку dotnet-observability/eShopLite.

    cd ..
    
  13. Обновите контейнеры приложений.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  14. Перейдите в папку dotnet-observability и запустите приложение с помощью Docker:

    cd ..
    docker compose up
    
  15. На вкладке "ПОРТЫ" выберите "Открыть в браузере для Prometheus" (9090). Если вы работаете локально в Visual Studio Code, откройте новую вкладку браузера и перейдите в приложение http://localhost:9411Zipkin.

  16. В меню выберите зависимости.

    Screenshot that shows Zipkin showing the dependencies of the eShopLite app Store sending requests to the Products service.

  17. В области ТЕРМИНАЛА нажмите клавиши CTRL+C, чтобы остановить приложение.

Добавление Application Insights

Последним шагом является добавление приложения Аналитика в приложение.

Создание ресурса приложения Аналитика в Azure

  1. В Visual Studio Code на панели терминалов войдите в Azure.

    az login --use-device-code
    
  2. Просмотрите выбранную подписку Azure.

    az account show -o table
    

    Если выбрана неправильная подписка, выберите правильную, используя команду az account set .

  3. Добавьте расширение для приложения Аналитика.

    az extension add -n application-insights
    
  4. Создайте ресурс Application Insights.

    az monitor app-insights component create --app eShopLiteInsights --location eastus --kind web -g eShopLite
    

    Вы должны увидеть следующий результат:

    {
      "appId": "fb6e1af0-7556-469d-a31f-85e4550c8fde",
      "applicationId": "eShopLiteInsights",
      "applicationType": "web",
      "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/",
      "creationDate": "2023-11-10T16:50:00.950726+00:00",
      "disableIpMasking": null,
      "etag": "\"3a02952a-0000-0100-0000-654e5f380000\"",
      "flowType": "Bluefield",
      "hockeyAppId": null,
      "hockeyAppToken": null,
      "id": "/subscriptions/7eebce2a-0884-4df2-8d1d-2a3c051e47fe/resourceGroups/eShopLite/providers/microsoft.insights/components/eShopLiteInsights",
      "immediatePurgeDataOn30Days": null,
      "ingestionMode": "ApplicationInsights",
      "instrumentationKey": "00000000-0000-0000-0000-000000000000",
      "kind": "web",
      "location": "eastus",
      "name": "eShopLiteInsights",
      "privateLinkScopedResources": null,
      "provisioningState": "Succeeded",
      "publicNetworkAccessForIngestion": "Enabled",
      "publicNetworkAccessForQuery": "Enabled",
      "requestSource": "rest",
      "resourceGroup": "eShopLite",
      "retentionInDays": 90,
      "samplingPercentage": null,
      "tags": {},
      "tenantId": "7eebce2a-0884-4df2-8d1d-2a3c051e47fe",
      "type": "microsoft.insights/components"
    }
    

    Из предыдущего возвращенного JSON скопируйте connectionStringфайл, за исключением ". Например:

    InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/

  5. В Visual Studio Code на панели обозревателя выберите файл docker-compose.yml .

  6. Вы добавляете переменную среды, которую использует проект диагностика для подключения к Приложению Аналитика. Добавьте этот YAML в службу Магазина :

    environment:
      - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
    

    Замените предыдущие строка подключения на ту, что вы скопировали из Azure CLI.

  7. Повторите эти действия для службы продуктов . Окончательный YAML должен выглядеть следующим образом:

      frontend:
        image: storeimage
        build:
          context: .
          dockerfile: ./eShopLite/Store/Dockerfile
        environment: 
          - ProductEndpoint=http://backend:8080
          - ZIPKIN_URL=http://zipkin:9411
          - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
        ports:
          - "32000:8080"
        depends_on: 
          - backend
          - prometheus
          - zipkin
    
      backend:
        image: productservice
        build: 
          context: .
          dockerfile: ./eShopLite/Products/Dockerfile
        environment: 
          - ZIPKIN_URL=http://zipkin:9411
          - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
    
    
  8. Нажмите клавиши CTRL+S, чтобы сохранить файл.

  9. На панели терминала перейдите в папку диагностики.

    cd .\eShopLite\Diagnostics\ 
    
  10. Добавьте пакет экспортера приложений Аналитика.

    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore --prerelease
    
  11. На панели "ОБЗОР" выберите папку "Диагностика", а затем выберите DiagnosticServiceCollectionExtensions.cs.

  12. В верхней части файла добавьте следующую using инструкцию:

    using Azure.Monitor.OpenTelemetry.AspNetCore;
    
  13. Ниже var otelBuilder = services.AddOpenTelemetry();добавьте следующий код:

    if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
    {
      otelBuilder.UseAzureMonitor();
    }
    
  14. Нажмите клавиши CTRL+S, чтобы сохранить файл.

  15. В области терминала в нижней части перейдите в папку dotnet-observability/eShopLite.

    cd ..
    
  16. Обновите контейнеры приложений.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  17. Перейдите в папку dotnet-observability и запустите приложение с помощью Docker:

    cd ..
    docker compose up
    
  18. Войдите в портал Azure с теми же учетными данными, которые вы использовали для входа в Azure CLI.

  19. На портале Azure выберите "Группы ресурсов".

  20. Выберите группу ресурсов eShopLite .

  21. Выберите ресурс Аналитика приложения eShopLite Аналитика.

  22. Выберите панель мониторинга приложения.

    Screenshot that shows Application Insights showing the health of the eShopLite app.

  23. Чтобы просмотреть изменения метрик, перейдите в eShopLite приложение и измените акции. Затем обновите панель мониторинга приложения Аналитика.

  24. В области ТЕРМИНАЛА нажмите клавиши CTRL+C, чтобы остановить приложение.