Упражнение. Использование данных OpenTelemetry в облачном приложении
В этом упражнении вы получите более высокую видимость всех данных, созданных OpenTelemetry в приложении. Вы завершите добавление диагностика возможности в службу Store. На этом месте вы добавите Prometheus и Grafana в eShopLite службы и посмотрите на некоторые метрики, которые фиксируются. Следующим шагом является добавление Zipkin и просмотр распределенных трассировок. Наконец, вы добавляете Application Insights в приложение и используете его для просмотра данных.
Добавление Prometheus и Grafana
Prometheus и Grafana предоставляют образы Docker, которые упрощают их добавление в проекты. Вы включаете их в файл docker-compose.yml в корне решения.
В Visual Studio Code на панели обозревателя выберите файл docker-compose.yml .
Добавьте этот 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 .
В Visual Studio Code на панели обозревателя щелкните правой кнопкой мыши папку dotnet-observability и выберите "Создать папку".
В поле имени введите prometheus.
В области обозревателя щелкните правой кнопкой мыши папку prometheus и выберите новый файл.
В поле имени введите prometheus.yml.
В редакторе файлов введите этот 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, имена узлов — это имена служб.
Нажмите клавиши CTRL+S, чтобы сохранить файл.
Настройка Grafana
Grafana необходимо настроить таким образом, чтобы он знал, где собирать метрики.
В Visual Studio Code на панели обозревателя щелкните правой кнопкой мыши папку dotnet-observability и выберите "Создать папку".
В поле имени введите grafana.
Щелкните правой кнопкой мыши папку grafana и выберите "Создать папку".
В поле имени введите источник данных.
Щелкните правой кнопкой мыши папку grafana и выберите "Создать папку".
В поле имени введите панель мониторинга.
Разверните папку grafana, щелкните правой кнопкой мыши папку источника данных и выберите новый файл.
В поле имени введите datasource.yml.
На вкладке редактора введите этот YAML:
apiVersion: 1 datasources: - name: Prometheus type: prometheus url: http://prometheus:9090 isDefault: true access: proxy editable: true
Предыдущий YAML настраивает Grafana для использования Prometheus в качестве источника данных.
Нажмите клавиши CTRL+S, чтобы сохранить файл.
Обновите приложение ASP.NET Core, чтобы предоставить метрики для Prometheus
Теперь проект диагностика настроен только для предоставления метрик консоли. Вместо этого вы обновите проект, чтобы предоставить метрики Prometheus.
В Visual Studio Code в нижней части области терминала перейдите в папку диагностики.
Выполните следующую команду:
cd .\eShopLite\Diagnostics\
OpenTelemetry.Exporter.Console
Удалите пакет:dotnet remove package OpenTelemetry.Exporter.Console
OpenTelemetry.Exporter.Prometheus.AspNetCore
Добавьте пакет:dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore --prerelease
В области обозревателя разверните папку диагностики и выберите DiagnosticServiceCollectionExtensions.cs.
Замените экспортер
.AddConsoleExporter();
консоли следующим кодом:.AddPrometheusExporter();
В нижней части файла до последнего
}
добавьте следующий код:public static void MapObservability(this IEndpointRouteBuilder routes) { routes.MapPrometheusScrapingEndpoint(); }
Этот код добавляет конечную точку очистки Prometheus в каждую службу, которая включает это с приложением. Это позволяет Prometheus сломать метрики
http://service/metrics
.Нажмите клавиши CTRL+S, чтобы сохранить файл.
Предоставление метрик в службе Store
В настоящее время приложение настроено только для предоставления метрик для службы "Продукты ". Вы также обновляете приложение, чтобы предоставить метрики для службы Магазина .
В области обозревателя решений щелкните правой кнопкой мыши проект Магазина и выберите "Добавить ссылку на проект".
Выберите Диагностика.
В области обозревателя разверните папку Store и выберите Program.cs.
В примечании
// Add observability code here
кода добавьте вызов метода диагностики:builder.Services.AddObservability("Store", builder.Configuration);
Перед методом
app.Run()
добавьте следующий код:app.MapObservability();
Этот метод добавляет конечную точку очистки Prometheus в службу Store .
Нажмите клавиши CTRL+S, чтобы сохранить файл.
В области обозревателя разверните папку Product и выберите Program.cs.
Перед методом
app.Run()
добавьте следующий код:app.MapObservability();
Этот метод добавляет конечную точку очистки Prometheus в службу products .
Нажмите клавиши CTRL+S, чтобы сохранить файл.
Тестирование новых функций наблюдаемости
Теперь вы протестируете новые функции наблюдаемости, добавленные в приложение.
В области терминала в нижней части перейдите в папку dotnet-observability/eShopLite.
cd ..
Обновите контейнеры приложений.
dotnet publish /p:PublishProfile=DefaultContainer
Перейдите в папку dotnet-observability и запустите приложение с помощью Docker:
cd .. docker compose up
На вкладке "ПОРТЫ" выберите "Открыть в браузере для Prometheus" (9090). Если вы работаете локально в Visual Studio Code, откройте браузер и на новой вкладке перейдите в приложение
http://localhost:9090
Prometheus.В верхнем меню выберите "Состояние " и выберите "Целевые объекты".
Вы увидите службы продуктов и магазинов , перечисленные как UP.
На вкладке "ПОРТЫ" выберите "Открыть в браузере для Grafana" (3000). Если вы работаете локально в Visual Studio Code, откройте браузер и на новой вкладке перейдите в приложение
http://localhost:3000
Grafana.Введите администратора имени пользователя.
Введите пароль grafana.
Выберите " Создать первую панель мониторинга".
Выберите " Импортировать панель мониторинга".
На новой вкладке перейдите на GitHub и откройте файл json панели мониторинга ASP.NET Core.
Скопируйте необработанный файл.
Вставьте JSON в текстовое поле импорта с помощью текстового поля модели JSON панели мониторинга.
Выберите Загрузить.
В раскрывающемся списке источника данных Prometheus выберите Prometheus.
Выберите Импорт.
Вы увидите панель мониторинга, на которой отображаются метрики для служб Продуктов и Магазинов . Выберите задание для изменения между двумя службами.
В области ТЕРМИНАЛА нажмите клавиши CTRL+C, чтобы остановить приложение.
Добавление Zipkin
Теперь вы расширяете возможности трассировки приложения, добавив Zipkin. Как и раньше, вы добавите в приложение контейнер Zipkin и настройте его для подключения к сборщику OpenTelemetry. Затем вы добавите в приложение экспортера Zipkin OpenTelemetry.
В Visual Studio Code на панели обозревателя выберите файл docker-compose.yml в папке dotnet-observability .
Добавьте
prometheus
иzipkin
вdepends_on
полеfrontend
для .depends_on: - backend - prometheus - zipkin
Добавьте
prometheus
вdepends_on
полеbackend
для .depends_on: - prometheus
Добавьте переменные среды для 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
Добавьте этот YAML в нижней части файла:
zipkin: image: openzipkin/zipkin ports: - 9411:9411
Предыдущий YAML добавляет в приложение контейнер Zipkin. Он настраивает контейнер Zipkin для реагирования на порт 9411.
Нажмите клавиши CTRL+S, чтобы сохранить файл.
На панели терминала перейдите в папку диагностики.
cd ./eShopLite/Diagnostics/
Добавьте пакеты экспорта Zipkin.
dotnet add package OpenTelemetry.Exporter.Zipkin --prerelease
В области обозревателя разверните папку диагностики и выберите DiagnosticServiceCollectionExtensions.cs.
В нижней части поставщиков трассировки добавьте 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"); }); });
Нажмите клавиши CTRL+S, чтобы сохранить файл.
В области терминала в нижней части перейдите в папку dotnet-observability/eShopLite.
cd ..
Обновите контейнеры приложений.
dotnet publish /p:PublishProfile=DefaultContainer
Перейдите в папку dotnet-observability и запустите приложение с помощью Docker:
cd .. docker compose up
На вкладке "ПОРТЫ" выберите "Открыть в браузере для Prometheus" (9090). Если вы работаете локально в Visual Studio Code, откройте новую вкладку браузера и перейдите в приложение
http://localhost:9411
Zipkin.В меню выберите зависимости.
В области ТЕРМИНАЛА нажмите клавиши CTRL+C, чтобы остановить приложение.
Добавление Application Insights
Последним шагом является добавление Application Insights в приложение.
Создание ресурса Application Insights в Azure
В Visual Studio Code на панели терминалов войдите в Azure.
az login --use-device-code
Просмотрите выбранную подписку Azure.
az account show -o table
Если выбрана неправильная подписка, выберите правильную, используя команду az account set .
Добавьте расширение для Application Insights.
az extension add -n application-insights
Создайте ресурс Application Insights.
az monitor app-insights component create --app eShopLiteInsights --location eastus --kind web -g eShopLite
Вы должны увидеть следующий результат:
{ "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "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/
В Visual Studio Code на панели обозревателя выберите файл docker-compose.yml .
Вы добавляете переменную среды, которую использует проект диагностика для подключения к Application Insights. Добавьте этот 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.
Повторите эти действия для службы продуктов . Окончательный 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/
Нажмите клавиши CTRL+S, чтобы сохранить файл.
На панели терминала перейдите в папку диагностики.
cd .\eShopLite\Diagnostics\
Добавьте пакет экспортера Application Insights.
dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore --prerelease
На панели "ОБЗОР" выберите папку "Диагностика", а затем выберите DiagnosticServiceCollectionExtensions.cs.
В верхней части файла добавьте следующую
using
инструкцию:using Azure.Monitor.OpenTelemetry.AspNetCore;
Ниже
var otelBuilder = services.AddOpenTelemetry();
добавьте следующий код:if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"])) { otelBuilder.UseAzureMonitor(); }
Нажмите клавиши CTRL+S, чтобы сохранить файл.
В области терминала в нижней части перейдите в папку dotnet-observability/eShopLite.
cd ..
Обновите контейнеры приложений.
dotnet publish /p:PublishProfile=DefaultContainer
Перейдите в папку dotnet-observability и запустите приложение с помощью Docker:
cd .. docker compose up
Войдите в портал Azure с теми же учетными данными, которые вы использовали для входа в Azure CLI.
На портале Azure выберите "Группы ресурсов".
Выберите группу ресурсов eShopLite .
Выберите ресурс eShopLiteInsights Application Insights.
Выберите панель мониторинга приложения.
Чтобы просмотреть изменения метрик, перейдите в eShopLite приложение и измените акции. Затем обновите панель мониторинга Application Insights.
В области ТЕРМИНАЛА нажмите клавиши CTRL+C, чтобы остановить приложение.