Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Распределенная трассировка — это метод, используемый для профилирования и мониторинга приложений, особенно приложений, созданных с использованием микросервисной архитектуры. Он позволяет отслеживать события в системе от одной службы к другой и получать сквозную диагностику производительности и задержки. Рекомендация Контекст трассировки 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 |
Браузер инициирует транзакцию: браузер отправляет запрос на веб-сервер. Запросу присваиваются
trace-idиspan-id, span-id-1.Взаимодействие с микрослужбами: веб-сервер обрабатывает запрос и выполняет вызов микрослужбы. Вызову присваивается новый
span-id(span-id-2), и он сохраняет прежнийtrace-id. Микрослужба вызывает другую микрослужбу, создавая еще одинspan-id(span-id-3) и т. д. В каждом случаеtrace-idостается неизменным, но для каждой операции генерируется новыйspan-id.Вызов веб-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, что позволяет легко запрашивать набор связанных действий, которые происходят в рамках сквозной трассировки.
Практическое применение и преимущества
Стандарт 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, чтобы обеспечить эффективную и результативную работу приложения.
Подключаемые модули 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 поддерживает эту статью. Эту статью написали следующие участники.
Основные авторы:
- Грант Арчибальд (Grant Archibald), старший менеджер программы