分布式跟踪是一种用于剖析和监控应用程序(尤其是使用微服务架构构建的应用程序)的方法。 它允许您跟踪系统中的事件从一个服务到另一个服务,并检索有关性能和延迟的端到端诊断。 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
。
示例场景
让我们来看一个例子:浏览器启动事务,多个微服务交互,并调用 Dataverse Web API:
Source |
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
。调用 Dataverse Web API:其中一个微服务会调用 Dataverse Web API。 同样,该调用会被分配一个新的
span-id
(span-id-4),并保留相同的trace-id
。
trace-id 和父子关系
trace-id
以父子关系连接所有事务。 每个 span-id
代表跟踪中的一个唯一操作,父 span-id
将其与父操作相连。 这种分层结构允许您跟踪从初始请求到最终回复的整个事务,即使它遍历多个服务和系统也是如此。
跟踪标识和操作 ID 映射
Application Insights 将 W3C trace-id
字段映射到 Operation Id
,使您可以轻松查询作为端到端跟踪的一部分而发生的一系列相关操作。
实际应用和优势
用于分布式跟踪的 W3C Trace Context 标准提供了几个实际应用和优势:
端到端可见性:跟踪上下文可提供事务的端到端可见性,帮助您了解请求是如何在系统中传播的。
性能监控:它能让您监控单个服务的性能并找出瓶颈。
错误诊断:它通过跟踪请求路径和识别故障发生位置,帮助您诊断错误。
依赖跟踪:它允许您跟踪服务之间的依赖关系,并了解它们是如何交互的。
通过使用 W3C 跟踪上下文标准实施分布式跟踪,您可以获得有关应用程序行为的宝贵见解,提高其性能并增强整体用户体验。
可能的用例
下表列出了 Power Platform 中分布式跟踪的潜在用例。 每个用例都说明了如何将分布式跟踪应用于不同的场景,使您能够跨多个服务监视和诊断性能问题。
示例 | Description | 注释 |
---|---|---|
自主代理 | 数据事件会触发自治代理。 可能的长期事务会保留跟踪父级。 该交易可能跨越多个流程和服务,包括可能移交给客户服务代理。 | Power Automate 可以向 Dataverse 插件请求分布式跟踪。 流程的每一步都会添加 Application Insights 遥测数据。 您可以在 Application Insights 中或使用 KQL 查询来查询端到端事务。 |
最终用户 Web、移动或代理事务 | 用户启动事务以更新客户数据。 来自 Dataverse 的请求和跟踪消息会将跟踪条目添加到 Application Insights 中。 | Kubernetes 服务启动分布式事务。 它调用 Dataverse Web API 更新客户详细信息。 |
客户支持代理 | 客户联系呼叫中心。 呼叫中心接线员使用 Dynamics 365 Customer Service 中的 Copilot 和模型驱动应用来更新客户的详细信息。 更新中的每个组件都会写入 Application Insights。 | 交易从呼叫中心接线员开始。 模型驱动应用程序从 Dataverse 请求分布式事务。 |
Dataverse Web API 集成
让我们探讨一下 Dataverse Web API 如何与 W3C 跟踪上下文集成,以实现分布式跟踪。
调用服务使用唯一的 trace-id
和 span-id
启动跟踪。
trace-parent
值可以在 HTTP POST 请求正文中或作为 HTTP 查询字符串的一部分传递给 Web API;例如:
-
选项 1:帖子正文:
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 的一般可用功能实现这种模式。
将分布式跟踪应用于对 Dataverse Web API 的调用:
- 使用 Dataverse 消息扩展消息管道。
- 使用 Dataverse 插件创建自定义 API,使用 Application Insights SDK 添加所需的父子关系。
从其他 Power Platform 服务调用
假设您希望将其他 Power Platform 服务(如 Copilot Studio、Power Apps 或 Power Automate 云端流)纳入整个分布式跟踪解决方案。 请考虑从应用程序、流程、代码或其他函数中调用函数来调用 Dataverse 自定义 API,本节将对此进行讨论。
实体或自定义 API 的 Dataverse 消息
您可以定义自定义 Dataverse 消息,以便在 Dataverse 环境中与实体或自定义 API 交互。 Dataverse 消息可让您简化数据管理流程,确保与可观测性需求无缝集成。 了解更多信息,请参阅创建自己的消息。
为插件添加步骤
在环境中创建 Dataverse 消息类型或使用预定义实体类型后,可使用插件在数据处理管道的不同阶段配置执行,并允许分布式跟踪。 更多信息请参阅使用插件扩展业务流程。
管道阶段可包括预验证、操作前和操作后步骤。 通过向插件添加步骤,可以控制数据流并确保在正确的时间执行操作。
预验证:在执行主操作前进行。 它验证数据并确保其满足所需的条件。
操作前:发生在预验证步骤之后、主操作执行之前。 它对数据进行任何必要的准备或修改。
操作后:在执行主操作后发生。 它会根据主操作的结果执行必要的清理或其他操作。
您可以将插件配置为同步或异步执行这些步骤,具体取决于应用程序的要求。
不安全和安全配置值
您可以使用插件注册工具中的不安全配置和安全配置字段来控制插件行为的各个方面。
不安全配置:不安全设置对所有用户可见,可包括日志级别、启用/禁用跟踪等设置以及其他非敏感信息。
安全配置:安全设置仅对具有相应权限的用户可见,可包含敏感信息,如连接字符串、API 密钥和其他机密数据。
对于分布式跟踪场景,使用不安全配置字段管理是否开启跟踪并设置日志记录级别。 使用安全配置字段存储插件所需的连接字符串信息。
了解更多信息,请参阅注册插件。
具有请求和回复参数的自定义 API
通过 Dataverse,您可以创建和使用带有特定请求和响应参数的自定义 API 以满足应用程序的需求。
InputParameters
:定义自定义 API 所需的输入数据。 它们可以包括各种数据类型,例如字符串、整数和复杂对象。OutputParameters
:定义自定义 API 返回的输出数据。 它们可以包括各种数据类型和结构,允许您向 API 使用者提供详细且有意义的回复。
小费
对于分布式跟踪,您可以标记从 API 传递共享变量的查询字符串值。
自定义处理步骤(同步和异步)
使用自定义处理步骤时,您可以定义这些步骤是同步执行还是异步执行。 这种灵活性使您能够优化应用程序的性能和响应能力。
- 同步处理:步骤按顺序执行。 在当前步骤完成之前,下一步不会开始。 此方法可确保在继续下一步之前完成每个步骤。
- 异步处理:各步骤独立执行。 下一步可以在当前步骤完成之前开始。 此方法允许并行处理,并可以提高应用程序的整体性能。
通过定义自定义处理步骤,您可以向现有实体或自定义 API 消息添加监视和其他功能,从而确保应用程序高效运行。
Dataverse C# 插件
构建和部署 Dataverse C# 插件,使用 Application Insights SDK 在服务之间创建正确的父子关系。 更多信息请参阅编写插件。
自定义插件和开箱即用 ILogger 的比较
Dataverse 提供了一个开箱即用的 ILogger,可在环境级别进行配置。 内置的 ILogger 旨在提供跨不同环境的标准化日志记录机制,确保一致性和易用性。 但是,它可能无法提供与自定义插件 ILogger 相同的粒度和自定义级别。
Dataverse 中的自定义插件 ILogger 提供了更详细的信息级别,如跟踪、调试和信息。 它允许开发人员在插件执行期间捕获更具体和相关的数据。ILogger 使用消息请求或 Share Variable 标记参数中的值来指定调用跟踪父级,以便更好地跟踪和关联日志。
了解更多信息,请参阅使用 ILogger 将遥测信息写入 Application Insights 资源。
用于分析活动和指定父 ID 的关键 C# 概念
使用自定义插件 ILogger 时,必须了解用于分析活动和指定父 ID 的关键 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);
小费
DataverseOpenTelemetry 示例项目包含一个与 OpenTelemetry 集成的 Dataverse 插件示例。 OpenTelemetry 是 W3C 标准、API、SDK 和工具的集合,可用于检测、生成、收集和导出遥测数据。
参与者
Microsoft 维护这篇文章。 以下贡献者撰写了本文。
主要作者:
- Grant Archibald,高级项目经理