Реализация распределенной трассировки между несколькими службами​ в Power Platform

Распределенная трассировка — это метод, используемый для профилирования и мониторинга приложений, особенно приложений, созданных с использованием микросервисной архитектуры. Он позволяет отслеживать события в системе от одной службы к другой и получать сквозную диагностику производительности и задержки. Рекомендация Контекст трассировки W3C определяет, как информация о контексте передается и изменяется между службами в сценариях распределенной трассировки. В этой статье представлены практические приложения и варианты использования распределенной трассировки, а также объясняется, как реализовать ее в нескольких службах в Power Platform.

Идентификаторы трассировки

В стандарте контекста трассировки W3C каждой трассировке присваивается глобально уникальный 16-байтовый идентификатор trace-id. Каждому действию в трассировке назначается уникальный 8-байтовый идентификатор span-id. trace-id представляет транзакцию в целом, и span-id представляет отдельные операции в рамках этой транзакции. Каждое действие записывает trace-id, свой собственный span-id и span-id родительского действия, устанавливая отношения «родитель-потомок» между действиями.

В стандарте W3C traceparent — это заголовок, используемый для отслеживания запросов по мере их перемещения через различные сервисы или системы. Он содержит уникальный trace-id, parent-id, представляющий непосредственный вызывающий объект, и trace-flags для выборки решений.

Пример сценария

Рассмотрим пример, в котором браузер запускает транзакцию, взаимодействуют несколько микросервисов и выполняется вызов веб-API Dataverse:

Оригинал trace-id и span-id
Browser trace-parent: 00-11111111111111111111111111111111-2222222222222222-01
Kubernetes trace-parent: 00-11111111111111111111111111111111-3333333333333333-01
Dataverse trace-parent: 00-11111111111111111111111111111111-4444444444444444-01
  1. Браузер инициирует транзакцию: браузер отправляет запрос на веб-сервер. Запросу присваиваются trace-id и span-id, span-id-1.

  2. Взаимодействие с микрослужбами: веб-сервер обрабатывает запрос и выполняет вызов микрослужбы. Вызову присваивается новый span-id (span-id-2), и он сохраняет прежний trace-id. Микрослужба вызывает другую микрослужбу, создавая еще один span-id (span-id-3) и т. д. В каждом случае trace-id остается неизменным, но для каждой операции генерируется новый span-id.

  3. Вызов веб-API Dataverse: одна из микрослужб выполняет вызов веб-API Dataverse. Опять вызову присваивается новый span-id (span-id-4), и он сохраняет прежний trace-id.

trace-id и отношения типа "родители-потомки"

trace-id объединяет все транзакции с отношением "родитель-потомок". Каждый span-id представляет собой уникальную операцию в трассировке, и родительский span-id связывает их с его родительской операцией. Такая иерархическая структура позволяет отслеживать всю транзакцию от начального запроса до окончательного ответа, даже если она проходит через несколько служб и систем.

trace-id и сопоставление идентификаторов операций

Application Insights сопоставляет поле W3C trace-id с Operation Id, что позволяет легко запрашивать набор связанных действий, которые происходят в рамках сквозной трассировки.

Снимок экрана сопоставленного в Application Insights поля «Идентификатор операции».

Практическое применение и преимущества

Стандарт W3C Trace Context для распределенной трассировки предлагает несколько практических применений и преимуществ:

  • Сквозная видимость: контекст трассировки обеспечивает сквозную видимость транзакции, помогая понять, как запросы распространяются в системе.

  • Мониторинг производительности: позволяет отслеживать производительность отдельных служб и выявлять узкие места.

  • Диагностика ошибок: помогает диагностировать ошибки, отслеживая путь запроса и определяя, где происходят сбои.

  • Отслеживание зависимостей: позволяет отслеживать зависимости между службами и понимать, как они взаимодействуют.

Реализуя распределенную трассировку с помощью стандарта W3C Trace Context, вы можете получить ценную информацию о поведении приложения, повысить его производительность и улучшить общее взаимодействие с пользователем.

Потенциальные варианты использования

В следующей таблице описаны потенциальные варианты использования распределенной трассировки в Power Platform. Каждый пример использования иллюстрирует, как распределенная трассировка может применяться к различным сценариям, что позволяет отслеживать и диагностировать проблемы с производительностью в нескольких службах.

Пример Описание Примечания.
Автономный агент Событие данных активирует автономный агент. Возможно долгоживущая транзакция сохраняет родительский объект трассировки. Транзакция может пересекать несколько процессов и услуг, включая возможную передачу агенту по обслуживанию клиентов. Power Automate может запрашивать распределенную трассировку из подключаемого модуля Dataverse. На каждом шаге процесса добавляются данные телеметрии Application Insights. Вы можете запросить сквозную транзакцию в Application Insights или с помощью запросов KQL.
Транзакция конечного пользователя через Интернет, мобильное устройство или транзакция агента Пользователь запускает транзакцию для обновления данных клиента. Записи трассировки добавляются в Application Insights из сообщений запроса и трассировки от Dataverse. Служба Kubernetes запускает распределенную транзакцию. Он вызывает веб-API Dataverse для обновления сведений о клиенте.
Агент поддержки клиентов Клиент обращается в колл-центр. Оператор колл-центра использует Copilot в Dynamics 365 Customer Service и приложение на основе модели для обновления сведений о клиенте. Каждый компонент в обновлении выполняет запись в Application Insights. Транзакция начинается с оператора колл-центра. Приложение на основе модели запрашивает распределенную транзакцию из Dataverse.

Интеграция веб-API Dataverse

Давайте рассмотрим, как можно интегрировать веб-API Dataverse с контекстом трассировки W3C для распределенной трассировки.

Вызывающая служба инициирует трассировку с уникальными trace-id и span-id. Значение trace-parent может быть передано в веб-API либо в тексте запроса HTTP POST, либо как часть строки запроса HTTP, например:

  • Вариант 1: текст POST: postData(environmentUrl + "api/data/v9.0/" + customApiName, token, ...)
  • Вариант 2: строка запроса тега: postData(environmentUrl + "api/data/v9.0/" + customApiName + "?tag=01-0af...")

Используя любой из этих методов, вы можете настроить подключаемый модуль Dataverse для включения трассировки Application Insights, создания новых идентификаторов span-id и сообщений трассировки.

Интеграция с Dataverse

Теперь давайте рассмотрим, как реализовать этот шаблон с помощью общедоступных функций Dataverse.

Чтобы применить распределенную трассировку к вызовам веб-API Dataverse, выполните следующие действия:

  • Используйте сообщения Dataverse для расширения конвейера сообщений.
  • Создайте пользовательский API с подключаемыми модулями Dataverse, которые используют пакет SDK Application Insights для добавления необходимых отношений типа "родители-потомки".

Вызов из других служб Power Platform

Предположим, что вы хотите разрешить включение других служб Power Platform, таких как Copilot Studio, Power Apps или облачные потоки Power Automate, в общее решение распределенной трассировки. Рассмотрите возможность вызова функции из приложения, потока, кода или другой функции для вызова пользовательских API-интерфейсов Dataverse, как описано в этом разделе.

Сообщения Dataverse для сущностей или пользовательских API-интерфейсов

Можно определить пользовательские сообщения Dataverse, которые позволяют взаимодействовать с сущностями или пользовательскими API-интерфейсами в среде Dataverse. Сообщения Dataverse позволяют оптимизировать процессы управление данными и обеспечить бесшовную интеграцию с вашими потребностями в отслеживании. Подробнее см. в статье Создание собственных сообщений.

Добавление шагов в подключаемый модуль

После создания типа сообщения Dataverse или использования предопределенного типа сущности в среде используйте подключаемый модуль, чтобы настроить выполнение на разных этапах конвейера обработки данных и разрешить распределенную трассировку. Подробнее см. в статье Расширение бизнес-процессов с помощью подключаемых модулей.

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

  • Предварительная проверка: выполняется перед выполнением основной операции. Он проверяет данные и гарантирует, что они соответствуют требуемым критериям.

  • Предварительная операция: выполняется после шага предварительной проверки, но до выполнения основной операции. Он выполняет любую необходимую подготовку или изменение данных.

  • После операции: выполняется после выполнением основной операции. Он выполняет любую необходимую очистку или другие действия по результатам основной операции.

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

Небезопасные и защищенные значения конфигурации

Вы можете использовать поля Небезопасная конфигурация и Безопасная конфигурация в средстве регистрации подключаемых модулей для управления различными аспектами поведения подключаемого модуля.

  • Небезопасная конфигурация: небезопасные параметры видны всем пользователям и могут включать такие параметры, как уровень журнала, включение/отключение трассировки и другую неконфиденциальную информацию.

  • Безопасная конфигурация: параметры безопасности видны только пользователям с соответствующими разрешениями и могут включать конфиденциальную информацию, такую как строки подключения, ключи API и другие конфиденциальные данные.

В сценариях распределенной трассировки используйте поле Небезопасная конфигурация, чтобы указать, включена трассировка, и задать уровень ведения журнала. Используйте поле Безопасная конфигурация для хранения информации о строке подключения, необходимой подключаемому модулю.

Снимок экрана регистрации подключаемого модуля.

Дополнительные сведения: Регистрация подключаемого модуля.

Пользовательский API с параметрами запроса и ответа

Dataverse позволяет создавать и использовать пользовательские API-интерфейсы с определенными параметрами запроса и ответа в соответствии с потребностями приложения.

  • InputParameters: определение входных данных, необходимых для пользовательского API-интерфейса. Они могут включать различные типы данных, такие как строки, целые числа и сложные объекты.

  • OutputParameters: определение выходных данных, возвращаемых пользовательским API-интерфейсом. Они могут включать в себя различные типы и структуры данных, что позволяет предоставлять подробные и содержательные ответы потребителям API.

Снимок экрана регистрации пользовательского API-интерфейса.

Совет

Для распределенной трассировки можно пометить значение строки запроса тегом для передачи общей переменной из API-интерфейса.

Пользовательские шаги обработки (синхронные и асинхронные)

При использовании пользовательских шагов обработки можно указать, должны ли шаги выполняться синхронно или асинхронно. Такая гибкость позволяет оптимизировать производительность и скорость отклика приложения.

  • Синхронная обработка: шаги выполняются последовательно. Следующий шаг не начинается, пока не будет завершен текущий. Такой подход гарантирует, что каждый шаг будет завершен перед переходом к следующему.
  • Асинхронная обработка: шаги выполняются независимо. Следующий шаг может начаться до завершения текущего. Такой подход допускает параллельную обработку и может повысить общую производительность приложения.

Определив пользовательские шаги обработки, можно добавить мониторинг и другие функции к существующим сущностям или пользовательским сообщениям API, чтобы обеспечить эффективную и результативную работу приложения.

Подключаемые модули Dataverse на C#

Создавайте и развертывайте подключаемые модули Dataverse на C#, использующие пакет SDK Application Insights, для создания правильных отношений типа "родители-потомки" между службами. Дополнительные сведения: Создание подключаемого модуля.

Сравнение пользовательского подключаемого модуля и готового ILogger

Dataverse предоставляет готовый ILogger, который можно настроить на уровне среды. Встроенный ILogger предназначен для обеспечения стандартизированного механизма ведения журнала в различных средах, обеспечивая согласованность и простоту использования. Однако он может не обеспечивать такой же уровень детализации и настройки, как пользовательский подключаемый модуль ILogger.

Настраиваемый подключаемый модуль ILogger в Dataverse предлагает более детальные уровни информации, такие как трассировка, отладка и информация. Это позволяет разработчикам собирать более конкретные и релевантные данные во время выполнения подключаемых модулей. ILogger использует значения из запроса сообщения или параметра тега Share Variable для указания вызывающего родителя трассировки для лучшего отслеживания и корреляции журналов.

Подробнее см. в статье Запись телеметрии на ваш ресурс Application Insights с использованием ILogger.

Ключевые понятия C# для синтаксического анализа действия и указания идентификатора родителя

При использовании пользовательского подключаемого модуля ILogger важно понимать ключевые понятия C# для синтаксического анализа действий и указания родительского идентификатора. Ниже приведен пример создания нового действия для сообщения трассировки:

// Create a new activity for the trace message
var activity = new Activity("CustomActivity");
activity.SetParentId(traceParent);
activity.Start();
// Create a trace telemetry record
var traceTelemetry = new TraceTelemetry(message, ConvertLogLevel(level))
{
    Message = message,
    Context = { Operation = { ParentId = dependencyTelemetry.Id, Id = activity.Id } }
};
// Track the trace telemetry
telemetryClient.TrackTrace(traceTelemetry);

Совет

Пример проекта Dataverse OpenTelemetry содержит пример интеграции подключаемого модуля Dataverse с OpenTelemetry. OpenTelemetry — это набор стандартов, API, пакетов SDK и инструментов W3C, которые можно использовать для инструментирования, создания, сбора и экспорта данных телеметрии.

Соавторы

Microsoft поддерживает эту статью. Эту статью написали следующие участники.

Основные авторы: